1
Lambda Calculus and Extensions as Foundation of Functional Programming
David Sabel and Manfred Schmidt-Schauß
- 29. September 2015
Lehrerbildungsforum Informatik
Last update: 30. September 2015
Lambda Calculus and Extensions as Foundation of Functional - - PowerPoint PPT Presentation
Lambda Calculus and Extensions as Foundation of Functional Programming David Sabel and Manfred Schmidt-Schau 29. September 2015 Lehrerbildungsforum Informatik Last update: 30. September 2015 1 Introduction Lambda Calculus Connection to
1
David Sabel and Manfred Schmidt-Schauß
Lehrerbildungsforum Informatik
Last update: 30. September 2015
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Untyped Lambda Calculus Operational Semantics Contextual Semantics Extension by Data Types
2/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Grammar for expressions e ∈ Eλ of the pure lambda calculus: e, ei ∈ Eλ ::= x | λx.e | (e1 e2) where x ∈ Var λx.e Abstraction (e1 e2) Application (of e1 to e2) We may omit brackets for better readability. The body of abstraction extends as far as possible (e1 e2 e3 e4) is reconstructed as (((e1 e2) e3) e4). Bracketing is left-associative.
3/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
λx.x The identity function λx.λy.x The function that can be applied to two arguments e1, e2 and returns e1. λx.λy.λf.f x y Used as encoding of pairs (λx.(x x)) (λx.(x x)) A lambda-expression which is useless as a program: It is nonterminating.
4/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
free variables FV (e) and bound variables BV (e) are inductively defined: FV (x) :={x}, if x ∈ Var FV ((e1 e2)):=FV (e1) ∪ FV (e2) FV (λx.e) :=FV (e) \ {x} BV (x) :=∅, if x ∈ Var BV ((e1 e2)):=BV (e1) ∪ BV (e2) BV (λx.e) :=BV (e) ∪ {x}
5/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
α-renaming: λx.e α − → λx′.e[x′/x], if x′ ∈ FV (e) and x′ ∈ BV (e) where α-equivalence =α is the smallest congruence obtained from
α
− →, i.e. it is inductively defined as e1 =α e2, if e1
α
− → e2 e =α e e1 =α e2, if e2 =α e1 e1 =α e3, if e1 =α e2 ∧ e2 =α e3 C[e1] =α C[e2], if e1 =α e2
6/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
The Convention on Bound Variables: In the expressions mentioned: binders always bind distinct variables, and bound variables are distinct from free variables. This can always be achieved by α-renamings. Example λx.x(y (λx.λy.y x)): the convention is not satisfied. It can be satisfied by α-renaming: λx.x(y (λx.λy.y x)) =α λx.x(y (λz.λu.u z))
7/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
We define a more general notion of substitution: e1[e2/x] denotes the substitution of all free occurrences of variable x in e1 by the expression e2: An inductive definition recursing over the expression structure is: x[e/x] := e y[e/x] := y, if x = y (λx.e1)[e/x] := λx.e1 (λy.e1)[e/x] := λy.(e1[e/x]), if x = y (e1 e2)[e/x] := (e1[e/x] e2[e/x]) Due to the distinct variable convention: There is no capture of variables.
8/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Examples: Compute (x λx.x)[λy.y / x] (λx.x x) (λy.y y) → (x x) [(λy.y y) / x] = (λy.y y) (λy.y y) =α (λx.x x) (λy.y y)
9/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Examples: Compute (x λx.x)[λy.y / x]
(x λu.u)[λy.y / x]
((λy.y) λu.u) (λx.x x) (λy.y y) → (x x) [(λy.y y) / x] = (λy.y y) (λy.y y) =α (λx.x x) (λy.y y)
9/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Example I := λx.x K := λx.λy.x K2 := λx.λy.y Ω := (λx1.(x1 x1)) (λx2.(x2 x2)) Y := λy1.(λx1.(y1 (x1 x1))) (λy2.(y2 (x2 x2))) The I-combinator is the identity function. K, K2 are projections, and Ω is non-terminating (diverging). The Y -combinator is a fixpoint-combinator, it has the property that Y e ∼c e (Y e) holds. It can be used to express recursion.
10/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Small-Step Operational Semantics
Pure Lazy Lambda-Calculus Beta-Reduction (λx.e1) e2
β
− → e1[e2/x] We write e1
C,β
− − → e2, if e1 = D[e′
1], e′ 1 β
− → e′
2, and e2 = D[e′ 2]
11/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Normal order reduction : A deterministic evaluation strategy. Reduce the outermost-leftmost beta-redex: A normal order reduction step no − → is any β-reduction which is performed inside a reduction context: s no − → t if s is of the form R[(λx.s1) s2] and t = R[s1[s2/x]] for a reduction context R. Grammar for reduction contexts: R ::= [·] | (R e)
no,+
− − − → transitive closure of no − →
no,∗
− − → reflexive-transitive closure
no,i
− − → exactly i normal order reduction steps.
12/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Closed and no − →-irreducible expressions of the (lazy) lambda calculus are exactly the abstractions. Abstractions are also the weak head normal forms (WHNFs) of the (lazy) lambda calculus.
13/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Definition An expression e ∈ Eλ converges (or successfully terminates) (written as e⇓) iff there exists a sequence of normal order reduction steps starting with e and ending in a WHNF: e⇓ iff e
no,∗
− − → e′ where e′ is a WHNF. If e⇓ does not hold, then we say that e diverges and write e⇑.
14/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Definition An expression e ∈ Eλ converges (or successfully terminates) (written as e⇓) iff there exists a sequence of normal order reduction steps starting with e and ending in a WHNF: e⇓ iff e
no,∗
− − → e′ where e′ is a WHNF. If e⇓ does not hold, then we say that e diverges and write e⇑. Examples
no
− → (λy.λz.z) (λw.w) no − → λz.z.
14/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
In order to compute WHNFs from an expression, normal-order reduction is sufficient: Proposition Let e be an expression, such that e
C,β,∗
− − − → e′ where e′ is a WHNF. Then e⇓. s
no,∗
C,β,∗
s1
where s0, s1 are abstractions
(
C,β,∗
− − − → is β-reduction at any occurrence)
15/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Definition contextual equivalence Definition Let e1, e2 ∈ Eλ. Then e1 and e2 are contextually equivalent, written as e1 ∼ e2 iff for all contexts C ∈ Cλ: C[e1]⇓ ⇐ ⇒ C[e2]⇓.
16/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Properties of ∼c Contextual preorder is a precongruence (i.e. it is a partial
⇒ C[s] ≤c C[t] ) Contextual equivalence is a congruence (i.e. it is an equivalence relation and s ∼c t = ⇒ C[s] ∼c C[t] ) Consequence: if s ∼c t it is possible to replace s by t anywhere in a program P to P ′ and P ∼c P ′ holds. Divergent closed expressions are equivalent: Let e1, e2 be two closed expressions with e1⇑ and e2⇑. Then e1 ∼c e2.
17/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
The reduction
C,β,∗
− − − → is confluen: e
C,β,∗
C,β,∗
C,β,∗
The confluence of
C,β,∗
− − − → and the standardization of normal-order reduction imply: Theorem
β
− → is correct w.r.t. ∼c, i.e. if e1
C,β
− − → e2 then e1 ∼c e2.
18/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
C,β,∗
← − − → is called the conversion relation
C,β,∗
← − − → is a congruence.
C,β,∗
← − − → ⊆ ∼c. However :
C,β,∗
← − − → = ∼c. Example: (λx.(x x x) (λx.(x x x))⇑, hence, Ω ∼c (λx.(x x x)) (λx.(x x x)). But, Ω
← − − → (λx.(x x x)) (λx.(x x x)), since there is no common reduction successor.
19/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
20/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
LNAME is an extension of the lazy lambda calculus by three constructs: data: there are primitives for constructing and deconstructing data Sequentialization: seq Supercombinators ∈ F: recursive function definitions
21/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
For every f ∈ F there is a definition of the form f x1 . . . xn = e where xi are variables and FV (e) ⊆ {x1, . . . , xn}. Syntax Grammar for expressions of LNAME where x, xi ∈ Var, f ∈ F, and cT,i ∈ KT : e, ei ∈ ELNAME ::= x | λx.e | f | (e1 e2) | (cT,i e1 . . . ear(cT,i)) | caseT e of {patT,1 → e1; . . . ; patT,|T| → e|T|} | seq e1 e2 patT,i ::= (cT,i xi,1 . . . xi,ar(cT,i))
22/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
β (λx.e1) e2 → e1[e2/x] (case) (caseT (cT,i e′
1 . . . e′ ar(cT,i)) of
{. . . ; (cT,i xi,1 . . . xi,ar(cT,i)) → ei; . . .}) → ei[e′
1/xi,1, . . . , e′ ar(cT,i)/xi,ar(cT,i)]
(seq) seq v e → e, if v is a WHNF. (SCβ) f e1 . . . en → e[e1/x1, . . . , en/xn], if f x1 . . . xn = e is the definition of f ∈ F.
23/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Extension by Data There is a finite nonempty set of type constructors T , where for every T ∈ T there are pairwise disjoint finite nonempty sets of data constructors DT = {cT,1, . . . cT,|T|}. Every constructor has a fixed arity (a non-negative integer) denoted by ar(T) or ar(cT,j), The data constructor cT,i of arity n is applied to n expressions to form a constructor application (cT,i e1 . . . ear(cT,i)). Case-expressions for analysing and deconstructing data. Examples type constructor Bool (of arity 0) with data constructors True and False type constructor List (of arity 1) with data constructors Nil (of arity 0) and Cons (of arity 2). A list of three elements: (Cons True (Cons False (Cons True Nil))).
24/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Extension We assume that there is a set F of function symbols, also called supercombinators and that for every f ∈ F there is a definition of f of the form f x1 . . . xn = e where xi are variables and e is an expression s.t. FV (e) ⊆ {x1, . . . , xn}. The names from F are treated as constants, and so may also occur in the defining expressions e on the right hand side. The number n in a definition f x1 . . . xn = e is called the arity of f and written as ar(f).
25/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Examples map, head ∈ F map ∈ F is a recursive supercombinator: map f xs = caseList xs of {Nil → Nil; (Cons y ys) → Cons (f y) (map f ys )} head ∈ F is a non-recursive supercombinator: head xs = caseList xs of {Nil → Ω; (Cons y ys) → y}
26/27
Introduction Lambda Calculus Connection to Rewriting and Confluence LNAME
Definition WHNFs of LNAME are of the form A functional weak head normal form (FWHNF) in LNAME is any abstraction and any expression of the form (f e1 . . . em) where f ∈ F and ar(f) > m. A constructor weak head normal form (CWHNF) is any expression of the form (cT,i e1 . . . ear(cT,i)). There are no − →-irreducible closed expressions that are not WHNFs, for example (True True); These are ruled out in typed calculi.
27/27