| -- half_adder.nf — Binary addition from NAND | |
| -- sum = XOR(a, b), carry = AND(a, b) | |
| module half_adder; | |
| def not(x) = (x | x); | |
| def and(x y) = not((x | y)); | |
| def xor(x y) = ((x | (x | y)) | (y | (x | y))); | |
| def sum(a b) = xor(a b); | |
| def carry(a b) = and(a b); | |
| -- 0 + 0 = 00 | |
| prove sum_00: sum(false false) = false; | |
| prove carry_00: carry(false false) = false; | |
| -- 0 + 1 = 01 | |
| prove sum_01: sum(false true) = true; | |
| prove carry_01: carry(false true) = false; | |
| -- 1 + 0 = 01 | |
| prove sum_10: sum(true false) = true; | |
| prove carry_10: carry(true false) = false; | |
| -- 1 + 1 = 10 | |
| prove sum_11: sum(true true) = false; | |
| prove carry_11: carry(true true) = true; | |