Tuesday, September 15, 2009

Ex-3.33

code from book for constraint network.
(define (averager a1 a2 av)
(define (process-new-value)
(cond ((and (has-value? a1) (has-value? a2))
(set-value! av
(/
(+ (get-value a1) (get-value a2))
2) me))
((and (has-value? a1) (has-value? av))
(set-value! a2
(- (* 2 (get-value av)) (get-value a1))
me))
((and (has-value? a2) (has-value? av))
(set-value! a1
(- (* 2 (get-value av)) (get-value a2))
me))))
(define (process-forget-value)
(forget-value! av me)
(forget-value! a1 me)
(forget-value! a2 me)
(process-new-value))
(define (me request)
(cond ((eq? request 'I-have-a-value)
(process-new-value))
((eq? request 'I-lost-my-value)
(process-forget-value))
(else
(error "Unknown request -- AVERAGER" request))))
(connect a1 me)
(connect a2 me)
(connect av me)
me)

;;Test
(define A (make-connector))
(define B (make-connector))
(define C (make-connector))
(probe "A" A)
(probe "B" B)
(probe "C" C)
(averager A B C)

(set-value! A 2 'user)
;Probe: A = 2
;Value: done
(set-value! B 4 'user)
;Probe: C = 3
;Probe: B = 4
;Value: done
(forget-value! A 'user)
;Probe: C = ?
;Probe: A = ?
;Value: done
(set-value! C 8 'user)
;Probe: A = 12
;Probe: C = 8
;Value: done
(forget-value! B 'user)
;Probe: A = ?
;Probe: B = ?
;Value: done
(forget-value! C 'user)
;Probe: C = ?
;Value: done
(set-value! A 4 'user)
;Probe: A = 4
;Value: done
(ser-value! C 10 'user)
;Probe: B = 16
;Probe: C = 10
;Value: done

No comments:

Post a Comment