Ex. 4.60
(lives-near (Hacker Alyssa P) (Fect Cy D)) (lives-near (Fect Cy D) (Hacker Alyssa P))
理由は、どっちもパターンを満足するからである。
解決案 : 「人名がアルファベット順にならぶ」という条件でフィルタする
;;; Query input: (and (lives-near ?p1 ?p2) (lisp-value person< ?p1 ?p2)) ;; アルファベット順のもののみ ;;; Query results: (and (lives-near (Aull DeWitt) (Reasoner Louis)) (lisp-value person< (Aull DeWitt) (Reasoner Louis))) (and (lives-near (Aull DeWitt) (Bitdiddle Ben)) (lisp-value person< (Aull DeWitt) (Bitdiddle Ben))) (and (lives-near (Fect Cy D) (Hacker Alyssa P)) (lisp-value person< (Fect Cy D) (Hacker Alyssa P))) (and (lives-near (Bitdiddle Ben) (Reasoner Louis)) (lisp-value person< (Bitdiddle Ben) (Reasoner Louis)))
"person<" 関数は親Schemeで定義しておく。
;; 親Schemeで定義 (define (person->string a1) (if (null? a1) "" (string-append (symbol->string (car a1)) (person->string (cdr a1))))) (define (person< p1 p2) (string<? (person->string p1) (person->string p2)))