2013年10月29日火曜日

開発環境

計算機プログラムの構造と解釈(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.68を解いてみる。

その他参考書籍

問題 4.68

reverse演算を実装する規則を定義。

(rule (append-to-form () ?y ?y))

(rule (append-to-form (?u . ?v) ?y (?u . ?z))
      (append-to-form ?v ?y ?z))

(rule (reverse () ()))

(rule (reverse (?u . ?v) ?y)
      (and (reverse ?v ?t)
           (append-to-form ?t (?u) ?y)))

(reverse (1 2 3) ?x)と(reverse ?x (1 2 3))がどうなるか手動で確認。

(reverse (1 2 3) ?x) について。

(reverse (1 . (2 3)) ?x)

(and (reverse (2 3) ?t)
     (append-to-form ?t (1) ?x))

;;
(reverse (2 . 3) ?t)

(and (reverse (3) ?u)
     (append-to-form ?u (2) ?t)))

;;
(reverse (3 . ()) ?u)

(and (reverse () ?v)
     (append-to-form ?v (3) ?u))

;; 遡っていくと
?v ()
?u (3)
?t (3 2)
?x (3 2 1)
;; よって
(reverse (1 2 3) (3 2 1))

(reverse ?x (1 2 3))について。

(1 2 3)は当然空「()」ではない。ということで(reverse (?u .?v) (1 2 3))の規則を満たすものを探索することになる。そして、このパターンにマッチするリストは無限に存在する。よって、(reverse ?x (1 2 3))は無限に走って探索することになる。(最初の、?vが(2 3)に束縛された場合と違い、?vに束縛される値が無限に存在するから無限にプログラムが走ることになる。)(その間に、規則を満たしたリストは出力される。)

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

0 コメント:

コメントを投稿