SICP 4.4.1 Ex. 4.57

  • 投稿日:
  • カテゴリ:

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の劣化版というだけでもないのか。