File size: 996 Bytes
56de343
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- 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;