Scheme SICP:为什么流程忘记值调用流程新值?

Scheme SICP:为什么流程忘记值调用流程新值?,scheme,lisp,constraints,sicp,Scheme,Lisp,Constraints,Sicp,此代码来自SICP。我似乎不明白为什么处理忘记值需要调用处理新值作为最后一步 正文说,“最后一步的原因是,一个或多个连接器可能仍然有一个值(也就是说,一个连接器可能有一个最初不是由加法器设置的值),这些值可能需要通过加法器传回。” 最简单的约束网络是什么,可以说明为什么需要(处理新值)?谢谢 (define (adder a1 a2 sum) (define (process-new-value) (cond ((and (has-value? a1) (has-value? a2)

此代码来自SICP。我似乎不明白为什么
处理忘记值
需要调用
处理新值
作为最后一步

正文说,“最后一步的原因是,一个或多个连接器可能仍然有一个值(也就是说,一个连接器可能有一个最初不是由加法器设置的值),这些值可能需要通过加法器传回。”

最简单的约束网络是什么,可以说明为什么需要
(处理新值)
?谢谢

(define (adder a1 a2 sum)
  (define (process-new-value)
    (cond ((and (has-value? a1) (has-value? a2))
           (set-value! sum
                       (+ (get-value a1) (get-value a2))
                       me))
          ((and (has-value? a1) (has-value? sum))
           (set-value! a2
                       (- (get-value sum) (get-value a1))
                       me))
          ((and (has-value? a2) (has-value? sum))
           (set-value! a1
                       (- (get-value sum) (get-value a2))
                       me))))

  (define (process-forget-value)
    (forget-value! sum me)
    (forget-value! a1 me)
    (forget-value! a2 me)
    (process-new-value))  ;;; * WHY * ???

  (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 -- ADDER" request))))

  (connect a1 me)
  (connect a2 me)
  (connect sum me)
  me)

这是我从加法器中删除
处理新值
所做的测试。您将看到行为是不同的

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

(constant 10 a)
(constant 10 c)
(constant 10 d)

(define adder1 (adder a b c))
(define adder2 (adder a b d))

> (has-value? b)
#t

> (get-value b)
0

> (forget-value! b adder1)
'done    

> (has-value? b)
#f
如果使用正确的版本执行此操作

> (has-value? b)
#t
第二次也是。正如他们所说,当加法器1告诉b忘记它的值<代码>a和
c
作为常量仍将有一个值,而
adder2
中最后一个
处理新值
将再次将
b
设置为0。如果您使用
设置值,这也会起作用用于
a
c