25
Substitution & Evaluation Order cos 441 David Walker

Substitution & Evaluation Order

  • Upload
    ahanu

  • View
    38

  • Download
    0

Embed Size (px)

DESCRIPTION

Substitution & Evaluation Order. cos 441 David Walker. Reading. Pierce Chapter 5: 5.1: intro, op. sem., evaluation order 5.2: encodings of booleans, pairs, numbers, recursion 5.3: substitution. Substitution. - PowerPoint PPT Presentation

Citation preview

Page 1: Substitution  & Evaluation Order

Substitution & Evaluation Order

cos 441

David Walker

Page 2: Substitution  & Evaluation Order

Reading

• Pierce Chapter 5:– 5.1: intro, op. sem., evaluation order– 5.2: encodings of booleans, pairs, numbers,

recursion– 5.3: substitution

Page 3: Substitution  & Evaluation Order

Substitution

• In order to be precise about the operational semantics of the lambda calculus, we need to define substitution properly

• For the call-by-value operational semantics, we need to define:– e1 [v/x] where v contains no free variables

• For other operational semantics, we need:– e1 [e2/x]

Page 4: Substitution  & Evaluation Order

Free Variables

FV : Given an expression, compute its free variables

FV : lambda expression variable set

FV(x) = {x}

FV(e1 e2) = FV(e1) U FV(e2)

FV(\x.e) = FV(e) – {x}

Page 5: Substitution  & Evaluation Order

FV as an inductive definition

FV(x) = {x}

FV(e1 e2) = FV(e1) U FV(e2)

FV(\x.e) = FV(e) – {x}

FV(x) = {x}

FV(e1) = S1 FV(e2) = S2FV(e1 e2) = S1 U S2

FV(e) = SFV(\x.e) = S – {x}

Previous slide:

Equivalent definition:

Page 6: Substitution  & Evaluation Order

All Variables

Vars(x) = {x}

Vars(e1 e2) = Vars(e1) U Vars(e2)

Vars(\x.e) = Vars(e) U {x}

Page 7: Substitution  & Evaluation Order

substitution examples

(\x.\y.z z)[\w.w/z] = \x.\y.(\w.w) (\w.w)

Page 8: Substitution  & Evaluation Order

examples

(\x.\y.z z)[\w.w/z] = \x.\y.(\w.w) (\w.w)

(\x.\z.z z)[\w.w/z] = \x.\z.z z

Page 9: Substitution  & Evaluation Order

examples

(\x.\y.z z)[\w.w/z] = \x.\y.(\w.w) (\w.w)

(\x.\z.z z)[\w.w/z] = \x.\z.z z

(\x.x z)[x/z] = \x.x x ?

Page 10: Substitution  & Evaluation Order

examples

(\x.\y.z z)[\w.w/z] = \x.\y.(\w.w) (\w.w)

(\x.\z.z z)[\w.w/z] = \x.\z.z z

(\x.x z)[x/z] = \x.x x

(\x.x z)[x/z] = (\y.y z)[x/z] = \y.y x

alpha-equivalent expressions = the same except for consistent renaming of variables

Page 11: Substitution  & Evaluation Order

“special” substitution (ignoring capture issues)

definition of e1 [[e/x]] assuming FV(e) Vars(e1) = { }:

x [[e/x]] = e

y [[e/x]] = y (if y ≠ x)

e1 e2 [[e/x]] = (e1 [[e/x]]) (e2 [[e/x]])

(\x.e1) [[e/x]] = \x.e1

(\y.e1) [[e/x]] = \y.(e1 [[e/x]]) (if y ≠ x)

Page 12: Substitution  & Evaluation Order

The Principle of “Bound Variable Names Don’t Matter”

when you write

“let val x = 3 in x + global end”

you assume you can change the declaration of x to a declaration of y (or other name) provided you systematically change the uses of x. eg:

“let val y = 3 in y + global end”

provided that the name you pick doesn’t conflict with the free variables of the expression. eg:

“let val global = 3 in global + global end” bad

Page 13: Substitution  & Evaluation Order

Alpha-Equivalence

in order to avoid variable clashes, it is very convenient to alpha-convert expressions so that bound variables don’t get in the way.

eg: to alpha-convert \x.e we:1. pick z such that z not in Vars(\x.e)

2. return \z.(e[[z/x]])

we just defined this form of substitution e[[z/x]] so it is a total function when z is not in Vars(\x.e)

terminology: Expressions e1 and e2 are called alpha-equivalent when they are the same after alpha-converting some of their bound variables

Page 14: Substitution  & Evaluation Order

capture-avoiding substitution

defined inductively on the structure of exp’s:

x [e/x] = e

y [e/x] = y (if y ≠ x)

e1 e2 [e/x] = (e1 [e/x]) (e2 [e/x])

(\x.e1) [e/x] = \x.e1

(\y.e1) [e/x] = \y.(e1 [e/x]) (if y ≠ x and y FV(e))

(\y.e1) [e/x] = \z.((e1[[z/y]]) [e/x]) (if y ≠ x and y FV(e))

