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)