Gabriel Lebec
October 15, 2019
1.1k

# Lambda Calc Talk (Smartly.io Version)

Slightly modified / updated version of my LC talk, delivered for the Smartly.io DevTalks in Helsinki, Finland. For the longer original version, see https://github.com/glebec/lambda-talk. For a follow-up code examples repo including the Z-combinator, see https://github.com/glebec/lambda-talk-practical.

October 15, 2019

## Transcript

1. as.js
A FL O C K of FU N C T I O N S
COMBINATORS, LAMBDA CALCULUS,
& CHURCH ENCODINGS in JAVASCRIPT
Smartly.io Edition

2. glebec
glebec
glebec
glebec
g_lebec

Gabriel Lebec
github.com/glebec/lambda-talk
formerly @
currently @
presenting @
Views and opinions in this presentation
are my own and do not necessarily
represent those of my employer.

3. a.a
IDENTITY

4. λ
JS I = a => a
I := a.a

5. λ
JS I(x) === ?
I x = ?
I := a.a
I = a => a

6. λ
JS I(x) === x
I x = x
I := a.a
I = a => a
(a.a)x = x
(a => a)(x) === x

7. λ
JS I(I) === ?
I I = ?
I := a.a
I = a => a

8. λ
JS I(I) === I
I I = I
I := a.a
I = a => a
(a.a)a.a = a.a

9. id 5 == 5

10. ?

11. a.a
FUNCTION
SIGNIFIER

12. a.a
FUNCTION
SIGNIFIER
PARAMETER VARIABLE

13. a.a
FUNCTION
SIGNIFIER
PARAMETER VARIABLE
RETURN
EXPRESSION

14. a.a
FUNCTION
SIGNIFIER
PARAMETER VARIABLE
RETURN
EXPRESSION
LAMBDA ABSTRACTION

15. -CALCULUS SYNTAX
expression ::= variable identifier
| expression expression application
| variable . expression abstraction
| ( expression ) grouping

16. λ JS

17. VARIABLES
x x
(a) (a)

18. f a f(a)
f a b f(a)(b)
(f a) b (f(a))(b)
f (a b) f(a(b))
APPLICATIONS

19. a.b a => b
a.b x a => b(x)
a.(b x) a => (b(x))
(a.b) x (a => b)(x)
a.b.a a => b => a
a.(b.a) a => (b => a)
ABSTRACTIONS

20. ((a.a)b.c.b)(x)e.f
β-REDUCTION

21. ((a.a)b.c.b)(x)e.f
β-REDUCTION

22. ((a.a)b.c.b)(x)e.f
β-REDUCTION

23. ((a.a)b.c.b)(x)e.f
β-REDUCTION

24. ((a.a)b.c.b)(x)e.f
β-REDUCTION

25. ((a.a)b.c.b)(x)e.f
β-REDUCTION

26. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
β-REDUCTION

27. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
β-REDUCTION

28. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
β-REDUCTION

29. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
β-REDUCTION

30. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
β-REDUCTION

31. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
β-REDUCTION

32. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
β-REDUCTION

33. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
β-REDUCTION

34. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
β-REDUCTION

35. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
β-REDUCTION

36. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
β-REDUCTION

37. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
β-REDUCTION

38. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION

39. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION

40. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION
β-NORMAL FORM

