Gabriel Lebec
October 15, 2019
1.4k

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

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

15. ### -CALCULUS SYNTAX expression ::= variable identifier | expression expression application

| variable . expression abstraction | ( expression ) grouping

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

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

:= 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

:= 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

again

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

again β-NORMAL FORM

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

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

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

97. ### SCHÖNFINKEL CURRY SMULLYAN Identitätsfunktion Konstante Funktion verSchmelzungsfunktion verTauschungsfunktion Zusammensetzungsf. I

K  S  C  B Idiot  Kestrel  Starling  Cardinal  Bluebird Ibis?

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 Sym. Bird -Calculus Use Haskell 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

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 Sym. Bird -Calculus Use Haskell 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

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

128. ### EVERYTHING CAN BE FUNCTIONS *though not everything IS or  SHOULD

BE functions **but maybe more than you expect

// true

// false

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

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

?.?

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

OR := pq.…

OR := pq.p?¿

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

q

q

q

q

q

q
173. ### ( ) pq.p ( ) T T F F q

q BOOLEAN EQUALITY

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

20? 10? 5?

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

ι(ι(ιι)) S := ι(ι(ι(ιι)))

201. ### COMBINATORS Sym. Bird -Calculus Use Haskell 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
207. ### 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