2014-10-05 23 views
3

此編號來自SICP,3.3.5 Propagation of Constraints。我似乎無法弄清楚爲什麼process-forget-value需要呼叫process-new-value作爲最後一步。SICP:爲什麼過程遺忘值調用過程是新值?

該文字說,「這最後一步的原因是一個或多個連接器可能仍然有一個值(也就是說,連接器可能有一個不是由加法器最初設置的值),並且這些值可能需要通過加法器傳回。「

什麼是最簡單的約束網絡,可以證明爲什麼需要(process-new-value)?謝謝!

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

回答

2

這是我從加法器中刪除process-new-value的測試。你會看到這種行爲是不同的。

(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 

第二次也。正如他們所說,當adder1告訴b忘記其價值。 ac是常數仍會有一個值,並在adder2最後process-new-value,將重新建立b爲0。這樣,如果你使用的set-value!ac將工作。

相關問題