When the input wire changes the logic gate may incorrectly determine that the output signal is unchanged and stop propagating the signal change, if the output signal was not initialized by running the action procedure immediately. (define (set-my-signal! new-value) (if (not (= signal-value new-value)) ; If signal is not initialized, then (begin ; it might have the same value and (set! signal-value new-value) ; the action procedures will not be (call-each action-procedures)) ; called to propagate the changes 'done)) ; further. Example: (define (half-adder a b s c) (let ((d (make-wire)) (e (make-wire))) (or-gate a b d) (and-gate a b c) (inverter c e) (and-gate d e s) 'ok)) (define a (make-wire)) (define b (make-wire)) (define s (make-wire)) (define c (make-wire)) (probe 'sum s) ; Probes no longer print the initial values of wires (probe 'carry c) ; only the changes. (half-adder a b s c) ; a = b = s = c = d = e* = 0 because none of the procedures were run. ; e should equal 1 because e = logical-not c. ; * = incorrect (set-signal! a 1) (propagate) ; a = d = 1, b = c = s* = e* = 0. ; e still has an incorrect signal because c did not change and thus it did not ; change. ; s has an incorrect signal because s is partly determined by e which has an ; incorrect signal. ; * = incorrect (set-signal! b 1) (propagate) ; a = b = c = d = 1, s = e = 0. ; c is correctly updated, because it had the correct initial signal. ; e has the correct signal now. Because e did not change signal and d did not ; change (and-gate d e s) does not set s. s maintains its previous signal ; which is now correct and because s's signal does not change the probe does ; print its value. The output of the simulation is: carry 11 New-value = 1 Instead of: sum 0 New-value = 0 carry 0 New-value = 0 sum 8 New-value = 1 carry 11 New-value = 1 sum 16 New-value = 0