計算機プログラムの構造と解釈 第二版 P174 問題3.34

squarerを作ってみようという問題。


この欠点は、二乗を作るときにはちゃんと機能するんだけど、
反対向きにある数字の根を作ろうとすると失敗する。


なんでかって言うと、multiplierは2値設定されないと動かないようになっているからだ!


写経したやつを貼っておく。
constraint.scmは
http://d.hatena.ne.jp/unlearned/20100606/1275873184
と同様

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)
(use math.mt-random)

(load "./constraints.scm")

;;;
; 実行
;;;
(define (squarer a b)
  (multiplier a a b)
  'ok)

(define a (make-connector))
(define b (make-connector))

(squarer a b)

(probe "input" a)
(probe "squarer" b)


;; main
(define (main args)

  (print "(set-value! a 5 'user)")
  (set-value! a 5 'user)
  (newline)
  (newline)

  (print "(forget-value! a 'user)")
  (forget-value! a 'user)
  (newline)
  (newline)

  (print "(set-value! b 100 'user)")
  (set-value! b 100 'user)
  (newline)
  (newline)

  (print "(set-value! a 10 'user)")
  (set-value! a 10 'user)
  (newline)
  (newline)

  0)  


実行

(set-value! a 5 'user)

Probe: input = 5
Probe: squarer = 25

(forget-value! a 'user)

Probe: input = ?
Probe: squarer = ?

(set-value! b 100 'user)

Probe: squarer = 100

(set-value! a 10 'user)

Probe: input = 10

と、このようにうまくいかない。