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)))