Implement "beta-reduce a term" and improve tests.
Chris Pressey
3 years ago
8 | 8 | -- (should really be unit tests; for now, run them manually) |
9 | 9 | -- |
10 | 10 | |
11 | test1 = app (abs "n" (var "n")) (var "n") | |
11 | testVar = (var "n") | |
12 | testAbs = (abs "n" (var "n")) | |
13 | testApp = app testAbs testVar | |
12 | 14 | |
13 | 15 | testDestruct t = destruct t |
14 | 16 | (\n -> "var:" ++ (show n)) |
19 | 21 | test2b = testDestruct (app (var "n") (var "m")) |
20 | 22 | test2c = testDestruct (abs "n" (var "n")) |
21 | 23 | |
22 | test3a = freevars test1 | |
23 | test3b = freevars (app (var "n") (var "n")) | |
24 | test3a = (freevars testApp) == ["n"] | |
25 | test3b = (freevars testAbs) == [] | |
26 | test3c = (freevars (app (var "n") (var "n"))) == ["n"] | |
24 | 27 | |
25 | test4a = resolve (test1) (var "q") -- test1 is not an abs so no change | |
26 | test4b = resolve (abs "n" (var "m")) (var "q") | |
27 | test4c = resolve (abs "n" (var "n")) (var "q") | |
28 | test4a = (show $ resolve (testApp) (var "q")) == "App (Abs (BoundVar 0)) (FreeVar \"n\")" | |
29 | test4b = (show $ resolve (abs "n" (var "m")) (var "q")) == "FreeVar \"m\"" | |
30 | test4c = (show $ resolve (abs "n" (var "n")) (var "q")) == "FreeVar \"q\"" | |
28 | 31 | |
29 | 32 | -- |
30 | 33 | -- Name supply |
64 | 67 | contains j t' names' |
65 | 68 | ) |
66 | 69 | |
67 | testContains1 = contains "n" test1 names -- True | |
68 | testContains2 = contains "m" test1 names -- False | |
69 | testContains3 = contains "n" (abs "n" (var "n")) names -- False | |
70 | testContains1 = (contains "n" testApp names) == True | |
71 | testContains2 = (contains "m" testApp names) == False | |
72 | testContains3 = (contains "n" (abs "n" (var "n")) names) == False | |
73 | ||
74 | -- | |
75 | -- "beta-reduce a term" example | |
76 | -- | |
77 | ||
78 | beta t = destruct t | |
79 | (\n -> var n) | |
80 | (\u v -> destruct u | |
81 | (\_ -> app u v) | |
82 | (\_ _ -> app u v) | |
83 | (\u -> resolve u v) | |
84 | ) | |
85 | (\u -> u) | |
86 | ||
87 | testBeta1 = (show $ beta testApp) == "FreeVar \"n\"" | |
88 | testBeta2 = (show $ beta testAbs) == "Abs (BoundVar 0)" |