Embed
Email

Substitution

Document Sample

Shared by: ajizai
Categories
Tags
Stats
views:
2
posted:
12/1/2011
language:
English
pages:
25
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

• 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]

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}

FV as an inductive definition

FV(x) = {x}



Previous slide: FV(e1 e2) = FV(e1) U FV(e2)



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





FV(x) = {x}



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

Equivalent definition: FV(e1 e2) = S1 U S2



FV(e) = S

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

All Variables



Vars(x) = {x}



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



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

substitution examples

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

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

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 ?

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

“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)

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

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

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)

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.

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)

operational semantics again



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







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

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









• Is this the only possible operational

semantics?

alternatives



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







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

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







e2 --> e2’

v e2 --> v e2’





call-by-value call-by-name

alternatives



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



e1 --> e1’

e1 e2 --> e1’ e2

e1 --> e1’

e1 e2 --> e1’ e2

e2 --> e2’

e1 e2 --> e1 e2’



e2 --> e2’

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

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



call-by-value full beta-reduction

alternatives



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







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

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







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

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





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

Multi-step Op. Sem

• Given a single step op sem. relation:



e1 --> e2



• We extend it to a multi-step relation by

taking its “reflexive, transitive closure:”



(reflexivity) e1 --> e2 e2 -->* e3 (transitivity)

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

Proving Theorems About O.S.

Call-by-value o.s.:

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

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



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

case:

(\x.e) v --> e [v/x] Must prove: P((\x.e) v --> e [v/x])

** Often requires a related property of

substitution e [v/x]

case: e1 --> e1’ IH = P(e1 --> e1’)

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







case: e2 --> e2’ IH = P(e2 --> e2’)

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

Proving Theorems About O.S.

Call-by-value o.s.:

e1 --> e2 e2 -->* e3 (transitivity)

(reflexivity)

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



To prove property P of e1 -->* e2, given you’ve already

proven property P’ of e1 --> e2, there are 2 cases:

case:

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





case:

IH = P(e2 -->* e3)

e1 --> e2 e2 -->* e3 Also available: P’(e1 --> e2)

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

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.

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



Related docs
Other docs by ajizai
Fall 2010
Views: 0  |  Downloads: 0
Math 111
Views: 0  |  Downloads: 0
Training_listing_275360_7
Views: 1  |  Downloads: 0
C4-051739
Views: 0  |  Downloads: 0
DEFINITIONS
Views: 0  |  Downloads: 0
Unit POPULATIONS
Views: 0  |  Downloads: 0
albhed
Views: 0  |  Downloads: 0
price_list
Views: 9  |  Downloads: 0
By registering with docstoc.com you agree to our
privacy policy

You are almost ready to download!

You are almost ready to download!