Ex. 4.57
「...person1の仕事をする誰かがperson-2の仕事が出来...」 ?(゚Д゚) 、、、これは、「person1の仕事はperson-2の仕事が出来る(can-do-job)」というだけのことでは、、、"誰か"さんまったく関係ないじゃん! 。というのは置いといて。
(rule (replaceable ?taro ?hana) (and (or (and (job ?taro ?sigoto) ;; taroズ と 仕事 の一覧 (job ?hana ?sigoto)) ;; taroズ と同じ仕事の hanaちゃんズ (and (job ?taro ?taro-sigoto) ;; taroズ と 仕事の一覧 (job ?hana ?hana-sigoto) ;; hanaちゃんズ と仕事の一覧 (can-do-job ?hana-sigoto ?taro-sigoto))) ;; 条件 hanaちゃんの仕事は taroより高級 (not (same ?taro ?hana))))
rule はデータベースのデータと同じ扱いなので、p.263のDBに混ぜておくこと。rule を Query input : に入力してもむだなので注意。(自分だ)。
ch4-query.scmソースだと (define microshaft-data-base... に混ぜておけばOK。
(あぁ、p.275 assert! を使うと、Query input : からDBの追加とかできんのね、、、12/4)
not に注意。notは論理演算子ではない。フィルターである。上の行で得たリストをフィルターするのが not の機能。なので
(and (not (xxx)) (...))
と not を先頭にもってくると null リストが返ってくる。
この rule の実行結果
;;; Query input: ;; a (replaceable (Fect Cy D) ?x) ;; Cy Dの仕事ができる人は? ;;; Query results: (replaceable (Fect Cy D) (Bitdiddle Ben)) (replaceable (Fect Cy D) (Hacker Alyssa P))
;;;; Query input: ;;b (and (replaceable ?x ?y) ;; 同じ仕事ができて (salary ?y ?y$) (salary ?x ?x$) (lisp-value < ?y$ ?x$)) ;; 給料の安い人 ;;; Query results: (and (replaceable (Warbucks Oliver) (Aull DeWitt)) (salary (Aull DeWitt) 25000) (salary (Warbucks Oliver) 150000) (lisp-value < 25000 150000)) (and (replaceable (Hacker Alyssa P) (Fect Cy D)) (salary (Fect Cy D) 35000) (salary (Hacker Alyssa P) 40000) (lisp-value < 35000 40000))
(改行はマニュアル)
(あれ? taroとhanaが逆か → http://eli.thegreenplace.net/2008/02/08/sicp-section-441/ まぁいいか。 )
ruleは、 SQL よりかなり高級な機能。SQLの劣化版というだけでもないのか。