|
32 | 32 | (define-language Lambda
|
33 | 33 | (e ::=
|
34 | 34 | x
|
35 |
| - (lambda (x_!_ ...) e) |
36 |
| - (e e ...)) |
| 35 | + (lambda (x) e) |
| 36 | + (e e)) |
37 | 37 | (x ::= variable-not-otherwise-mentioned))
|
38 | 38 |
|
39 | 39 | (define lambda? (redex-match? Lambda e))
|
40 | 40 |
|
41 | 41 | (module+ test
|
42 | 42 | (define e1 (term y))
|
43 | 43 | (define e2 (term (lambda (y) y)))
|
44 |
| - (define e3 (term (lambda (x y) y))) |
| 44 | + (define e3 (term (lambda (x) (lambda (y) y)))) |
45 | 45 | (define e4 (term (,e2 e3)))
|
46 | 46 |
|
47 | 47 | (test-equal (lambda? e1) #true)
|
48 | 48 | (test-equal (lambda? e2) #true)
|
49 | 49 | (test-equal (lambda? e3) #true)
|
50 | 50 | (test-equal (lambda? e4) #true)
|
51 | 51 |
|
52 |
| - (define eb1 (term (lambda (x x) y))) |
53 |
| - (define eb2 (term (lambda (x y) 3))) |
| 52 | + (define eb1 (term (lambda () y))) |
| 53 | + (define eb2 (term (lambda (x) (lambda (y) 3)))) |
54 | 54 |
|
55 | 55 | (test-equal (lambda? eb1) #false)
|
56 | 56 | (test-equal (lambda? eb2) #false))
|
|
74 | 74 | (module+ test
|
75 | 75 | (test-equal (term (=α (lambda (x) x) (lambda (y) y))) #true)
|
76 | 76 | (test-equal (term (=α (lambda (x) (x 1)) (lambda (y) (y 1)))) #true)
|
77 |
| - (test-equal (term (=α (lambda (x) x) (lambda (y) z))) #false)) |
| 77 | + (test-equal (term (=α (lambda (x) x) (lambda (y) z))) #false) |
| 78 | + (test-equal (term (=α (lambda (x) x) (lambda (x) (lambda (x) x)))) #false) |
| 79 | + (test-equal (term (=α (lambda (x) x) (lambda (x) (x x)))) #false) |
| 80 | + (test-equal (term (=α (lambda (x) (lambda (y) (x y))) (lambda (x) (lambda (y) (y x))))) #false) |
| 81 | + (test-equal (term (=α (lambda (x) (lambda (y) (x y))) (lambda (a) (lambda (b) (a b))))) #true)) |
78 | 82 |
|
79 | 83 | (define-metafunction Lambda
|
80 | 84 | =α : any any -> boolean
|
|
92 | 96 |
|
93 | 97 | (module+ test
|
94 | 98 | (define sd1 (term (K 1)))
|
95 |
| - (define sd2 (term 1)) |
96 | 99 |
|
97 | 100 | (test-equal (SD? sd1) #true))
|
98 | 101 |
|
99 | 102 | (define-metafunction SD
|
100 | 103 | sd : any -> any
|
101 |
| - [(sd any_1) (sd/a any_1 ())]) |
| 104 | + [(sd any) (sd/a any ())]) |
102 | 105 |
|
103 | 106 | (module+ test
|
104 | 107 | (test-equal (term (sd/a x ())) (term x))
|
105 |
| - (test-equal (term (sd/a x ((y) (z) (x)))) (term (K 2 0))) |
| 108 | + (test-equal (term (sd/a x (y z x))) (term (K 2))) |
106 | 109 | (test-equal (term (sd/a ((lambda (x) x) (lambda (y) y)) ()))
|
107 |
| - (term ((lambda () (K 0 0)) (lambda () (K 0 0))))) |
| 110 | + (term ((lambda (K 0)) (lambda (K 0))))) |
108 | 111 | (test-equal (term (sd/a (lambda (x) (x (lambda (y) y))) ()))
|
109 |
| - (term (lambda () ((K 0 0) (lambda () (K 0 0)))))) |
110 |
| - (test-equal (term (sd/a (lambda (z x) (x (lambda (y) z))) ())) |
111 |
| - (term (lambda () ((K 0 1) (lambda () (K 1 0))))))) |
| 112 | + (term (lambda ((K 0) (lambda (K 0)))))) |
| 113 | + (test-equal (term (sd/a (lambda (z) (lambda (x) (x (lambda (y) z)))) ())) |
| 114 | + (term (lambda (lambda ((K 0) (lambda (K 2)))))))) |
112 | 115 |
|
113 | 116 | (define-metafunction SD
|
114 |
| - sd/a : any ((x ...) ...) -> any |
115 |
| - [(sd/a x ((x_1 ...) ... (x_0 ... x x_2 ...) (x_3 ...) ...)) |
| 117 | + sd/a : any (x ...) -> any |
| 118 | + [(sd/a x (x_1 ... x x_2 ...)) |
116 | 119 | ;; bound variable
|
117 |
| - (K n_rib n_pos) |
118 |
| - (where n_rib ,(length (term ((x_1 ...) ...)))) |
119 |
| - (where n_pos ,(length (term (x_0 ...)))) |
120 |
| - (where #false (in x (x_1 ... ...)))] |
121 |
| - [(sd/a (lambda (x ...) any_1) (any_rest ...)) |
122 |
| - (lambda () (sd/a any_1 ((x ...) any_rest ...)))] |
123 |
| - [(sd/a (any_fun any_arg ...) (any_rib ...)) |
124 |
| - ((sd/a any_fun (any_rib ...)) (sd/a any_arg (any_rib ...)) ...)] |
125 |
| - [(sd/a any_1 any) |
126 |
| - ;; free variable, constant, etc |
| 120 | + (K n) |
| 121 | + (where n ,(length (term (x_1 ...)))) |
| 122 | + (where #false (in x (x_1 ...)))] |
| 123 | + [(sd/a (lambda (x) any_body) (x_rest ...)) |
| 124 | + (lambda (sd/a any_body (x x_rest ...))) |
| 125 | + (where n ,(length (term (x_rest ...))))] |
| 126 | + [(sd/a (any_fun any_arg) (x_rib ...)) |
| 127 | + ((sd/a any_fun (x_rib ...)) (sd/a any_arg (x_rib ...)))] |
| 128 | + [(sd/a any_1 (x ...)) |
| 129 | + ;; free variable or constant, etc |
127 | 130 | any_1])
|
128 | 131 |
|
129 | 132 |
|
|
134 | 137 | (test-equal (term (subst ([1 x][2 y]) x)) 1)
|
135 | 138 | (test-equal (term (subst ([1 x][2 y]) y)) 2)
|
136 | 139 | (test-equal (term (subst ([1 x][2 y]) z)) (term z))
|
137 |
| - (test-equal (term (subst ([1 x][2 y]) (lambda (z w) (x y)))) |
138 |
| - (term (lambda (z w) (1 2)))) |
139 |
| - (test-equal (term (subst ([1 x][2 y]) (lambda (z w) (lambda (x) (x y))))) |
140 |
| - (term (lambda (z w) (lambda (x) (x 2)))) |
| 140 | + (test-equal (term (subst ([1 x][2 y]) (lambda (z) (lambda (w) (x y))))) |
| 141 | + (term (lambda (z) (lambda (w) (1 2))))) |
| 142 | + (test-equal (term (subst ([1 x][2 y]) (lambda (z) (lambda (w) (lambda (x) (x y)))))) |
| 143 | + (term (lambda (z) (lambda (w) (lambda (x) (x 2))))) |
141 | 144 | #:equiv =α/racket)
|
142 | 145 | (test-equal (term (subst ((2 x)) ((lambda (x) (1 x)) x)))
|
143 | 146 | (term ((lambda (x) (1 x)) 2))
|
|
150 | 153 | subst : ((any x) ...) any -> any
|
151 | 154 | [(subst [(any_1 x_1) ... (any_x x) (any_2 x_2) ...] x) any_x]
|
152 | 155 | [(subst [(any_1 x_1) ... ] x) x]
|
153 |
| - [(subst [(any_1 x_1) ... ] (lambda (x ...) any_body)) |
154 |
| - (lambda (x_new ...) |
| 156 | + [(subst [(any_1 x_1) ... ] (lambda (x) any_body)) |
| 157 | + (lambda (x_new) |
155 | 158 | (subst ((any_1 x_1) ...)
|
156 |
| - (subst-raw ((x_new x) ...) any_body))) |
157 |
| - (where (x_new ...) ,(variables-not-in (term (any_body any_1 ...)) (term (x ...)))) ] |
| 159 | + (subst-raw (x_new x) any_body))) |
| 160 | + (where x_new ,(variable-not-in (term (any_body any_1 ...)) (term x)))] |
158 | 161 | [(subst [(any_1 x_1) ... ] (any ...)) ((subst [(any_1 x_1) ... ] any) ...)]
|
159 | 162 | [(subst [(any_1 x_1) ... ] any_*) any_*])
|
160 | 163 |
|
161 | 164 | (define-metafunction Lambda
|
162 |
| - subst-raw : ((x x) ...) any -> any |
163 |
| - [(subst-raw ((x_n1 x_o1) ... (x_new x) (x_n2 x_o2) ...) x) x_new] |
164 |
| - [(subst-raw ((x_n1 x_o1) ... ) x) x] |
165 |
| - [(subst-raw ((x_n1 x_o1) ... ) (lambda (x ...) any)) |
166 |
| - (lambda (x ...) (subst-raw ((x_n1 x_o1) ... ) any))] |
167 |
| - [(subst-raw [(any_1 x_1) ... ] (any ...)) |
168 |
| - ((subst-raw [(any_1 x_1) ... ] any) ...)] |
169 |
| - [(subst-raw [(any_1 x_1) ... ] any_*) any_*]) |
| 165 | + subst-raw : (x x) any -> any |
| 166 | + [(subst-raw (x_new x_) x_) x_new] |
| 167 | + [(subst-raw (x_new x_) x) x] |
| 168 | + [(subst-raw (x_new x_) (lambda (x) any)) |
| 169 | + (lambda (x) (subst-raw (x_new x_) any))] |
| 170 | + [(subst-raw (x_new x_) (any ...)) |
| 171 | + ((subst-raw (x_new x_) any) ...)] |
| 172 | + [(subst-raw (x_new x_) any_*) any_*]) |
170 | 173 |
|
171 | 174 | ;; -----------------------------------------------------------------------------
|
172 | 175 | (module+ test
|
|
0 commit comments