a.b.c.b a => b => c => b
abc.b a => b => c => b
(a, b, c) => b
=
ABSTRACTIONS, again
Slide 48
Slide 48 text
((a.a)bc.b)(x)e.f
β-REDUCTION, again
Slide 49
Slide 49 text
((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again
Slide 50
Slide 50 text
((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again
Slide 51
Slide 51 text
((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again
Slide 52
Slide 52 text
((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again
Slide 53
Slide 53 text
((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION, again
β-NORMAL FORM
Slide 54
Slide 54 text
ab.a
KESTREL
Slide 55
Slide 55 text
λ
JS K = a => b => a
K := ab.a
= a.b.a
Slide 56
Slide 56 text
λ
JS K = a => b => a
K := ab.a
= a.b.a
Slide 57
Slide 57 text
λ
JS K = a => b => a
K := ab.a
= a.b.a
Slide 58
Slide 58 text
λ
JS K = a => b => a
K := ab.a
= a.b.a
Slide 59
Slide 59 text
λ
JS K(M)(I) === ?
K M I = ?
K := ab.a
K = a => b => a
Slide 60
Slide 60 text
λ
JS K(M)(I) === M
K M I = M
K := ab.a
K = a => b => a
Slide 61
Slide 61 text
λ
JS K(M)(I) === M
K(I)(M) === ?
K M I = M
K I M = ?
K := ab.a
K = a => b => a
Slide 62
Slide 62 text
λ
JS K(M)(I) === M
K(I)(M) === I
K M I = M
K I M = I
K := ab.a
K = a => b => a
Slide 63
Slide 63 text
const 7 2 == 7
Slide 64
Slide 64 text
λ
JS K(I)(x) === I
K I x = I
K := ab.a
K = a => b => a
Slide 65
Slide 65 text
λ
JS K(I)(x)(y) === I(y)
&& I(y) === ?
K I x y = I y = ?
K := ab.a
K = a => b => a
Slide 66
Slide 66 text
λ
JS
K I x y = I y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === I(y)
&& I(y) === y
Slide 67
Slide 67 text
λ
JS
K I x y = I y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === I(y)
&& I(y) === y
Slide 68
Slide 68 text
λ
JS
K I x y = I y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === I(y)
&& I(y) === y
Slide 69
Slide 69 text
ab.b
KITE
Slide 70
Slide 70 text
λ
JS KI = a => b => b
KI = K(I)
KI := ab.b
= K I
Slide 71
Slide 71 text
λ
JS KI(M)(K) === ?
KI M K = ?
KI := ab.b
KI = a => b => b
Slide 72
Slide 72 text
λ
JS KI(M)(K) === K
KI M K = K
KI := ab.b
KI = a => b => b
Slide 73
Slide 73 text
λ
JS KI(M)(K) === K
KI(K)(M) === ?
KI M K = K
KI K M = ?
KI := ab.b
KI = a => b => b
Slide 74
Slide 74 text
λ
JS KI(M)(K) === K
KI(K)(M) === M
KI M K = K
KI K M = M
KI := ab.b
KI = a => b => b
Slide 75
Slide 75 text
?
Slide 76
Slide 76 text
SCHÖNFINKEL CURRY SMULLYAN
Identitätsfunktion
Konstante Funktion
verSchmelzungsfunktion
verTauschungsfunktion
Zusammensetzungsf.
I
K
S
C
B
Idiot
Kestrel
Starling
Cardinal
Bluebird
Ibis?
Slide 77
Slide 77 text
No content
Slide 78
Slide 78 text
?
Slide 79
Slide 79 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
TH E FO R M A L I Z AT I O N O F
MAT H E M AT I C A L LO G I C
Slide 80
Slide 80 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
FO R M A L NO TAT I O N FO R FU N C T I O N S
1889
PE A N O AR I T H M E T I C
Slide 81
Slide 81 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
AX I O M AT I C LO G I C · FN NO TAT I O N
FU N C T I O N S A S GR A P H S · CU R RY I N G
1891
Slide 82
Slide 82 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
PR I N C I P I A MAT H E M AT I C A
1910
RU S S E L L ’S PA R A D OX · FN NO TAT I O N
Slide 83
Slide 83 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
CO M B I N AT O RY LO G I C
CO M B I N AT O R S · CU R RY I N G
1920
Slide 84
Slide 84 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
FU N C T I O N A L SY S T E M O F SE T TH E O RY
1925
(OV E R L A P P E D W I T H CO M B I N AT O RY LO G I C )
Slide 85
Slide 85 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
CO M B I N AT O RY LO G I C (AG A I N )
CO M B I N AT O R S · M A N Y C O N T R I B U T I O N S
1926
Slide 86
Slide 86 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
D I S C OV E R S SC H Ö N F I N K E L
“This paper anticipates much of what I have done.”
1927
Slide 87
Slide 87 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
IN C O M P L E T E N E S S TH E O R E M S
1931
EN D I N G T H E SE A RC H FO R SU F F I C I E N T AX I O M S
Slide 88
Slide 88 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
-CA L C U L U S
AN EF F E C T I V E MO D E L O F CO M P U TAT I O N
1932
Slide 89
Slide 89 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
I N C O N S I S T E N C Y O F S P E C I A L I Z E D
1931–1936
C O N S I S T E N C Y O F P U R E
Slide 90
Slide 90 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
SO LV E S T H E DE C I S I O N PRO B L E M
V I A T H E -CA L C U L U S
1936
Slide 91
Slide 91 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
SO LV E S T H E DE C I S I O N PRO B L E M
1936
V I A T H E TU R I N G MAC H I N E
Slide 92
Slide 92 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
ES TA B L I S H E S T H E CH U RC H -TU R I N G TH E S I S
1936
-CA L C U L U S 㱻 TU R I N G MAC H I N E
Slide 93
Slide 93 text
PEANO
FREGE
RUSSELL
SCHÖNFINKEL
VON NEUMANN
CURRY CHURCH
GÖDEL
TURING
KLEENE ROSSER
O B TA I N S PH D U N D E R CH U RC H
1936–1938
PU B L I S H E S 1S T FI X E D -PO I N T CO M B I N AT O R
Slide 94
Slide 94 text
COMBINATORS
functions with no free variables
b.b combinator
b.a not a combinator
ab.a combinator
a.ab not a combinator
abc.c(e.b) combinator
Slide 95
Slide 95 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a first, const const
KI Kite ab.b = KI second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°-1° composition (.)
B1
Blackbird fgab.f(gab) = BBB 1°-2° composition (.) . (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
Slide 96
Slide 96 text
CARDINAL
fab.fba
Slide 97
Slide 97 text
λ
JS C = f => a => b => f(b)(a)
C := fab.fba
Slide 98
Slide 98 text
λ
JS C(K)(I)(M) === ?
C K I M = ?
C := fab.fba
C = f => a => b => f(b)(a)
Slide 99
Slide 99 text
λ
JS C(K)(I)(M) === M
C K I M = M
C := fab.fba
C = f => a => b => f(b)(a)
Slide 100
Slide 100 text
λ
JS C(K)(I)(M) === M
C K I M = M
C := fab.fba
C = f => a => b => f(b)(a)
Slide 101
Slide 101 text
λ
JS KI(I)(M) === M
KI I M = M
C := fab.fba
C = f => a => b => f(b)(a)
Slide 102
Slide 102 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a first, const const
KI Kite ab.b = KI second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°-1° composition (.)
B1
Blackbird fgab.f(gab) = BBB 1°-2° composition (.) . (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
Slide 103
Slide 103 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a first, const const
KI Kite ab.b = KI = CK second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°-1° composition (.)
B1
Blackbird fgab.f(gab) = BBB 1°-2° composition (.) . (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
Slide 104
Slide 104 text
flip const 1 8 == 8
Slide 105
Slide 105 text
-CALCULUS
abstract symbol rewriting
functional computation
TURING MACHINE
hypothetical device
state-based computation
(f.ff)a.a
purely functional programming languages
higher-level machine-centric languages
assembly languages
machine code
higher-level abstract stateful languages
real computers
Slide 106
Slide 106 text
TM
Slide 107
Slide 107 text
EVERYTHING
CAN BE
FUNCTIONS
Slide 108
Slide 108 text
…
TRUE FALSE NOT AND OR BEQ
Slide 109
Slide 109 text
λ
JS const result = bool ? exp1 : exp2
Slide 110
Slide 110 text
λ
JS const result = bool ? exp1 : exp2
// true
Slide 111
Slide 111 text
λ
JS const result = bool ? exp1 : exp2
// false
Slide 112
Slide 112 text
λ
JS const result = bool ? exp1 : exp2
result := ?
Slide 113
Slide 113 text
λ
JS const result = bool ? exp1 : exp2
result := bool ? exp1 : exp2
Slide 114
Slide 114 text
λ
JS const result = bool ? exp1 : exp2
result := bool exp1 exp2
Slide 115
Slide 115 text
λ
JS const result = bool (exp1) (exp2)
result := func exp1 exp2
Slide 116
Slide 116 text
λ
JS
result := func exp1 exp2
const result = bool (exp1) (exp2)
// true
Slide 117
Slide 117 text
λ
JS
result := func exp1 exp2
const result = bool (exp1) (exp2)
// false
Slide 118
Slide 118 text
λ
JS const result = bool (exp1) (exp2)
result := func exp1 exp2
TRUE
FALSE
Slide 119
Slide 119 text
λ
JS const result = bool (exp1) (exp2)
result := func exp1 exp2
K
KI
Slide 120
Slide 120 text
λ
JS const T = K
const F = KI
TRUE := K
FALSE := KI = C K
CHURCH ENCODINGS: BOOLEANS
Slide 121
Slide 121 text
λ
JS !p
! p
Slide 122
Slide 122 text
λ
JS not(p)
NOT p
Slide 123
Slide 123 text
λ
JS not(p)
NOT p
F
T
F
T
Slide 124
Slide 124 text
λ
JS not(T)
NOT T
F
T
F
T
Slide 125
Slide 125 text
λ
JS not(F)
NOT F
F
T
F
T
Slide 126
Slide 126 text
λ
JS p F T
F T
p
( )
( )
Slide 127
Slide 127 text
λ
JS ( ) ( )
T F T
F T
T
K
K
KI
KI
Slide 128
Slide 128 text
λ
JS ( ) ( )
F F T
F T
F
KI
KI K
K
Slide 129
Slide 129 text
λ
JS const not = p => p(F)(T)
NOT := p.pFT
Slide 130
Slide 130 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq disjunction
BEQ pq.p q (NOT q) equality
Slide 131
Slide 131 text
λ
JS not(T) === F
not(F) === T
NOT T = F
NOT F = T
Slide 132
Slide 132 text
λ
JS not(K) === KI
not(KI) === K
NOT K = KI
NOT (KI) = K
ab.a ba.a
ba.a ab.a
Slide 133
Slide 133 text
λ
JS C(K) (chirp)(tweet) === tweet
C(KI)(chirp)(tweet) === chirp
C K = KI
C (KI) = K
Slide 134
Slide 134 text
λ
JS C(T) (chirp)(tweet) === tweet
C(F) (chirp)(tweet) === chirp
C T = F
C F = T
Slide 135
Slide 135 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq disjunction
BEQ pq.p q (NOT q) equality
Slide 136
Slide 136 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq disjunction
BEQ pq.p q (NOT q) equality
Slide 137
Slide 137 text
λ
JS const and = ?
AND := ?
Slide 138
Slide 138 text
λ
JS const and = p => q => ?
AND := pq.?
Slide 139
Slide 139 text
λ
JS const and = p => q => p(?)(¿)
AND := pq.p?¿
Slide 140
Slide 140 text
λ
JS const and = p => q => p(?)(¿)
AND := pq.p?¿
F
F
Slide 141
Slide 141 text
λ
JS const and = p => q => p(?)(F)
AND := pq.p?F
Slide 142
Slide 142 text
λ
JS const and = p => q => p(?)(F)
AND := pq.p?F
T
T
Slide 143
Slide 143 text
λ
JS const and = p => q => p(q)(F)
AND := pq.pqF
Slide 144
Slide 144 text
pq.p F
q
Slide 145
Slide 145 text
pq.p
F
q
Slide 146
Slide 146 text
pq.p
p
q
Slide 147
Slide 147 text
pq.p p
q
Slide 148
Slide 148 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq disjunction
BEQ pq.p q (NOT q) equality
Slide 149
Slide 149 text
λ
JS const or = ?
OR := ?
Slide 150
Slide 150 text
λ
JS const or = p => q => …
OR := pq.…
Slide 151
Slide 151 text
λ
JS const or = p => q => p(?)(¿)
OR := pq.p?¿
Slide 152
Slide 152 text
λ
JS const or = p => q => p(T)(¿)
OR := pq.pT¿
Slide 153
Slide 153 text
λ
JS const or = p => q => p(T)(q)
OR := pq.pTq
Slide 154
Slide 154 text
λ
JS const or = p => q => p(p)(q)
OR := pq.ppq
Slide 155
Slide 155 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq disjunction
BEQ pq.p q (NOT q) equality
Slide 156
Slide 156 text
pq.ppq
Slide 157
Slide 157 text
( pq.ppq ) xy = ?
Slide 158
Slide 158 text
( pq.ppq ) xy = xxy
Slide 159
Slide 159 text
( pq.ppq ) xy = xxy
( ? ) xy = xxy
Slide 160
Slide 160 text
( pq.ppq ) xy = xxy
( ? ) xy = xxy
Slide 161
Slide 161 text
( pq.ppq ) xy = xxy
M xy = xxy
Slide 162
Slide 162 text
( pq.ppq ) xy = xxy
M xy = xxy
Slide 163
Slide 163 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq disjunction
BEQ pq.p q (NOT q) equality
Slide 164
Slide 164 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq = M* disjunction
BEQ pq.p q (NOT q) equality
Slide 165
Slide 165 text
( )
pq.p( ) T
T F F
q
q
p => q => p(q(T)(F))(q(F)(T))
Slide 166
Slide 166 text
( )
pq.p
( )
T
T F
F
q
q
Slide 167
Slide 167 text
( )
pq.p
( )
T
T
F
F
q
q
Slide 168
Slide 168 text
( )
pq.p
( )
T
T
F
F
q
q
Slide 169
Slide 169 text
( )
pq.p
( )
T
T
F
F
q
q
Slide 170
Slide 170 text
( )
pq.p
( )
T
T
F
F
q
q
Slide 171
Slide 171 text
( )
pq.p
( )
T
T
F
F
q
q
Slide 172
Slide 172 text
( )
pq.p
( )
T
T
F
F
q
q
BOOLEAN EQUALITY
Slide 173
Slide 173 text
pq.p
( )
T
F
q
q
Slide 174
Slide 174 text
( )
pq.p
q
NOT
q
Slide 175
Slide 175 text
( )
pq.p q
q NOT
p => q => p(q)(not(q))
Slide 176
Slide 176 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq = M* disjunction
BEQ pq.p q (NOT q) equality
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 179
Slide 179 text
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 180
Slide 180 text
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 181
Slide 181 text
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 182
Slide 182 text
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 183
Slide 183 text
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 184
Slide 184 text
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
(xy.x y ((fab.fba) y))
((fab.fba) ((xy.xyx) p q))
((f.ff) ((fab.fba) p) ((fab.fba) q))
Slide 185
Slide 185 text
…
ZERO ONE TWO THREE SUCC
Slide 186
Slide 186 text
…
ZERO ONCE TWICE THRICE SUCC
Slide 187
Slide 187 text
λ
JS n1 = f => a => f(a)
n2 = f => a => f(f(a))
n3 = f => a => f(f(f(a)))
N1 := fa.fa
N2 := fa.f(fa)
N3 := fa.f(f(fa))
Slide 188
Slide 188 text
λ
JS n1(not)(T) = not(T) = ?
N1 NOT T = NOT T = ?
N1 := fa.fa
N1 = f => a => f(a)
Slide 189
Slide 189 text
λ
JS n1(not)(T) = not(T) = F
N1 NOT T = NOT T = F
N1 := fa.fa
N1 = f => a => f(a)
Slide 190
Slide 190 text
λ
JS n2(not)(T) = not(not(T)) = ?
N2 NOT T = NOT (NOT T) = ?
N2 := fa.f(fa)
N2 = f => a => f(f(a))
Slide 191
Slide 191 text
λ
JS n2(not)(T) = not(not(T)) = T
N2 NOT T = NOT (NOT T) = T
N2 := fa.f(fa)
N2 = f => a => f(f(a))
Slide 192
Slide 192 text
λ
JS n3(not)(T) = not(not(not(T))) = F
N3 NOT T =
NOT (NOT (NOT T))) = F
N3 := fa.f(f(fa))
N3 = f => a => f(f(f(a)))
Slide 193
Slide 193 text
λ
JS n0 = f => a => a
n1 = f => a => f(a)
n2 = f => a => f(f(a))
n3 = f => a => f(f(f(a)))
N0 := fa.a
N1 := fa.fa
N2 := fa.f(fa)
N3 := fa.f(f(fa))
Slide 194
Slide 194 text
λ
JS n0(not)(T) = ?
N0 NOT T = ?
N0 := fa.a
N3 = f => a => a
Slide 195
Slide 195 text
λ
JS n0(not)(T) = T
N0 NOT T = T
N0 := fa.a
N3 = f => a => a
Slide 196
Slide 196 text
CHURCH ENCODINGS: NUMERALS
Sym. Name -Calculus Use
N0 ZERO fa.a = F apply f no times to a
N1 ONCE fa.f a = I* apply f once to a
N2 TWICE fa.f (f a) apply 2-fold f to a
N3 THRICE fa.f (f (f a)) apply 3-fold f to a
N4 FOURFOLD fa.f (f (f (f a))) apply 4-fold f to a
N5 FIVEFOLD fa.f (f (f (f (f a))))) apply 5-fold f to a
λ
JS succ = n => f => a => f(n(f)(a))
SUCC := nfa.f(nfa)
SUCC fa.fa = fa.f(fa)
Slide 202
Slide 202 text
λ
JS succ = n => f => a => f(n(f)(a))
SUCC := nfa.f(nfa)
SUCC fa.fa = fa.f(fa)
Slide 203
Slide 203 text
λ
JS succ = n => f => a => f(n(f)(a))
SUCC := nfa.f(nfa)
SUCC fa.fa = fa.f(fa)
Slide 204
Slide 204 text
SUCC N2 = (nfa.f(nfa)) N2
= fa.f(N2 f a)
= fa.f(f(f a)
= N3
Slide 205
Slide 205 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 206
Slide 206 text
BLUEBIRD
fga.f(ga)
Slide 207
Slide 207 text
λ
JS B = f => g => a => f(g(a))
B := fga.f(ga)
Slide 208
Slide 208 text
λ
JS B(not)(not)(T) === ?
B NOT NOT T = ?
B := fga.f(ga)
B = f => g => a => f(g(a))
Slide 209
Slide 209 text
λ
JS B(not)(not)(T) === T
B NOT NOT T = T
B := fga.f(ga)
B = f => g => a => f(g(a))
Slide 210
Slide 210 text
odd = not . even
Slide 211
Slide 211 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
B1
Blackbird fgab.f(gab) = BBB 1°-2° composition (.) . (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
Slide 212
Slide 212 text
λ
JS succ = n => f => a => f(n(f)(a))
SUCC := nfa.f(nfa)
Slide 213
Slide 213 text
λ
JS succ = n => f => B(f)(n(f))
SUCC := nf.Bf(nf)
Slide 214
Slide 214 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 215
Slide 215 text
…
ADD MULT POW
Slide 216
Slide 216 text
λ
JS add = n => k => ?
ADD := nk.?
ADD N3 N5 = SUCC (SUCC (SUCC N5))
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 222
Slide 222 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 = N6
Slide 223
Slide 223 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f a = N6 f a
Slide 224
Slide 224 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f a = (f ∘ f ∘ f ∘ f ∘ f ∘ f) a
Slide 225
Slide 225 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f a = ((f ∘ f ∘ f) ∘ (f ∘ f ∘ f)) a
Slide 226
Slide 226 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f a = ((N3 f) ∘ (N3 f)) a
Slide 227
Slide 227 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f a = N2 (N3 f) a
Slide 228
Slide 228 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f a = N2 (N3 f) a
Slide 229
Slide 229 text
λ
JS mult = n => k => ?
MULT := nk.?
MULT N2 N3 f = N2 (N3 f)
Slide 230
Slide 230 text
λ
JS mult = n => k => n(k(f))
MULT := nkf.n(kf)
MULT N2 N3 f = N2 (N3 f)
Slide 231
Slide 231 text
MULT N2 N3 f = N2 (N3 f)
= TWICE (THRICE f)
= (f ∘ f ∘ f) ∘ (f ∘ f ∘ f)
= SIXFOLD f
Slide 232
Slide 232 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 233
Slide 233 text
λ
JS
MULT := nkf.n(kf)
MULT N2 N3 f = N2 (N3 f)
mult = n => k => n(k(f))
Slide 234
Slide 234 text
λ
JS
MULT := nkf.n(kf)
MULT N2 N3 f = (N2 ∘ N3) f
mult = n => k => n(k(f))
Slide 235
Slide 235 text
λ
JS
MULT := nkf.n(kf)
MULT N2 N3 f = (N2 ∘ N3) f
mult = n => k => n(k(f))
Slide 236
Slide 236 text
λ
JS
MULT := nkf.n(kf)
MULT N2 N3 = N2 ∘ N3
mult = n => k => n(k(f))
Slide 237
Slide 237 text
λ
JS
MULT := nkf.n(kf)
MULT N2 N3 = B N2 N3
mult = n => k => n(k(f))
Slide 238
Slide 238 text
λ
JS
MULT := nkf.n(kf)
MULT N2 N3 = B N2 N3
mult = n => k => n(k(f))
Slide 239
Slide 239 text
λ
JS
MULT := nkf.n(kf)
MULT = B
mult = n => k => n(k(f))
Slide 240
Slide 240 text
MULT := B
Slide 241
Slide 241 text
Mult := n k f . n ( k f)
= B = f g a . f ( g a)
-EQUIVALENCE
Slide 242
Slide 242 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 250
Slide 250 text
THRUSH
af.fa
Slide 251
Slide 251 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
Th
Thrush af.fa hold an argument
V Vireo abf.fab = BCT hold a pair of args flip . flip id
B1
Blackbird fgab.f(gab) = BBB 1°←2° composition (.) . (.)
Slide 252
Slide 252 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
B1
Blackbird fgab.f(gab) = BBB 1°←2° composition (.) . (.)
Slide 253
Slide 253 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 254
Slide 254 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
λ
JS is0 = n => n(func)(T)
IS0 := n.n func T
N > 0
F
Slide 264
Slide 264 text
λ
JS is0 = n => n(K(F))(T)
IS0 := n.n (KF) T
Slide 265
Slide 265 text
λ
JS is0 = n => n(K(F))(T)
IS0 := n.n (KF) T
IS0 N3 = KF(KF(KF(T))) = F
Slide 266
Slide 266 text
λ
JS is0 = n => n(K(F))(T)
IS0 := n.n (KF) T
IS0 N3 = KF(KF(KF(T))) = F
Slide 267
Slide 267 text
λ
JS is0 = n => n(K(F))(T)
IS0 := n.n (KF) T
IS0 N3 = KF(KF(KF(T))) = F
Slide 268
Slide 268 text
CHURCH ARITHMETIC: BOOLEAN OPS
Name -Calculus Use
IS0 n.n (K F) T test if n = 0
LEQ nk.IS0 (SUB n k) test if n <= k
EQ nk.AND (LEQ n k) (LEQ k n) test if n = k
GT nk.B1
NOT LEQ test if n > k
λ
JS V(I)(M)
// f => f(I)(M)
V I M
= (f.f I M)
V := abf.fab
V = a => b => f => f(a)(b)
Slide 277
Slide 277 text
λ
JS V(I)(M)(K)
// (f => f(I)(M))(K) === ?
V I M K
= (f.f I M) K = ?
V := abf.fab
V = a => b => f => f(a)(b)
Slide 278
Slide 278 text
λ
JS V(I)(M)(K)
// (f => f(I)(M))(K) === I
V I M K
= (f.f I M) K = I
V := abf.fab
V = a => b => f => f(a)(b)
Slide 279
Slide 279 text
λ
JS
V I M KI
= (f.f I M) KI = M
V := abf.fab
V = a => b => f => f(a)(b)
V(I)(M)(KI)
// (f => f(I)(M))(KI) === M
Slide 280
Slide 280 text
No content
Slide 281
Slide 281 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
B1
Blackbird fgab.f(gab) = BBB 1°←2° composition (.) . (.)
Slide 282
Slide 282 text
CHURCH PAIRS
Sym. Name -Calculus Use
PAIR abf.fab = V pair two arguments
FST p.pK extract first of pair
SND p.p(KI) extract second of pair
Φ PHI p.PAIR (SND p) (SUCC (SND p) copy 2nd to 1st, inc 2nd
SET1ST cp.PAIR c (SND p) set first, immutably
SET2ND cp.PAIR (FST p) c set second, immutably
Slide 283
Slide 283 text
FST := p.pK
SND := p.p(KI)
Slide 284
Slide 284 text
CHURCH PAIRS
Sym. Name -Calculus Use
PAIR abf.fab = V pair two arguments
FST p.pK extract first of pair
SND p.p(KI) extract second of pair
Φ PHI p.PAIR (SND p) (SUCC (SND p) copy 2nd to 1st, inc 2nd
SET1ST cp.PAIR c (SND p) set first, immutably
SET2ND cp.PAIR (FST p) c set second, immutably
CHURCH PAIRS
Sym. Name -Calculus Use
PAIR abf.fab = V pair two arguments
FST p.pK extract first of pair
SND p.p(KI) extract second of pair
Φ PHI p.PAIR (SND p) (SUCC (SND p) copy 2nd to 1st, inc 2nd
SET1ST cp.PAIR c (SND p) set first, immutably
SET2ND cp.PAIR (FST p) c set second, immutably
λ
JS pred = n => fst(n(phi)(pair(n0)(n0)))
PRED := n.FST (n Φ (PAIR N0 N0))
Slide 300
Slide 300 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 301
Slide 301 text
…
SUB LEQ EQ GT
Slide 302
Slide 302 text
λ
JS sub = n => k => k(pred)(n)
SUB := nk.k PRED n
Slide 303
Slide 303 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 304
Slide 304 text
λ
JS leq = n => k => is0(sub(n)(k))
LEQ := nk.IS0 (SUB n k)
Slide 305
Slide 305 text
λ
JS eq = n => k => and(leq(n)(k))(leq(k)(n))
EQ := nk.AND(LEQ n k)(LEQ k n)
Slide 306
Slide 306 text
CHURCH ARITHMETIC: BOOLEAN OPS
Name -Calculus Use
IS0 n.n (K F) T test if n = 0
LEQ nk.IS0 (SUB n k) test if n <= k
EQ nk.AND (LEQ n k) (LEQ k n) test if n = k
GT nk.B1
NOT LEQ test if n > k
Slide 307
Slide 307 text
λ
JS eq = n => k => not(leq(n)(k))
GT := nk.NOT (LEQ n k)
Slide 308
Slide 308 text
λ
JS eq = n => k => not(leq(n)(k))
GT := nk.NOT (LEQ n k)
Slide 309
Slide 309 text
λ
JS eq = B(not)(leq) ???
GT := B NOT LEQ ???
Slide 310
Slide 310 text
λ
JS eq = B(not)(leq)
GT := B NOT LEQ
Slide 311
Slide 311 text
λ
JS eq = n => k => not(leq(n)(k))
GT := nk.NOT (LEQ n k)
CHURCH ARITHMETIC: BOOLEAN OPS
Name -Calculus Use
IS0 n.n (K F) T test if n = 0
LEQ nk.IS0 (SUB n k) test if n <= k
EQ nk.AND (LEQ n k) (LEQ k n) test if n = k
GT nk.B1
NOT LEQ test if n > k
Slide 315
Slide 315 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
B1
Blackbird fgab.f(gab) 1°←2° composition
Slide 316
Slide 316 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
B1
Blackbird fgab.f(gab) = BBB 1°←2° composition (.) . (.)
Slide 317
Slide 317 text
B C K I
KI = K I = C K
B1
= B B B
Th
= C I
V = B C Th
= B C (C I)
Slide 318
Slide 318 text
QUESTION
how many combinators
are needed to form a basis?
20? 10? 5?
Slide 319
Slide 319 text
STARLING · KESTREL
S := abc.ac(bc)
K := ab.a
Slide 320
Slide 320 text
THE
SK
COMBINATOR
CALCULUS
Slide 321
Slide 321 text
I = S K K
Slide 322
Slide 322 text
I = S K K
V = (S(K((S((S(K((
S(KS))K)))S))(KK))))
((S(K(S((SK)K))))K)
Slide 323
Slide 323 text
seriously though,
why?
Slide 324
Slide 324 text
No content
Slide 325
Slide 325 text
No content
Slide 326
Slide 326 text
No content
Slide 327
Slide 327 text
No content
Slide 328
Slide 328 text
…
ADDENDUM
Slide 329
Slide 329 text
COMBINATORS
Sym. Bird -Calculus Use Haskell
I Idiot a.a identity id
M Mockingbird f.ff self-application (cannot define)
K Kestrel ab.a true, first, const const
KI Kite ab.b = KI = CK false, second const id
C Cardinal fab.fba reverse arguments flip
B Bluebird fga.f(ga) 1°←1° composition (.)
Th
Thrush af.fa = CI hold an argument flip id
V Vireo abf.fab = BCT hold a pair of args flip . flip id
B1
Blackbird fgab.f(gab) = BBB 1°←2° composition (.) . (.)
Slide 330
Slide 330 text
CHURCH ENCODINGS: BOOLEANS
Sym. Name -Calculus Use
T TRUE ab.a = K = C(KI) encoding for true
F FALSE ab.b = KI = CK encoding for false
NOT p.pFT or C negation
AND pq.pqF or pq.pqp conjunction
OR pq.pTq or pq.ppq = M* disjunction
BEQ pq.p q (NOT q) equality
Slide 331
Slide 331 text
CHURCH ENCODINGS: NUMERALS
Sym. Name -Calculus Use
N0 ZERO fa.a = F apply f no times to a
N1 ONCE fa.f a = I* apply f once to a
N2 TWICE fa.f (f a) apply 2-fold f to a
N3 THRICE fa.f (f (f a)) apply 3-fold f to a
N4 FOURFOLD fa.f (f (f (f a))) apply 4-fold f to a
N5 FIVEFOLD fa.f (f (f (f (f a))))) apply 5-fold f to a
Slide 332
Slide 332 text
CHURCH ARITHMETIC
Name -Calculus Use
SUCC nf.B f (nf) = nfa.f(nfa) successor of n
ADD nk.n SUCC k = nkf.B (n f) (k f) addition of n and k
MULT nkf.n(kf) = B multiplication of n and k
POW nk.kn = Th
raise n to the power of k
PRED n.n (g.IS0 (g N1) I (B SUCC g)) (K N0) N0 predecessor of n
PRED n.FST (n Φ (PAIR N0 N0)) predecessor of n (easier)
SUB nk.k PRED n subtract k from n
Slide 333
Slide 333 text
CHURCH ARITHMETIC: BOOLEAN OPS
Name -Calculus Use
IS0 n.n (K F) T test if n = 0
LEQ nk.IS0 (SUB n k) test if n <= k
EQ nk.AND (LEQ n k) (LEQ k n) test if n = k
GT nk.B1
NOT LEQ test if n > k
Slide 334
Slide 334 text
CHURCH PAIRS
Sym. Name -Calculus Use
PAIR abf.fab = V pair two arguments
FST p.pK extract first of pair
SND p.p(KI) extract second of pair
Φ PHI p.PAIR (SND p) (SUCC (SND p) copy 2nd to 1st, inc 2nd
SET1ST cp.PAIR c (SND p) set first, immutably
SET2ND cp.PAIR (FST p) c set second, immutably
Slide 335
Slide 335 text
f.M(x.f(Mx))
THE Y FIXED-POINT COMBINATOR
Slide 336
Slide 336 text
EVALUATION STRATEGIES
(ab.b)((f.ff)f.ff) x
= (b.b) x
= x
(ab.b)((f.ff)f.ff)x
= (ab.b)((f.ff)f.ff)x
= (ab.b)((f.ff)f.ff)x
= (ab.b)((f.ff)f.ff)x
= (ab.b)((f.ff)f.ff)x
C A L L B Y N A M E
(apply to args before reduction)
C A L L B Y VA L U E
(reduce args before application)
(AKA normal order; lazy) (AKA applicative order; strict)
Slide 337
Slide 337 text
f.M(x.f(v.Mxv))
THE Z FIXED-POINT COMBINATOR
Slide 338
Slide 338 text
ADDITIONAL RESOURCES
Combinator Birds · Rathman · http://bit.ly/2iudab9
To Mock a Mockingbird · Smullyan · http://amzn.to/2g9AlXl
To Dissect a Mockingbird · Keenan · http://dkeenan.com/Lambda
.:.
A Tutorial Introduction to the Lambda Calculus · Rojas · http://bit.ly/1agRC97
Lambda Calculus · Wikipedia · http://bit.ly/1TsPkGn
The Lambda Calculus · Stanford · http://stanford.io/2vtg8hp
.:.
History of Lambda-calculus and Combinatory Logic
Cardone, Hindley · http://bit.ly/2wCxv4k
.:.
An Introduction to Functional Programming
through Lambda Calculus · Michaelson · http://amzn.to/2vtts56