1 / 38

Introduction to Lambda Calculus

Introduction to Lambda Calculus. References: [1] H.P . Barendregt . The Lambda Calculus, Its Syntax and Semantics, 1995. [2] Raul Rojas. A tutorial introduction to Lambda calculus. http :// www.inf.fu-berlin.de / lehre /WS03/ alpi / lambda.pdf. Roadmap. History Syntax Semantics

amory
Download Presentation

Introduction to Lambda Calculus

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introduction to Lambda Calculus References: [1] H.P. Barendregt. The Lambda Calculus, Its Syntax and Semantics, 1995. [2] Raul Rojas. A tutorial introduction to Lambda calculus. http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf

  2. Roadmap • History • Syntax • Semantics • Expressiveness

  3. History • in 1930s by Alonzo Church to study computations with functions • Church wanted a minimal notation to expose only what is essential • Two operations with functions are essential: • function creation • function application

  4. Function creation • Church introduced the notation lx. E to denote a function with formal argument x and with body E • Functions do not have names • names are not essential for the computation • Functions have a single argument

  5. Function application • The only thing that we can do with a function is to apply it to an argument • Church used the notation E1 E2 to denote the application of function E1 to actual argument E2 • All functions are applied to a single argument

  6. Why Lambda calculus important? • l-calculus has had a tremendous influence on the design and analysis of programming languages • l-calculus is the standard testbed for studying programming language features “Whatever the next 700 languages turn out to be, they will surely be variants of lambda calculus.” (Peter Landin1966)

  7. Roadmap • History • Syntax • Semantics • Expressiveness

  8. Syntax E ::= x variables | E1 E2function application | lx. E function creation • The form lx. E is also called lambda abstraction, or simply abstraction • E are called l-terms or l-expressions

  9. Example expressions • The identity function: I = lx. x • A function that given an argument y discards it: ly. (lx. x) • A function that given a function f invokes it on the identity function lf. f (l x. x)

  10. Scope • An abstraction lx. Ebinds variable x in E • x is the newly introduced variable • E is the scope of x • we say x is bound in lx. E • Just like formal function arguments are bound in the function body

  11. Free and bound variables • We can define the free variables of an expression E recursively as follows: Free(x) = { x} Free(E1 E2) = Free(E1) È Free(E2) Free(lx. E) = Free(E) - { x } • Example: Free(lx. x (ly. x y z)) = { z}

  12. Shadowing • Just like in any language with static nested scoping, we have to worry about variable shadowing • An occurrence of a variable might refer to different things in different context • In l-calculus: lx. x (lx. x) x

  13. α-conversion • Two l-terms are α-equivalent if they can be obtained from each other by a renaming of the bound variables • Example: lx. x is identical to ly. y and to lz. z • However, lx. xzis identical to ly. yz , but not identical to lz. zz

  14. Roadmap • History • Syntax • Semantics • Expressiveness

  15. Substitution • The substitution of E’ for x in E: [E’/x]E • Step 1. Rename bound variables in E and E’so they are unique • Step 2. Perform the textual substitution of E’for x in E • Example: [y (lx. x) / x] ly. (lx. x) y x • After renaming: [y (lv. v)/x] lz. (lu. u) z x • After substitution: lz. (lu. u) z (y (lv. v))

  16. b-reduction • There is one key evaluation step in l-calculus: the function application (lx. E) E’evaluates to [E’/x]E • This is called b-reduction • E ®bE’ : E’ is obtained from E in one b-reduction step • ®*b : the transitive closure of ®b

  17. Example b-reduction • Another example with the identity: (lf. f (lx. x)) (lx. x) ®[lx. x / f] f (lx. x)) = [(lx. x) / f] f (ly. y)) = (lx. x) (ly. y) ®[ly. y /x] x = ly. y • A non-terminating evaluation: (lx. xx)(lx. xx)® [lx. xx / x]xx = [ly. yy / x]xx = (ly. yy)(ly. yy)®…

  18. Higher order and Currying • The l-termlx. ly. add x y can be used to add two arguments E1 and E2: (lx. ly. add x y) E1 E2 ®b ([E1/x] ly. add x y) E2 = (ly. add E1 y) E2 ®b[E2/y] add E1 y = add E1E2 • What is the result of (lx. ly. add x y) E ? • It is ly. add E y

  19. Static scoping • The definition of substitution guarantees that evaluation respects static scoping: (l x. (ly. y x)) (y (lx. x))®blz. z (y (lv. v)) (y remains free, i.e., defined externally) • If we forget to rename the bound y: (l x. (ly. y x)) (y (lx. x))®*bly. y (y (lv. v)) (y was free before but is bound now)

  20. Full b-reduction e1 --> e1’ e1 e2 --> e1’e2 (l x.e’) e --> [e/x] e’ e2 --> e2’ e1 e2 --> e1 e2’ e --> e’ lx.e--> lx.e’

  21. The order of evaluation • In a l-term, there could be more than one instance of (l x. E) E’ (l y. (l x. x) y) E • could reduce the inner or the outer l (l y. (l x. x) y) E inner outer (ly. [y/x] x) E = (ly. y) E [E/y] (lx. x) y =(lx. x) E E

  22. Church-Rosser Theorem • (Church-Rosser Theorem) Any order will compute the same value • Fix the order of evaluation when we model a certain language (deterministic) • In (typical) programming languages, we do not reduce the bodies of functions (under a l)

  23. Call-by-name e1 --> e1’ e1 e2 --> e1’e2 (l x.e’) e --> [e/x] e’

  24. Call-by-name • Do not evaluate under a l • Do not evaluate the argument prior to call • Example: (ly. (lx. x) y) ((lu. u) (lv. v))®bn (lx. x) ((lu. u) (lv. v))®bn (lu. u) (lv. v)®bn lv. v

  25. Call-by-value e1 --> e1’ e1 e2 --> e1’e2 (l x.e’) v --> [v/x] e’ e2 --> e2’ (l x.e1) e2 --> (l x.e1) e2’

  26. Call-by-value • Do not evaluate under l • Evaluate an argument prior to call • Example: (ly. (lx. x) y) ((lu. u) (lv. v))®bv (ly. (lx. x) y) (lv. v)®bv (lx. x) (lv. v)®bv lv. v

  27. CBV and CBN • CBN • difficult to implement • order of side effects not predictable • CBV: • easy to implement efficiently • might not terminate even if CBN might terminate • Example: (lx. lz.z) ((ly. yy) (lu. uu))

  28. Roadmap • History • Syntax • Semantics • Expressiveness

  29. Lambda calculus and PL • Pure lambda calculus has only functions • What if we want to compute with booleans, numbers, lists, recursions, etc.? • All these can be encoded in pure l-calculus and pure l-calculus is Turing Complete!

  30. Encoding booleans • A boolean is a function that given two choices selects one of them • true =deflx. ly. x • false =deflx. ly. y • if E1 then E2 else E3 =defE1 E2 E3 • Example: if true then u else v is (lx. ly. x) u v®b(ly. u) v®bu Is there any problem with this encodings under CBV?

  31. Encoding pairs • A pair is a function that given a boolean returns the left or the right element mkpair=deflx. ly. lb. b x y fst=deflp. p true snd=deflp. p false • Example: fst (mkpair x y) ® (mkpair x y) true ® true x y ®x

  32. Encoding recursion • Write a function that takes an f and calls it in place of recursion • Example (in enriched language):lf. lx. if (x = 0) then 1 else x *f(x – 1) • Then apply “fix” to it to get a recursive function:“fix” l f. l x. if (x = 0) then 1 else x *f(x – 1) • “fix” is Y-combinator

  33. Y-combinator • Y = l g.(l x. g (xx))(lx.g (xx))) • Y g = g (Y g)[fixed point] • Y (lf. l x. if (x = 0) then 1 else x *f(x – 1))

  34. Encoding numbers • A natural number is a function that given an operation sand a starting value z, applies sa number of times to z: • Church numbers 0 =defls. lz. z 1 =defls. lz. s z 2 =defls. lz. s (s z) and so on

  35. Encoding numbers • The successor function succ n =deflf. ls. f (n f s) • Addition add n1 n2 =defn1succ n2 • Multiplication mult n1 n2 =defn1 (add n2) 0 • Testing equality with 0 iszero n =defn (lb. false) true

  36. Example mult 2 2 ®2 (add 2) 0 ®(add 2) ((add 2) 0) ® 2 succ (add 2 0) ®2 succ (2 succ 0) ® succ (succ (succ (succ 0))) ® succ (succ (succ (lf. ls. f (0 f s)))) ® succ (succ (succ (lf. ls. f s))) ® succ (succ (lg. ly. g ((lf. ls. f s) g y))) succ (succ (lg. ly. g (g y))) ®*lg. ly. g (g (g (g y))) = 4

  37. Expressiveness • These are enough to encode Turing machines • Encodings are fun • But programming in pure l-calculus is painful • we will add constants (0, 1, 2, …, true, false, if-then-else, etc.) • and we need to add types

  38. Roadmap • History • Syntax • Semantics • Expressiveness

More Related