for some z such that z FV(e) U Vars(e1)

Page 15: Substitution  & Evaluation Order

Implicit Alpha-Conversion

it’s irritating to explicitly alpha-convert all the time in our definitions. ie: to explicitly write down that before doing something like substitution (or type checking) that we are going to pick some new variable z that doesn’t interfere with any other variables in the current context and alpha-convert the given term.

Consequently, we are going to take a short-cut: implicit alpha-conversion. When dealing with a bound variable as in \x.e, we’ll just assume that x is any variable we like other than one of the free variables in e.

Page 16: Substitution  & Evaluation Order

capture-avoiding substitution(the short-cut definition)

x [e/x] = e

y [e/x] = y (if y ≠ x)

e1 e2 [e/x] = (e1 [e/x]) (e2 [e/x])

(\x.e1) [e/x] = \x.e1

(\y.e1) [e/x] = \y.(e1 [e/x]) (if y ≠ x and y FV(e))

(note, we left out the case for \y.e1 [e/x] when y ≠ x

and y FV(e). We’ll implicitly alpha-convert \y.e1 to

\z.e1[[z/y]] for some z that doesn’t appear in e1 whenever

we need to satisfy the free variable side conditions)

Page 17: Substitution  & Evaluation Order

operational semantics again

• Is this the only possible operational semantics?

e1 --> e1’e1 e2 --> e1’ e2

e2 --> e2’v e2 --> v e2’

(\x.e) v --> e [v/x]

Page 18: Substitution  & Evaluation Order

alternatives

e1 --> e1’e1 e2 --> e1’ e2

e2 --> e2’v e2 --> v e2’

(\x.e) v --> e [v/x]

e1 --> e1’e1 e2 --> e1’ e2

(\x.e1) e2 --> e1 [e2/x]

call-by-value call-by-name

Page 19: Substitution  & Evaluation Order

alternatives

e1 --> e1’e1 e2 --> e1’ e2

e2 --> e2’v e2 --> v e2’

(\x.e) v --> e [v/x]

e1 --> e1’e1 e2 --> e1’ e2

(\x.e1) e2 --> e1 [e2/x]

call-by-value full beta-reduction

e2 --> e2’e1 e2 --> e1 e2’

e --> e’\x.e --> \x.e’

Page 20: Substitution  & Evaluation Order

alternatives

e1 --> e1’e1 e2 --> e1’ e2

e2 --> e2’v e2 --> v e2’

(\x.e) v --> e [v/x]

call-by-value right-to-left call-by-value

e1 --> e1’e1 v --> e1’ v

e2 --> e2’e1 e2 --> e1 e2’

(\x.e) v --> e [v/x]

Page 21: Substitution  & Evaluation Order

Multi-step Op. Sem

• Given a single step op sem. relation:

• We extend it to a multi-step relation by taking its “reflexive, transitive closure:”

e1 -->* e1e1 --> e2 e2 -->* e3 e1 -->* e3

e1 --> e2

(reflexivity) (transitivity)

Page 22: Substitution  & Evaluation Order

Proving Theorems About O.S.

Call-by-value o.s.:

To prove property P of e1 --> e2, there are 3 cases:

case:

case:

case:

e1 --> e1’e1 e2 --> e1’ e2

e2 --> e2’v e2 --> v e2’(\x.e) v --> e [v/x]

(\x.e) v --> e [v/x]

e1 --> e1’e1 e2 --> e1’ e2

e2 --> e2’v e2 --> v e2’

IH = P(e1 --> e1’)Must prove: P(e1 e2 --> e1’ e2)

IH = P(e2 --> e2’)Must prove: P(v e2 --> v e2’)

Must prove: P((\x.e) v --> e [v/x])** Often requires a related property of substitution e [v/x]

Page 23: Substitution  & Evaluation Order

Proving Theorems About O.S.

Call-by-value o.s.:

To prove property P of e1 -->* e2, given you’ve already proven property P’ of e1 --> e2, there are 2 cases:

case:

case:

IH = P(e2 -->* e3)Also available: P’(e1 --> e2)Must prove: P(e1 -->* e3)

e1 -->* e1e1 --> e2 e2 -->* e3 e1 -->* e3

(reflexivity) (transitivity)

e1 -->* e1 Must prove: P(e1 -->* e1) directly

e1 --> e2 e2 -->* e3 e1 -->* e3

Page 24: Substitution  & Evaluation Order

Example

Definition: An expression e is closed

if FV(e) = { }.

Theorem:

If e1 is closed and e1 -->* e2 then e2 is closed.

Proof: by induction on derivation of e1 -->* e2.

Page 25: Substitution  & Evaluation Order

summary

• the operational semantics– primary rule: beta-reduction– depends upon careful definition of substitution– many evaluation strategies

• definitions/terminology to remember:– free variable– bound variable– closed expression– capture-avoiding substitution– alpha-equivalence; alpha-conversion– call-by-value, call-by-name, full beta reduction