|
56 | 56 | (lambda u: x)
|
57 | 57 | (ID))
|
58 | 58 |
|
59 |
| -ADD = lambda m: lambda n: n (SUCC) (m) |
60 | 59 | SUB = lambda m: lambda n: n (PREC) (m)
|
61 |
| -TIMES = lambda m: lambda n: n (PLUS (n)) |
62 | 60 |
|
63 | 61 | ZERO = FALSE
|
64 | 62 | ONE = SUCC (ZERO)
|
|
69 | 67 | IS_ZERO = lambda n: n (lambda x: FALSE) (TRUE)
|
70 | 68 | # LEQ(n,m) = n <= m
|
71 | 69 | LEQ = lambda m: lambda n: IS_ZERO (SUB (m) (n))
|
72 |
| -# EQ(n,m) = n ==m |
| 70 | +# EQ(n,m) = n == m |
73 | 71 | EQ = lambda m: lambda n: AND (LEQ (m) (n)) (LEQ (n) (m))
|
74 | 72 |
|
75 | 73 | # Lambda terms
|
|
83 | 81 | LAMBDA_ABSTRACTION_BUILDER = lambda t: TUPLE (ENUM_3_2) (t)
|
84 | 82 | LAMBDA_APPLICATION_BUILDER = lambda x: lambda y: TUPLE (ENUM_3_3) (TUPLE (x) (y))
|
85 | 83 |
|
86 |
| -# Lambda lazy reduction |
87 |
| -# ===================== |
88 |
| - |
| 84 | +# λ-calculus call-by-name reduction |
| 85 | +# ================================= |
89 | 86 |
|
90 | 87 | # The arguments are:
|
91 | 88 | # f a self-reference dummy function for the Y combinator.
|
|
110 | 107 | (f (_2ND (_2ND (e))) (x) (n)))) (ID))
|
111 | 108 |
|
112 | 109 | APPLY = Y (lambda f: lambda e: _1ST (e)
|
113 |
| - # We only reduce applications. |
| 110 | + # We only reduce applications. (This is the 'call-by-name reduction |
| 111 | + # strategy'.) |
114 | 112 | (LAMBDA_VARIABLE_BUILDER (_2ND (e)))
|
115 | 113 | (LAMBDA_ABSTRACTION_BUILDER (_2ND (e)))
|
116 | 114 | (REDUCE (_1ST (e)) (_2ND (e)) (ONE)))
|
117 | 115 |
|
118 |
| -# TODO APPLY |
| 116 | +# Binary λ-calculus parser and interpreter |
| 117 | +# ======================================== |
119 | 118 | """
|
120 |
| -BINARY_LAMBDA = lambda p: p ( |
121 |
| - # p == 1 |
122 |
| - (lambda p1: Y_COMBINATOR (lambda f: lambda n:)) |
123 |
| - # p == 0 |
124 |
| - (lambda p1: p1 |
125 |
| - # pq == 01 |
126 |
| - (lambda p2:) |
127 |
| - # pq == 00 |
| 119 | +PARSE_LAMBDA = Y (lambda f: lambda b: b ( |
| 120 | + # If p == 1, we pass control over to PARSER_DE_BRUIJN_INDEX. |
| 121 | + (PARSE_DE_BRUIJN_INDEX (ONE)) |
| 122 | + # Otherwise, we distinguish between abstraction (00) and application (01). |
| 123 | + (lambda b1: b1 |
| 124 | + # 01 |
| 125 | + (lambda b2:) |
| 126 | + # 00 |
128 | 127 | )
|
129 |
| -)""" |
| 128 | +)) |
| 129 | +
|
| 130 | +# Parse a de Bruijn index, for example: |
| 131 | +# 1111110 => $6 |
| 132 | +# 10 => $1 |
| 133 | +# |
| 134 | +# In general, |
| 135 | +# 1{n}0 => $n |
| 136 | +PARSE_DE_BRUIJN_INDEX = Y (lambda f: lambda n: lambda b: b |
| 137 | + (lambda b1: f (SUCC (n)) (b1)) |
| 138 | + (LAMBDA_VARIABLE_BUILDER (n))) |
| 139 | +
|
| 140 | +PARSE_ABSTRACTION = ( |
| 141 | + (lambda b: LAMBDA_ABSTRACTION_BUILDER () )) |
| 142 | +
|
| 143 | +PARSE_APPLICATION = LAMBDA_APPLICATION_BUILDER (PARSE_LAMBDA) |
| 144 | +""" |
0 commit comments