SICP 4.4.1 Ex. 4.60

  • 投稿日:
  • カテゴリ:

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