(wat-aro)

生きてます

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))