-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlambda-calculus.rkt
178 lines (142 loc) · 4.24 KB
/
lambda-calculus.rkt
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#lang lazy
;; Author: Junze Wu
;; Date: Nov 22, 2019
;; Description: Code to demonstrate λ-definability
;; Encoding Booleans
(define TRUE (λ (x) (λ (y) x)))
(define FALSE (λ (x) (λ (y) y)))
;; Encoding NOT, AND, OR
(define NOT (λ (b) ((b FALSE) TRUE)))
(define AND (λ (x) (λ (y) ((x y) x))))
(define OR (λ (x) (λ (y) ((x x) y))))
;; Encoding IF
(define IF (λ (c) (λ (t) (λ (f) ((c t) f)))))
;; Encoding Natural Numbers
;; Church Numerals
;; represent numbers with the number of times of repeatedly applying f
(define ZERO (λ (f) (λ (x) x))) ;; Note this is also FALSE
(define ONE (λ (f) (λ (x) (f x))))
(define TWO (λ (f) (λ (x) (f (f x)))))
(define THREE (λ (f) (λ (x) (f (f (f x))))))
(define FOUR (λ (f) (λ (x) (f (f (f (f x)))))))
(define FIVE (λ (f) (λ (x) (f (f (f (f (f x))))))))
(define SIX (λ (f) (λ (x) (f (f (f (f (f (f x)))))))))
(define SEVEN (λ (f) (λ (x) (f (f (f (f (f (f (f x))))))))))
;; and so on
;; Another way of encoding natural numbers (Peano numbers)
;; Recursive definition
;; NATURAL is one of:
;; - ZERO
;; - (SUCC NATURAL)
;; Successor
(define SUCC (λ (n) (λ (f) (λ (x) (f ((n f) x))))))
;; Arithmetics
;; Addition
(define PLUS (λ (m) (λ (n) ((m SUCC) n))))
;; Multiplication (repeated addition)
#;
(define MULT (λ (m) (λ (n) ((m (PLUS n)) ZERO))))
;; Alternative definition (composition)
(define MULT (λ (m) (λ (n) (λ (f) (m (n f))))))
;; Exponentiation
(define EXP (λ (m) (λ (n) (n m))))
;; For predecessor and subtraction, we need to introduce pairs first
;; Encoding pairs and lists
;; we want the ability to 'select' from two paired items
(define CONS (λ (a) (λ (b) (λ (s) ((s a) b)))))
(define CAR (λ (p) (p TRUE)))
(define CDR (λ (p) (p FALSE)))
(define NIL FALSE) ;; denote empty list
;; Predecessor
;; the "wisdom tooth trick"
(define T (λ (p) ((CONS (SUCC (CAR p))) (CAR p))))
(define PRED (λ (n) (CDR ((n T) ((CONS ZERO) ZERO)))))
;; Subtraction
(define SUB (λ (x) (λ (y) ((y PRED) x))))
;; Predicates
(define ZERO? (λ (n) ((n (λ (x) FALSE)) TRUE)))
(define LEQ? (λ (m) (λ (n) (ZERO? ((SUB m) n)))))
(define GT? (λ (m) (λ (n) (NOT ((LEQ? m) n)))))
(define EQ? (λ (m) (λ (n) ((AND ((LEQ? m) n)) ((LEQ? n) m)))))
;; Recursion
;; In Racket, recursive procedures can be defined using self-reference
;; However, in λ-calculus, functions are anonymous
#;
(define factorial
(λ (n)
(if (zero? n)
1
(* n (factorial (sub1 n))))))
#;
(define (divide n m)
(if (>= n m)
(add1 (divide (- n m) m))
0))
;; Y combinator
;; Y f = f (Y f)
(define Y (λ (f) ((λ (x) (f (x x))) (λ (x) (f (x x))))))
(define factorial (Y (λ (f)
(λ (n)
(if (zero? n)
1
(* n (f (sub1 n))))))))
(define FACTORIAL (Y (λ (f)
(λ (n)
(((ZERO? n)
ONE)
((MULT n) (f (PRED n))))))))
(define divide
(Y (λ (f)
(λ (n)
(λ (m)
(if (>= n m)
(add1 ((f (- n m)) m))
0))))))
(define DIVIDE
(Y (λ (f)
(λ (n)
(λ (m)
((((OR ((GT? n) m)) ((EQ? n) m))
(SUCC ((f ((SUB n) m)) m)))
ZERO))))))
;; Sample programs
(NOT TRUE)
(NOT FALSE)
((AND TRUE) TRUE)
((AND TRUE) FALSE)
((AND TRUE) FALSE)
((AND FALSE) FALSE)
((OR TRUE) TRUE)
((OR TRUE) FALSE)
((OR FALSE) TRUE)
((OR FALSE) FALSE)
;; helper function to see what the Church numeral is
(define (show n) ((n add1) 0))
(show ONE)
(show (SUCC (SUCC (SUCC ZERO))))
(show ((PLUS FOUR) THREE))
(show ((MULT THREE) FOUR))
(show ((EXP THREE) FOUR))
(CAR ((CONS ONE) TWO))
(CDR ((CONS ONE) TWO))
(CAR ((CONS ONE) ((CONS TWO) ((CONS THREE) NIL))))
(CAR (CDR ((CONS ONE) ((CONS TWO) ((CONS THREE) NIL)))))
(CAR (CDR (CDR ((CONS ONE) ((CONS TWO) ((CONS THREE) NIL))))))
(show (PRED SEVEN))
(show ((SUB SEVEN) TWO))
(ZERO? ZERO)
(ZERO? TWO)
((LEQ? ONE) TWO)
((LEQ? TWO) SIX)
((LEQ? THREE) TWO)
((EQ? ONE) ONE)
((EQ? ONE) TWO)
(show ((DIVIDE SIX) TWO))
(show ((DIVIDE SIX) THREE))
(show ((DIVIDE FOUR) TWO))
(show (FACTORIAL FIVE))
(show
(((IF (ZERO? ((SUB ((PLUS THREE) FOUR))
((PLUS TWO) FIVE))))
((EXP THREE) TWO))
((MULT THREE) FOUR)))