Semantics of Programming Languages Lecture 8
Semantics of Programming Languages Lecture 8
Matthew Hennessy
April 2, 2015
Anonymous functions
M ∈ Lambda ::= v
| M1 + M2
| M1 and M2 | M1 or M2 | M1 = M2 | M1 < M2
| if M1 then M2 else M2
| let x = M1 in M3
| M1 M2
v ∈ Val ::= x ∈ Vars | n ∈ Nums | tt | ff | λx .M
Free variables
Closed terms:
M is closed if fv(M) = {}
Closed terms correspond to programs
Judgements:
M →N
where M, N are programs
Intuition:
M performs
I one function application
I or one built-in operation
and N remains to be evaluated
Semantic rules
Standard rules:
(s-left)
M1 → M10
(M1 + M2 ) → (M10 + M2 )
(s-right)
M2 → M20
(n1 + M2 ) → (n1 + M20 )
(s-add)
n3 = add(n1 , n1 )
(n1 + n2 ) → n3
To evaluate let x = M in E
I Keep evaluating M to obtain a value v.
I Then substitute v in for x in E and continue evaluating
(s-let)
M → M0
(1)
let x = M in E → let x = M 0 in E
(s-let.subs)
(2)
let x = v in E → E {|v/x |}
Function application
To evaluate M1 M2 :
I evaluate M1 to a function λx .M
Call-by-value\eager: Call-by-name\lazy:
I evaluate M2 to a value v I evaluate M{|M2/x |}
I evaluate M{|v/x |}
v ∈ Val ::= n | tt | ff | λx .N
Call-by-value\eager:
(l-cbv.a) (l-cbv)
M2 →e M20
(λx .M)M2 →e (λx .M)M20 (λx .M)v →e M{|v/x |}
Values:
v ∈ Val ::= n | tt | ff | λx .N
Function application
(l-app)
M1 →l M10
M1 M2 →l M10 M2
Call-by-name\lazy:
(l-cbn)
Note:
M2 is a closed term
N open:
Not defined
∆ , λx .x x
∆∆ → ∆∆ → ∆∆ → . . . . . . ∆∆ → . . . . . .
I (λx .0)(∆∆) →l 0
I (λx .0)(∆∆) →e . . . →e . . . →e . . .
(λx .x + x + x) M →l M + M + M
Recursive definitions:
(recf .F ) 3
→∗l (λx .if x = 0 then 1 else x × (recf .F ) (x − 1)) 3
→∗l 3 × (recf .F ) 2
→∗l 3 × (λx .if x = 0 then 1 else x × (recf .F ) (x − 1)) 2
→∗l 3 × 2 × (recf .F ) 1
→∗l 3 × 2 × 1 × (recf .F ) 0
→∗l 3 × 2 × 1 × 1
→∗l 6
Lambda Matthew Hennessy
Fixpoints in the eager operational semantics
Q λz .Q z? z not free in Q
Not much
Eager fixpoints
Late combinator:
Early combinator:
(recv f .F ) 3
→∗e (λx .if x = 0 then 1 else x × (λz .recv f .F z) (x − 1)) 3
→∗e 3 × (λz .recv f .F z) 2
→∗e 3 × (recv f .F ) 2
→∗ . . .
Lambda Matthew Hennessy
The Lambda-calculus
M ∈ Lambda ::= v | M1 + M2
| M1 and M2 | M1 or M2 | M1 = M2 | M1 < M2
| if M1 then M2 else M2
| let x = M1 in M3
| M1 M2
v ∈ Val ::= x ∈ Vars | n ∈ Nums | tt | ff | λx .M
Equivalent:
M ∈ Lambda ::= x ∈ Vars | n ∈ Nums | λx .M
| M1 + 1 | Eq0 | M1 M2
The Lambda-calculus
Equivalent:
Succ 1 = λf .λx .f (1 f x)
= 2 = λf .λx .f (f x) up to some theory
The Lambda-calculus
As a programming language:
As a mathematical theory: