2013年10月30日水曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の4(超言語的抽象)、4.4(論理型プログラミング)、4.4.3(論理型プログラミングは数学的論理か)、無限ループ、notに関する問題、問題 4.69を解いてみる。

その他参考書籍

問題 4.69

孫の関係に「great[孫の子]」を追加する規則を公安。

;; データベース
(son Adam Cain)
(son Cain Enoch)
(son Enoch Irad)
(son Irad Mehujael)
(son Mehujael Methushael)
(son Methushael Lamech)
(wife Lamech Ada)
(son Ada Jabal)
(son Ada Jubal)

;; 孫を見つけるための規則を形式化
(rule (grandson ?g ?s)
      (and (son ?f ?s)
           (son ?g ?f)))

;; 息子を見つける規則を形式化
(rule (son ?m ?s)
      (or (son ?m ?s)
          (and (wife ?m ?w)
               (son ?w ?s))))

;; リストの最後が語grandsonで終わるかどうか見る規則last
(rule (last (grandson)))

(rule (last (?u . ?v))
      (last ?v))

;; 孫の子
(rule ((grandson) ?x ?y)
      (grandson ?x ?y))

;; 孫の子の子の…
(rule ((great . ?rel) ?x ?y)
      (and (son ?x ?z)
           (?rel ?z ?y)
           (last ?rel)))

出来た規則をScheme - 推論的情報検索(データベースと複雑な関係を推論する規則)の確認結果等も使いながら、((great grandson) ?g ?ggs)と(?relationship Adm Irad)の2つの質問で手動で確認。

;; Cainの孫の子
;; ?xに値Cabinを束縛
((great grandson) Cabin ?y)
(and (grandson Cabin ?z)
     (son ?z ?y))

;; ?zに値Mehujaelを束縛
((great grandson) Cabin ?y)
(and (grandson Cabin Mehujael)
     (son Mehujael ?y))

;; ?yに値Methushaelを束縛
((great grandson) Cabin Methushael)
(and (grandson Cabin Mehujael)
     (son Mehujael Methushael))

;; よってCabinの孫の子はMethushael

;; AdamとIradの関係
;; ?xに値Adam、?yに値Iradを束縛
((great . ?rel) Adam Irad)
(and (son Adam ?z)
     (?rel ?z Irad)
     (last ?rel))

;; ?zに値Cainを束縛
((great . ?rel) Adam Irad)
(and (son Adam Cain)
     (?rel Cain Irad)
     (last ?rel))

;; ?relに(grandson)を束縛して、
((great . (grandson)) Adam Irad)
(and (son Adam Cain)
     ((grandson) Cain Irad)
     (last (grandson)))

((great grandson) Adam Irad)
(and (son Adam Cabin)
     ((grandson) Cain Irad)
     (last (grandson)))

;; よって、AZdamの孫の子はIrad

とりあえず、2つの質問は正しい結果を導き出すことを確認できた。

質問システムの実装はまだ(この先に実装もあるみたい)なので、実装できたら入出力結果を確認してみることに。

0 コメント:

コメントを投稿