Skip to content

Commit 3dc51bf

Browse files
author
Filippo Costa
committed
First draft of the BLC interpreter
1 parent 3df3f88 commit 3dc51bf

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

lambda.py

+32-17
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@
5656
(lambda u: x)
5757
(ID))
5858

59-
ADD = lambda m: lambda n: n (SUCC) (m)
6059
SUB = lambda m: lambda n: n (PREC) (m)
61-
TIMES = lambda m: lambda n: n (PLUS (n))
6260

6361
ZERO = FALSE
6462
ONE = SUCC (ZERO)
@@ -69,7 +67,7 @@
6967
IS_ZERO = lambda n: n (lambda x: FALSE) (TRUE)
7068
# LEQ(n,m) = n <= m
7169
LEQ = lambda m: lambda n: IS_ZERO (SUB (m) (n))
72-
# EQ(n,m) = n ==m
70+
# EQ(n,m) = n == m
7371
EQ = lambda m: lambda n: AND (LEQ (m) (n)) (LEQ (n) (m))
7472

7573
# Lambda terms
@@ -83,9 +81,8 @@
8381
LAMBDA_ABSTRACTION_BUILDER = lambda t: TUPLE (ENUM_3_2) (t)
8482
LAMBDA_APPLICATION_BUILDER = lambda x: lambda y: TUPLE (ENUM_3_3) (TUPLE (x) (y))
8583

86-
# Lambda lazy reduction
87-
# =====================
88-
84+
# λ-calculus call-by-name reduction
85+
# =================================
8986

9087
# The arguments are:
9188
# f a self-reference dummy function for the Y combinator.
@@ -110,20 +107,38 @@
110107
(f (_2ND (_2ND (e))) (x) (n)))) (ID))
111108

112109
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'.)
114112
(LAMBDA_VARIABLE_BUILDER (_2ND (e)))
115113
(LAMBDA_ABSTRACTION_BUILDER (_2ND (e)))
116114
(REDUCE (_1ST (e)) (_2ND (e)) (ONE)))
117115

118-
# TODO APPLY
116+
# Binary λ-calculus parser and interpreter
117+
# ========================================
119118
"""
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
128127
)
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

Comments
 (0)