41. ((a.a)b.c.b)(x)e.f
= (b.c.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION*
β-NORMAL FORM
*not covered: evaluation order, variable collision avoidance

42. f.ff
MOCKINGBIRD

43. λ
JS M = f => f(f)
M := f.ff

44. λ
JS M(I) === ?
M I = ?
M := f.ff

45. λ
JS M(I) === I(I)
M I = I I
M := f.ff
(f.ff)a.a = (a.a)a.a

46. λ
JS M(I) === I(I)
&& I(I) === ?
M I = I I = ?
M := f.ff

47. λ
JS M(I) === I(I)
&& I(I) === I
M I = I I = I
M := f.ff
(f.ff)a.a = (a.a)x.x = x.x

48. λ
JS M(M) === ?
M M = ?
M := f.ff

49. λ
JS M(M) === M(M)
M M = M M
M := f.ff
(f.ff)g.gg = (g.gg)g.gg

50. λ
JS M(M) === M(M) === ?
M M = M M = ?
M := f.ff

51. λ
JS M(M) === M(M) ===
M M = M M = M M = …
// stack overflow
M := f.ff
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
(f.ff)g.gg = (g.gg)g.gg = …

52. λ
JS
M M = M M = M M = Ω
// stack overflow
M := f.ff
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M
M(M) === M(M) === M(M) === M(M) === M

53. a.b.c.b a => b => c => b
abc.b a => b => c => b
(a, b, c) => b
=
ABSTRACTIONS, again

54. ((a.a)bc.b)(x)e.f
β-REDUCTION, again

55. ((a.a)bc.b)(x)e.f
β-REDUCTION, again

56. ((a.a)bc.b)(x)e.f
β-REDUCTION, again

57. ((a.a)bc.b)(x)e.f
β-REDUCTION, again

58. ((a.a)bc.b)(x)e.f
β-REDUCTION, again

59. ((a.a)bc.b)(x)e.f
β-REDUCTION, again

60. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again

61. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again

62. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again

63. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again

64. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again

65. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
β-REDUCTION, again

66. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again

67. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again

68. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again

69. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again

70. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again

71. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
β-REDUCTION, again

72. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION, again

73. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION, again

74. ((a.a)bc.b)(x)e.f
= (bc.b) (x)e.f
= (c.x) e.f
= x
β-REDUCTION, again
β-NORMAL FORM

75. ab.a
KESTREL

76. λ
JS K = a => b => a
K := ab.a
= a.b.a

77. λ
JS K(M)(I) === ?
K M I = ?
K := ab.a
K = a => b => a

78. λ
JS K(M)(I) === M
K M I = M
K := ab.a
K = a => b => a
(ab.a)(f.ff)x.x = f.ff

79. λ
JS K(M)(I) === M
K(I)(M) === ?
K M I = M
K I M = ?
K := ab.a
K = a => b => a

80. λ
JS K(M)(I) === M
K(I)(M) === I
K M I = M
K I M = I
K := ab.a
K = a => b => a
(ab.a)(x.x)f.ff = x.x

81. const 7 2 == 7

82. λ
JS K(I)(x) === ?
K I x = ?
K := ab.a
K = a => b => a

83. λ
JS K(I)(x) === I
K I x = I
K := ab.a
K = a => b => a
(ab.a)(i.i)x = (i.i)

84. λ
JS K(I)(x)(y) === I(y)
K I x y = I y
K := ab.a
K = a => b => a
(ab.a)(i.i)xy = (i.i)y

85. λ
JS K(I)(x)(y) === I(y)
&& I(y) === ?
K I x y = I y = ?
K := ab.a
K = a => b => a

86. λ
JS
K I x y = I y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === I(y)
&& I(y) === y
(ab.a)(i.i)xy = (i.i)y = y

87. λ
JS
K I x y = I y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === I(y)
&& I(y) === y

88. λ
JS
K I x y = I y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === I(y)
&& I(y) === y

89. λ
JS
K I x y = y
K := ab.a
K = a => b => a
K(I)(x)(y) === y

90. ab.b
KITE

91. λ
JS KI = a => b => b
KI = K(I)
KI := ab.b
= K I

92. λ
JS KI(M)(K) === ?
KI M K = ?
KI := ab.b
KI = a => b => b

93. λ
JS KI(M)(K) === K
KI M K = K
KI := ab.b
KI = a => b => b
(ab.b)(f.ff)ab.a = ab.a

94. λ
JS KI(M)(K) === K
KI(K)(M) === ?
KI M K = K
KI K M = ?
KI := ab.b
KI = a => b => b

95. λ
JS KI(M)(K) === K
KI(K)(M) === M
KI M K = K
KI K M = M
KI := ab.b
KI = a => b => b
(ab.b)(f.ff)ab.a = f.ff

96. ?

97. SCHÖNFINKEL CURRY SMULLYAN
Identitätsfunktion
Konstante Funktion
verSchmelzungsfunktion
verTauschungsfunktion
Zusammensetzungsf.
I
K
S
C
B
Idiot
Kestrel
Starling
Cardinal
Bluebird
Ibis?

98. ?

99. 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
PÉTER

100. 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
PÉTER

101. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

102. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

103. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

104. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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 )
VON NEUMANN ROSSER
PÉTER

105. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

106. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

107. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
IN C O M P L E T E N E S S TH E O R E M S
1931
GE N E R A L RE C U R S I O N TH E O RY
VON NEUMANN ROSSER
PÉTER

108. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH TURING
KLEENE
VON NEUMANN ROSSER
RE C U R S I V E FU N C T I O N TH E O RY
RE K U R S I V E FU N K T I O N E N
1932
GÖDEL PÉTER

109. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
-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
VON NEUMANN ROSSER
PÉTER

110. PEANO
FREGE
RUSSELL
SCHÖNFINKEL 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
VON NEUMANN PÉTER

111. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

112. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

113. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

114. PEANO
FREGE
RUSSELL
SCHÖNFINKEL CURRY CHURCH
GÖDEL
TURING
KLEENE
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
VON NEUMANN ROSSER
PÉTER

115. 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

116. COMBINATORS
I Idiot a.a identity id
M Mockingbird f.ﬀ self-application (cannot deﬁne)
K Kestrel ab.a ﬁrst, 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

117. CARDINAL
fab.fba

118. λ
JS C = f => a => b => f(b)(a)
C := fab.fba

119. λ
JS C(K)(I)(M) === ?
C K I M = ?
C := fab.fba
C = f => a => b => f(b)(a)

120. λ
JS C(K)(I)(M) === M
C K I M = M
C := fab.fba
C = f => a => b => f(b)(a)

121. λ
JS C(K)(I)(M) === M
C K I M = M
C := fab.fba
C = f => a => b => f(b)(a)

122. λ
JS KI(I)(M) === M
KI I M = M
C := fab.fba
C = f => a => b => f(b)(a)

123. COMBINATORS
I Idiot a.a identity id
M Mockingbird f.ﬀ self-application (cannot deﬁne)
K Kestrel ab.a ﬁrst, 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

124. flip const 1 8 == 8

125. so?

126. -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

127. TM

128. EVERYTHING
CAN BE
FUNCTIONS
*though not everything IS or
SHOULD BE functions
**but maybe more than you expect

129. !x == y || (a && z)

130. !x == y || (a && z)

131. how‽

132. λ
JS const result = bool ? exp1 : exp2

133. λ
JS const result = bool ? exp1 : exp2
// true

134. λ
JS const result = bool ? exp1 : exp2
// false

135. λ
JS const result = bool ? exp1 : exp2
result := ?

136. λ
JS const result = bool ? exp1 : exp2
result := bool ? exp1 : exp2

137. λ
JS const result = bool ? exp1 : exp2
result := bool ? exp1 : exp2

138. λ
JS const result = bool ? exp1 : exp2
result := bool exp1 exp2

139. λ
JS const result = bool (exp1) (exp2)
result := func exp1 exp2

140. λ
JS
result := func exp1 exp2
const result = bool (exp1) (exp2)
// true

141. λ
JS
result := func exp1 exp2
const result = bool (exp1) (exp2)
// false

142. λ
JS const result = bool (exp1) (exp2)
result := func exp1 exp2
TRUE
FALSE

143. λ
JS const result = bool (exp1) (exp2)
result := func exp1 exp2
K
KI

144. λ
JS const T = K
const F = KI
TRUE := K
FALSE := KI = C K
CHURCH ENCODINGS: BOOLEANS

145. λ
JS p

146. λ
JS !p

147. λ
JS !p
! p

148. λ
JS not(p)
NOT p

