Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Lambda Calc Talk (ConsenSys Condensed Version)

Lambda Calc Talk (ConsenSys Condensed Version)

Truncated version of my LC talk, delivered for a remote talk. For the longer original version, see https://github.com/glebec/lambda-talk. For the follow-up code examples repo including the Z-combinator, see https://github.com/glebec/lambda-talk-practical.

Gabriel Lebec

July 11, 2019
Tweet

More Decks by Gabriel Lebec

Other Decks in Programming

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 ConsenSys Crash Course
 Edition™
  2. λ JS I(x) === ? I x = ? I

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

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

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

    := a.a I = a => a
  6. ?

  7. -CALCULUS SYNTAX expression ::= variable identifier | expression expression application

    | variable . expression abstraction | ( expression ) grouping
  8. f a f(a) f a b f(a)(b) (f a) b

    (f(a))(b) f (a b) f(a(b)) APPLICATIONS
  9. 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
  10. ((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
  11. λ JS M(I) === I(I) && I(I) === ? M

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

    I = I I = I M := f.ff
  13. λ 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
  14. λ 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
  15. a.b.c.b a => b => c => b abc.b a

    => b => c => b (a, b, c) => b = ABSTRACTIONS, again
  16. λ JS K = a => b => a K

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

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

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

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

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

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

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

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

    I x y = I y = ? K := ab.a K = a => b => a
  25. λ JS K I x y = I y =

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

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

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

    = K(I) KI := ab.b = K I
  29. λ JS KI(M)(K) === ? KI M K = ?

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

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

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

    K = K KI K M = M KI := ab.b KI = a => b => b
  33. ?

  34. ?

  35. 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
  36. 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
  37. 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
  38. 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
  39. 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 GE N E R A L RE C U R S I O N TH E O RY
  40. RÓZSA PÉTER (POLITZER) RE C U R S I V

    E FU N C T I O N TH E O RY 1932 RE K U R S I V E FU N K T I O N E N ConsenSys Crash Course
 Edition™
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. λ JS C = f => a => b =>

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

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

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

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

    C := fab.fba C = f => a => b => f(b)(a)
  54. 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
  55. so?

  56. -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
  57. TM

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

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

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

    result := bool exp1 exp2
  61. λ JS result := func exp1 exp2 const result =

    bool (exp1) (exp2) // false
  62. λ JS const T = K const F = KI

    TRUE := K FALSE := KI = C K CHURCH ENCODINGS: BOOLEANS
  63. 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
  64. 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
  65. (ONE OF) DE MORGAN'S LAWS ¬(P ∧ Q) = (¬P)

    ∨ (¬Q) BEQ (NOT (AND p q)) (OR (NOT p) (NOT q)) !(p && q) === (!p) || (!q)
  66. 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))
  67. 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))
  68. 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))
  69. 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))
  70. 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))
  71. 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))
  72. 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))
  73. 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))
  74. IOTA ι := f.(f abc.ac(bc))ab.a I := ιι K :=

    ι(ι(ιι)) S := ι(ι(ι(ιι)))
  75. pseudo-recursive functorial to invoke THE Z FIXED-POINT COMBINATOR Z =

    f => M(x => f(v => x(x)(v))) “engine” which invents recursion ConsenSys Crash Course
 Edition™
  76. RECURSIVE fact = 
 n => 
 (n > 0)

    ? n * (n - 1) : 1 fact
  77. 
 (n > 0) ? n * (n - 1)

    : 1 “PSEUDO-RECURSIVE” pseudoFact = 
 n => f f => replaced recursive call with parameter
  78. RECURSIVE VS.PSUEDO-RECURSIVE rec = a => ___ rec(x)
 
 pseudoRec

    = step => a => ___ step(x) rec = Z(pseudoRec) rec(input) -> result
  79. 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 (.) . (.)
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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