Download presentation
Presentation is loading. Please wait.
Published byJason Conley Modified over 9 years ago
1
CSE 230 The -Calculus
2
Background Developed in 1930’s by Alonzo Church Studied in logic and computer science Test bed for procedural and functional PLs Simple, Powerful, Extensible “Whatever the next 700 languages turn out to be, they will surely be variants of lambda calculus.” (Landin ’66)
3
Syntax Three kinds of expressions (terms): e ::= x Variables | x.e Functions ( -abstraction) | e 1 e 2 Application
4
Application associates to the left x y z means (x y) z Abstraction extends as far right as possible: x. x y. x y z means x.(x ( y. ((x y) z))) Syntax
5
Examples of Lambda Expressions Identity function I = def x. x A function that always returns the identity fun y. ( x. x) A function that applies arg to identity function: f. f ( x. x)
6
Scope of an Identifier (Variable) “part of program where variable is accessible”
7
Free and Bound Variables x. E Abstraction binds variable x in E x is the newly introduced variable E is the scope of x x is bound in x. E
8
y is free in E if it occurs not bound in E Free(x) = {x} Free( E 1 E 2 ) = Free(E 1 ) Free(E 2 ) Free( x. E) = Free(E) - { x } e.g: Free( x. x ( y. x y z) ) = { z } Free and Bound Variables
9
Renaming Bound Variables -renaming -terms after renaming bound variables Considered identical to original Example: x. x == y. y == z. z Rename bound variables so names unique x. x ( y.y) x instead of x. x ( x.x) x Easy to see the scope of bindings
10
Substitution [E’/x] E : Substitution of E’ for x in E 1.Uniquely rename bound vars in E and E’ 2.Do textual substitution of E’ for x in E Example: [y ( x. x)/x] y. ( x. x) y x 1.After renaming: [y ( v. v)/x] z. ( u. u) z x 2.After substitution: z. ( u. u) z (y ( v. v))
11
Semantics (“Evaluation”) The evaluation of ( x. e) e’ 1.binds x to e’ 2.evaluates e with the new binding 3.yields the result of this evaluation
12
Semantics: Beta-Reduction ( x. e) e’ [e’/x]e
13
Semantics (“Evaluation”) The evaluation of ( x. e) e’ 1.binds x to e’ 2.evaluates e with the new binding 3.yields the result of this evaluation Example: ( f. f (f e)) g g (g e)
14
Another View of Reduction APP x. x x x ee’ e Terms can grow substantially by reduction
15
Examples of Evaluation Identity function ( x. x) E [E / x] x = E
16
Examples of Evaluation … yet again ( f. f ( x. x)) ( x. x) [ x. x / f] f ( x. x) = [( x. x) / f] f ( y. y) = ( x. x) ( y. y) [ y. y /x] x = y. y
17
Examples of Evaluation ( x. x x)( y. y y) [ y. y y / x] x x = ( y. y y)( y. y y) = ( x. x x)( y. y y) … … A non-terminating evaluation !
18
Review A calculus of functions: e := x | x. e | e 1 e 2 Eval strategies = “Where to reduce” ? Normal, Call-by-name, Call-by-value Church-Rosser Theorem Regardless of strategy, upto one “normal form”
19
Programming with the -calculus -calculus vs. “real languages” ? Local variables? Bools, If-then-else ? Records? Integers ? Recursion ? Functions: well, those we have …
20
Local Variables (Let Bindings) let x = e 1 in e 2 is just ( x. e 2 ) e 1
21
Programming with the -calculus -calculus vs. “real languages” ? Local variables (YES!) Bools, If-then-else ? Records? Integers ? Recursion ? Functions: well, those we have …
22
Encoding Booleans in -calculus What can we do with a boolean? Make a binary choice How can you view this as a “function” ? Bool is a fun that takes two choices, returns one
23
Encoding Booleans in -calculus Bool = fun, that takes two choices, returns one true = def x. y. x false = def x. y. y if E 1 then E 2 else E 3 = def E 1 E 2 E 3 Example: “if true then u else v” is ( x. y. x) u v ( y. u) v u
24
Boolean Operations: Not, Or Boolean operations: not Function takes b: returns function takes x,y: returns “opposite” of b’s return not = def b.( x. y. b y x) Boolean operations: or Function takes b 1, b 2 : returns function takes x,y: returns (if b 1 then x else (if b 2 then x else y)) or = def b 1. b 2.( x. y. b 1 x (b 2 x y))
25
Programming with the -calculus -calculus vs. “real languages” ? Local variables (YES!) Bools, If-then-else (YES!) Records? Integers ? Recursion ? Functions: well, those we have …
26
Encoding Pairs (and so, Records) What can we do with a pair ? Select one of its elements Pair = function takes a bool, returns the left or the right element mkpair e 1 e 2 = def b. b e 1 e = “function-waiting-for-bool” fst p = def p true snd p = def p false
27
Encoding Pairs (and so, Records) mkpair e 1 e 2 = def b. b e 1 e fst p = def p true snd p = def p false Example fst (mkpair x y) (mkpair x y) true true x y x
28
Programming with the -calculus -calculus vs. “real languages” ? Local variables (YES!) Bools, If-then-else (YES!) Records (YES!) Integers ? Recursion ? Functions: well, those we have …
29
Encoding Natural Numbers What can we do with a natural number ? Iterate a number of times over some function n = function that takes fun f, starting value s, returns: f applied to s “n” times 0 = def f. s. s 1 = def f. s. f s 2 = def f. s. f (f s) Called Church numerals (Unary Representation) (n f s) = apply f to s “n” times, i.e. f n (s)
30
Operating on Natural Numbers Testing equality with 0 iszero n = def n ( b. false) true iszero = def n.( b.false) true Successor function succ n = def f. s. f (n f s) succ = def n. f. s. f (n f s) Addition add n 1 n 2 = def n 1 succ n 2 add = def n 1. n 2. n 1 succ n 2 Multiplication mult n 1 n 2 = def n 1 (add n 2 ) 0 mult = def n 1. n 2. n 1 (add n 2 ) 0
31
Example: Computing with Naturals What is the result of add 0 ? ( n 1. n 2. n 1 succ n 2 ) 0 n 2. 0 succ n 2 = n 2. ( f. s. s) succ n 2 n 2. n 2 = x. x
32
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 ( f. s. f (0 f s)))) succ (succ (succ ( f. s. f s))) succ (succ ( g. y. g (( f. s. f s) g y))) succ (succ ( g. y. g (g y))) * g. y. g (g (g (g y))) = 4 Example: Computing with Naturals
33
Programming with the -calculus -calculus vs. “real languages” ? Local variables (YES!) Bools, If-then-else (YES!) Records (YES!) Integers (YES!) Recursion ? Functions: well, those we have …
34
Encoding Recursion Write a function find: IN : predicate P, number n OUT: smallest num >= n s.t. P(n)=True
35
Encoding Recursion find satisfies the equation: find p n = if p n then n else find p (succ n) Define: F = f. p. n.(p n) n (f p (succ n)) A fixpoint of F is an x s.t. x = F x find is a fixpoint of F ! – as find p n = F find p n – so find = F find Q: Given -term F, how to write its fixpoint ?
36
The Y-Combinator Fixpoint Combinator Y = def F. ( y.F(y y)) ( x. F(x x)) Earns its name as … Y F ( y.F (y y)) ( x. F (x x)) F (( x.F (x x))( z. F (z z))) F (Y F) So, for any -calculus function F get Y F is fixpoint! Y F = F (Y F)
37
Whoa! Define: F = f. p. n.(p n) n (f p (succ n)) and: find = Y F Whats going on ? find p n = Y F p n = F (Y F) p n = F find p n = (p n) n (find p (succ n))
38
Y-Combinator in Practice fac n = if n<1 then 1 else n * fac (n-1) is just fac = \n->if n<1 then 1 else n * fac (n-1) is just fac = Y (\f n->if n<1 then 1 else n*f(n-1)) All Recursion Factored Into Y
39
Many other fixpoint combinators Including Klop’s Combinator: Y k = def (L L L L L L L L L L L L L L L L L L L L L L L L L L) where: L = def abcdefghIjklmnopqstuvwxyzr. r (t h i s i s a f i x p o i n t c o m b i n a t o r)
40
Expressiveness of -calculus Encodings are fun Programming in pure -calculus is not! We know -calculus encodes them So add 0,1,2,…,true,false,if-then-else to PL Next, types…
41
Appendix Evaluation Strategies
42
Q: Which -redex should be picked ? Good news, Church-Rosser Theorem: independent of strategy, there is at most one normal form Bad news, some strategies may fail to find a normal form: – ( x. y) (( y.y y) ( y.y y)) ! ( x. y) (( y.y y) ( y.y y)) ! … – ( x. y) (( y.y y) ( y.y y)) ! y We consider three strategies: – normal – call-by-name – call-by-value
43
Normal-Order Reduction outermost redex: a redex not contained inside another redex ( e. f. e) (( a. b. a) x y) (( c. d. c) u v) Outermost: Normal order: leftmost outermost redex first Theorem: If e has a normal form e’ then normal order reduction will reduce e to e’.
44
Weak vs Strong Reduction In most PL, functions considered “fully evaluated” Weak Reduction: – No reduction done under lambdas – i.e. inside a function body Strong Reduction: – Reduction is done under lambdas – Partial evaluation of function, other optimizations Normal order reduces under lambda x.(( y.y y) ( y.y y)) ! x.(( y.y y) ( y.y y)) ! … Not always desired …
45
Call-by-Name Reduction Don’t reduce under Don’t evaluate the argument to a function call – Directly substitute; evaluate when reducing body Demand-driven – an expression is not evaluated unless needed in body Normalizing – it converges whenever normal order converges – but does not always evaluate to a normal form
46
Call-by-Name Example ( y. ( x. x) y) (( u. u) ( v. v)) ( y. y) (( u. u) ( v. v)) ( u. u) ( v. v) v. v
47
Call-by-Value Reduction Don’t reduce under lambda Do evaluate argument to function call Most languages are call-by-value Not normalizing – ( x. y) (( y.y y) ( y.y y)) – diverges, but normal order (or CBN) converges
48
Call-by-Value Example: ( y. ( x. x) y) (( u. u) ( v. v)) ( y. ( x. x) y) ( v. v) ( y. y) ( v. v) v. v Evaluate arg
49
CBV vs. CBN Call-by-value: – Easy to implement – May diverge Call-by-name: – More difficult to implement must pass unevaluated expressions Args multiply-evaluated inside function body – Simpler theory than call-by-value Terminates more often (always if normal form exists) e.g. if arg is non-terminating, but not used … Various other reduction strategies…
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.