149. λ
JS not(p)
NOT p
F
T
F
T

150. λ
JS C(K) (chirp)(tweet) === tweet
C(KI)(chirp)(tweet) === chirp
C K = KI
C (KI) = K

151. λ
JS C(T) (chirp)(tweet) === tweet
C(F) (chirp)(tweet) === chirp
C T = F
C F = T

152. 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

153. λ
JS const and = ? => ?
AND := ?.?

154. λ
JS const and = p => q => ?
AND := pq.?

155. λ
JS const and = p => q => p(?)(¿)
AND := pq.p?¿

156. λ
JS const and = p => q => p(?)(¿)
AND := pq.p?¿
F
F

157. λ
JS const and = p => q => p(?)(F)
AND := pq.p?F

158. λ
JS const and = p => q => p(?)(F)
AND := pq.p?F
T
T

159. λ
JS const and = p => q => p(q)(F)
AND := pq.pqF

160. λ
JS const and = p => q => p(q)(p)
AND := pq.pqp

161. 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

162. λ
JS const or = p => q => …
OR := pq.…

163. λ
JS const or = p => q => p(?)(¿)
OR := pq.p?¿

164. λ
JS const or = p => q => p(p)(q)
OR := pq.ppq

165. 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

166. ( )
pq.p( ) T
T F F
q
q
p => q => p(q(T)(F))(q(F)(T))

167. ( )
pq.p
( )
T
T F
F
q
q

168. ( )
pq.p
( )
T
T
F
F
q
q

169. ( )
pq.p
( )
T
T
F
F
q
q

170. ( )
pq.p
( )
T
T
F
F
q
q

171. ( )
pq.p
( )
T
T
F
F
q
q

172. ( )
pq.p
( )
T
T
F
F
q
q

173. ( )
pq.p
( )
T
T
F
F
q
q
BOOLEAN EQUALITY

174. pq.p
( )
T
F
q
q

175. ( )
pq.p
q
NOT
q

176. ( )
pq.p q
q NOT
p => q => p(q)(not(q))

177. 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

178. (ONE OF) DE MORGAN'S LAWS
¬(P ∧ Q) = (¬P) ∨ (¬Q)
BEQ (NOT (AND p q)) (OR (NOT p) (NOT q))
!(p && q) === (!p) || (!q)

179. 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))

180. 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))

181. 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))

182. 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))

183. 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))

184. 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))

185. 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))

186. 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))

187. WHAT ELSE CAN WE INVENT?
numbers
arithmetic
data structures
type systems
recursion
Sorry… can't ﬁt them all in today!
See part II online

188. QUESTION
how many combinators
are needed to form a basis?

189. QUESTION
how many combinators
are needed to form a basis?
20? 10? 5?

190. STARLING · KESTREL
S := abc.ac(bc)
K := ab.a

191. THE
SK
COMBINATOR
CALCULUS

192. I = ?

193. I = S K K

194. I = S K K
V = ?

195. I = S K K
V = (S(K((S((S(K((
S(KS))K)))S))(KK))))
((S(K(S((SK)K))))K)

196. IOTA
ι := f.(f abc.ac(bc))xy.x
I := ιι
K := ι(ι(ιι))
S := ι(ι(ι(ιι)))

197. seriously though,
why?

198. f.(x.f(xx))(x.f(xx))
THE Y FIXED-POINT COMBINATOR

199. f.(x.f(v.xxv))(x.f(v.xxv))
THE Z FIXED-POINT COMBINATOR

201. COMBINATORS
I Idiot a.a identity id
M Mockingbird f.ﬀ self-application (cannot deﬁne)
K Kestrel ab.a true, ﬁrst, 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 (.) . (.)

202. 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

203. 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

204. 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

205. 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

206. CHURCH PAIRS
Sym. Name -Calculus Use
PAIR abf.fab = V pair two arguments
FST p.pK extract ﬁrst 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 ﬁrst, immutably
SET2ND cp.PAIR (FST p) c set second, immutably