| -- gates.nf — All standard gates from NAND alone | |
| -- NOT, AND, OR, XOR — each built purely from NAND | |
| module gates; | |
| -- NOT x = x NAND x | |
| def not(x) = (x | x); | |
| -- AND x y = NOT (x NAND y) | |
| def and(x y) = not((x | y)); | |
| -- OR x y = (NOT x) NAND (NOT y) | |
| def or(x y) = (not(x) | not(y)); | |
| -- XOR x y = (x NAND (x NAND y)) NAND (y NAND (x NAND y)) | |
| def xor(x y) = ((x | (x | y)) | (y | (x | y))); | |
| -- Proofs: derived gates are correct | |
| prove not_true: not(true) = false; | |
| prove not_false: not(false) = true; | |
| prove and_tt: and(true true) = true; | |
| prove and_tf: and(true false) = false; | |
| prove and_ft: and(false true) = false; | |
| prove and_ff: and(false false) = false; | |
| prove or_tt: or(true true) = true; | |
| prove or_tf: or(true false) = true; | |
| prove or_ft: or(false true) = true; | |
| prove or_ff: or(false false) = false; | |
| prove xor_tt: xor(true true) = false; | |
| prove xor_tf: xor(true false) = true; | |
| prove xor_ft: xor(false true) = true; | |
| prove xor_ff: xor(false false) = false; | |