(define nand-gate {number --> number --> number} 1 1 -> 0 _ _ -> 1) (define invert {number --> number} X -> (nand-gate X X)) (define and-gate {number --> number --> number} X Y -> (invert (nand-gate X Y))) (define or-gate {number --> number --> number} X Y -> (nand-gate (invert X) (invert Y))) (define and3-gate {number --> number --> number --> number} X Y Z -> (and-gate X (and-gate Y Z))) (define or3-gate {number --> number --> number --> number} X Y Z -> (or-gate X (or-gate Y Z))) (define or4-gate {number --> number --> number --> number --> number} W X Y Z -> (or-gate (or-gate W X) (or-gate Y Z))) (define add {number --> number --> number --> number} A B C -> (or4-gate (and3-gate (invert A) (invert B) C) (and3-gate (invert A) B (invert C)) (and3-gate A (invert B) (invert C)) (and3-gate A B C))) (define carry {number --> number --> number --> number} A B C -> (or3-gate (and-gate B C) (and-gate A C) (and-gate A B))) (define add-and-carry {number --> number --> number --> (list number)} A B C -> [(add A B C) (carry A B C)]) (define get-write {(list number) --> number} [Write _] -> Write) (define get-carry {(list number) --> number} [_ Carry] -> Carry) (define nybble-adder {(list number) --> (list number) --> (list number)} [A B C D] [W X Y Z] -> (let Add1 (add-and-carry D Z 0) Carry1 (get-carry Add1) Write1 (get-write Add1) Add2 (add-and-carry C Y Carry1) Carry2 (get-carry Add2) Write2 (get-write Add2) Add3 (add-and-carry B X Carry2) Carry3 (get-carry Add3) Write3 (get-write Add3) Add4 (add-and-carry A W Carry3) Write4 (get-write Add4) [Write4 Write3 Write2 Write1]))