2016/01/15
SICP 問題 4.53
permanent-set!でpairsに成功する組み合わせを束縛するが,
(amb)で必ず失敗するので全ての成功する組み合わせをpairsに束縛する.
失敗継続が呼ばれ,if-failの第二引数のpairsが評価される.
この時permanent-set!で束縛されているのでバックトラックで戻らず,今まで代入した成功パターンすべてが表示される.
;;; Amb-Eval input:
(let ((pairs '()))
(if-fail (let ((p (prime-sum-pair '(1 3 5 8) '(20 35 110))))
(permanent-set! pairs (cons p pairs))
(amb))
pairs))
;;; Starting a new problem
;;; Amb-Eval value:
;;; Amb-Eval value:
((8 35) (3 110) (3 20))