問題4.71 – SICP(計算機プログラムの構造と解釈)その243
2009年08月13日
問題4.71
;;;; 評価機での simple-query 手続き (define (simple-query query-pattern frame-stream) (stream-flatmap (lambda (frame) (stream-append-delayed (find-assertions query-pattern frame) (delay (apply-rules query-pattern frame)))) frame-stream)) ;;;; Louis Reasoner の考えた simple-query 手続き (define (simple-query query-pattern frame-stream) (stream-flatmap (lambda (frame) (stream-append (find-assertions query-pattern frame) (apply-rules query-pattern frame))) frame-stream)) ;;;; 評価器での disjoin 手続き (define (disjoin disjuncts frame-stream) (if (empty-disjunction? disjuncts) the-empty-stream (interleave-delayed (qeval (first-disjunct disjuncts) frame-stream) (delay (disjoin (rest-disjuncts disjuncts) frame-stream))))) ;;;; Louis Reasoner の考えた disjoin 手続き (define (disjoin disjuncts frame-stream) (if (empty-disjunction? disjuncts) the-empty-stream (interleave (qeval (first-disjunct disjuncts) frame-stream) (disjoin (rest-disjuncts disjuncts) frame-stream))))
ループが遅延しないと問題が発生する場合を考える。
(assert! (loop 1 2)) (assert! (rule (loop ?x ?y) (loop ?y ?x))) (loop 1 ?y)
Louis Reasoner の単純な定義では、遅延評価されないために評価がすべて完了するまで何も印字されない。
無限ループになる質問の場合には、何も印字されずに無限ループに陥る。
;;; Query input: (assert! (loop 1 2)) Assertion added to data base. ;;; Query input: (assert! (rule (loop ?x ?y) (loop ?y ?x))) Assertion added to data base. ;;; Query input: (loop 1 ?y)
delay
演算を使用している評価器では、評価結果が印字されながら次の質問の処理が行われる。
無限ループになる質問では、評価結果が延々と印字され続ける。
;;; Query input:
(assert! (loop 1 2))
Assertion added to data base.
;;; Query input:
(assert! (rule (loop ?x ?y)
(loop ?y ?x)))
Assertion added to data base.
;;; Query input:
(loop 1 ?y)
(loop 1 2)
(loop 1 2)
(loop 1 2)
(loop 1 2)
(loop 1 2)
(loop 1 2)
(loop 1 2)
(loop 1 2)
無限ループ...
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542