SICP 読み (226) 4.3.3 amb 評価器の実装

継続をどうやって持ち回っているんだろうか。頭がコンガラがってますよ。もう少しソース読んでみます。

えーと、amb な評価器で試してみた所、

;;; Amb-Eval input:
(define x (amb 1 2 3))

;;; Starting a new problem 
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
x

;;; Starting a new problem 
;;; Amb-Eval value:
1

;;; Amb-Eval input:
(amb)

;;; Starting a new problem 
;;; There are no more values of
(amb)

;;; Amb-Eval input:
x

;;; Starting a new problem 
;;; Amb-Eval value:
1

;;; Amb-Eval input:

これって ambeval に渡す一連の手続き群の中で継続の持ち回り、なのか。いや、こうしたら try-again できるな。

;;; Amb-Eval input:
(list (amb 1 2 3) (amb 1 2 3))

;;; Starting a new problem 
;;; Amb-Eval value:
(1 1)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(1 2)

;;; Amb-Eval input:

何が違うのだ、と。

続々

driver-loop をニラんでたら見つけた。失敗な継続を internal-loop に渡している。どんな試験書けば良いのだろうか。それとも試験って不可能??

続続々

成功な継続で assert すりゃ良いのだろうか。

   ("success continuation"
    (let ((env (setup-environment)))
      (assert-equal 'ok ((analyze-definition '(define x '())) 
			 env
			 (lambda (v f) v)
			 (lambda () 'failed)))
      (assert-equal '() ((analyze 'x)
			 env
			 (lambda (v f) v)
			 (lambda () 'failed)))
      (let ((success (lambda (val next-alt)
		       (assert-equal 'ok val)
		       (assert-equal 3 ((analyze 'x)
					env
					(lambda (v f) v)
					(lambda () 'failed)))
		       (next-alt)
		       (assert-equal '() ((analyze 'x)
					  env
					  (lambda (v f) v)
					  (lambda () 'failed))))))
	((analyze-assignment '(set! x 3))
			     env
			     success
			     (lambda () 'failed))
	)
      )
    )

試験にはパスしている模様。でも試験見ただけでは意味不明かなぁ。複数のセットが巻き戻るナニはどうなってるのだろうか。これは次の_Procedure applications_の項で確認した方が良さげかも。