programming languages and compilers (cs 421)
DESCRIPTION
Programming Languages and Compilers (CS 421). Grigore Rosu 2110 SC, UIUC http://courses.engr.illinois.edu/cs421. Slides by Elsa Gunter, based in part on slides by Mattox Beckman, as updated by Vikram Adve and Gul Agha. Overview. - PowerPoint PPT PresentationTRANSCRIPT
04/20/23 1
Programming Languages and Compilers (CS 421)
Grigore Rosu
2110 SC, UIUC
http://courses.engr.illinois.edu/cs421
Slides by Elsa Gunter, based in part on slides by Mattox Beckman, as updated by Vikram Adve and Gul Agha
Overview
This lesson we learn how to represent various programming language features within lambda-calculus Datatypes Booleans and integer numbers Recursion
04/20/23 2
04/20/23 3
Untyped -Calculus
Only three kinds of expressions: Variables: x, y, z, w, … Abstraction: x. e (Function creation) Application: e1 e2
04/20/23 4
How to Represent (Free) Data Structures (First Pass - Enumeration Types)
Suppose is a type with n constructors: C1,…,Cn (no arguments)
Represent each term as an abstraction:
Let Ci x1 … xn. xi
Think: you give me what to return in each case (think match statement) and I’ll return the case for the i‘ th constructor
04/20/23 5
How to Represent Booleans
bool = True | False True x1. x2. x1 x. y. x False x1. x2. x2 x. y. y
Notation Will write x1 … xn. e for x1. … xn. e
e1 e2 … en for (…(e1 e2 )… en )
04/20/23 6
Functions over Enumeration Types
Write a “match” function match e with C1 -> x1
| … | Cn -> xn
x1 … xn e. e x1…xn
Think: give me what to do in each case and give me a case, and I’ll apply that case
04/20/23 7
Functions over Enumeration Types
type = C1 | … | Cn
match e with C1 -> x1
| … | Cn -> xn
match = x1 … xn e. e x1…xn
e = expression (single constructor) xi is returned if e = Ci
04/20/23 8
match for Booleans
bool = True | False True x1 x2. x1 x y. x False x1 x2. x2 x y. y
matchbool = ?
04/20/23 9
match for Booleans
bool = True | False True x1 x2. x1 x y. x False x1 x2. x2 x y. y
matchbool = x1 x2 e. e x1 x2
x y b. b x y
04/20/23 10
How to Write Functions over Booleans
if b then x1 else x2 if_then_else b x1 x2 = b x1 x2
if_then_else b x1 x2 . b x1 x2
04/20/23 11
How to Write Functions over Booleans
Alternately: if b then x1 else x2 =
match b with True -> x1 | False -> x2 matchbool x1 x2 b =
( x1 x2 b . b x1 x2 ) x1 x2 b = b x1 x2 if_then_else b x1 x2. (matchbool x1 x2 b)
= b x1 x2. ( x1 x2 b . b x1 x2 ) x1 x2 b
= b x1 x2. b x1 x2
04/20/23 12
Example:
not b = match b with True -> False | False ->
True (matchbool) False True b
= ( x1 x2 b . b x1 x2 ) ( x y. y) ( x y. x) b
= b ( x y. y)( x y. x)
not b. b ( x y. y)( x y. x) Try and, or
04/20/23 13
and or
04/20/23 14
How to Represent (Free) Data Structures (Second Pass - Union Types)
Suppose is a type with n constructors: type = C1 t11 … t1k | … |Cn tn1 … tnm
Represent each term as an abstraction:
Ci ti1 … tij x1 … xn . xi ti1 … tij
Ci ti1 … tij x1 … xn . xi ti1 … tij
Think: you need to give each constructor its arguments first
04/20/23 15
How to Represent Pairs
Pair has one constructor (comma) that takes two arguments
type (,) pair = (_ , _) (a , b) --> x . x a b (_ , _) --> a b x . x a b
04/20/23 16
Functions over Union Types
Write a “match” function match e with C1 y1 … ym1 -> f1 y1 … ym1
| … | Cn y1 … ymn -> fn y1 … ymn
match f1 … fn e. e f1…fn
Think: give me a function for each case and give me a case, and I’ll apply that case to the appropriate function with the data in that case
04/20/23 17
Functions over Pairs
matchpair = f p. p f
fst p = match p with (x,y) -> x fst p. matchpair ( x y. x) p
= p. ( f p. p f) ( x y. x) p = p. p ( x y. x)
snd p. p ( x y. y)
04/20/23 18
How to Represent (Free) Data Structures (Third Pass - Recursive Types)
Suppose is a type with n constructors: type = C1 t11 … t1k | … | Cn tn1 … tnm
Suppose tih : (i.e., it is recursive) In place of a value tih , let us have a function to
compute the recursive value rih x1 … xn
Ci ti1 … rih …tij x1 … xn . xi ti1 … (rih x1 … xn) … tij
Ci ti1 … rih …tij x1 … xn . xi ti1 … (rih x1 … xn) … tij
04/20/23 19
How to Represent Natural Numbers
nat = Suc nat | 0 Suc = n f x. f (n f x) Suc n = f x. f (n f x) 0 = f x. x Such representation called
Church Numerals
04/20/23 20
Some Church Numerals
Suc 0 = ( n f x. f (n f x)) ( f x. x) -->
f x. f (( f x. x) f x) --> f x. f (( x. x) x) --> f x. f x
Apply a function to its argument once
04/20/23 21
Some Church Numerals
Suc(Suc 0) = ( n f x. f (n f x)) (Suc 0) -->
( n f x. f (n f x)) ( f x. f x) --> f x. f (( f x. f x) f x)) --> f x. f (( x. f x) x)) --> f x. f (f x)Apply a function twice
In general n = f x. f ( … (f x)…) with n applications of f
04/20/23 22
Primitive Recursive Functions
Write a “fold” function fold f1 … fn = match e with C1 y1 … ym1 -> f1 y1 … ym1
| … | Ci y1 … rij …yin -> fn y1 … (fold f1 … fn rij) …ymn | … | Cn y1 … ymn -> fn y1 … ymn
fold f1 … fn e. e f1…fn
Match in non-recursive case a degenerate version of fold
04/20/23 23
Primitive Recursion over Nat
fold f z n= match n with 0 -> z | Suc m -> f (fold f z m)
fold f z n. n f z
is_zero n = fold ( r. False) True n = ( f x. f n x) ( r. False) True = (( r. False) n ) True if n = 0 then True else False
04/20/23 24
Adding Church Numerals
n f x. f n x and m f x. f m x
n + m = f x. f (n+m) x = f x. f n (f m x) = f x. n f (m f x)
+ n m f x. n f (m f x)
Subtraction is harder
04/20/23 25
Multiplying Church Numerals
n f x. f n x and m f x. f m x
n m = f x. (f n m) x = f x. (f m)n x = f x. n (m f) x
n m f x. n (m f) x
04/20/23 26
Predecessor
let pred_aux n = match n with 0 -> (0,0) | Suc m-> (Suc(fst(pred_aux m)), fst(pred_aux m)= fold ( r. (Suc(fst r), fst r)) (0,0) n
pred n. snd (pred_aux n) n = n. snd (fold ( r.(Suc(fst r), fst r)) (0,0) n)
04/20/23 27
Recursion
Want a -term Y such that for all terms R we have
Y R = R (Y R) Y needs to have replication to
“remember” a copy of R Y = y. ( x. y(x x)) ( x. y(x x)) Y R = ( x. R(x x)) ( x. R(x x)) = R (( x. R(x x)) ( x. R(x x))) Notice: Requires lazy evaluation
04/20/23 28
Factorial
Let F = f n. if n = 0 then 1 else n * f (n - 1)
Y F 3 = F (Y F) 3 = if 3 = 0 then 1 else 3 * ((Y F)(3 - 1))= 3 * (Y F) 2 = 3 * (F(Y F) 2)= 3 * (if 2 = 0 then 1 else 2 * (Y F)(2 - 1))= 3 * (2 * (Y F)(1)) = 3 * (2 * (F(Y F) 1)) =… = 3 * 2 * 1 * (if 0 = 0 then 1 else 0*(Y F)(0 -
1))= 3 * 2 * 1 * 1 = 6
04/20/23 29
Y in OCaml
# let rec y f = f (y f);;val y : ('a -> 'a) -> 'a = <fun># let mk_fact = fun f n -> if n = 0 then 1 else n * f(n-
1);;val mk_fact : (int -> int) -> int -> int =
<fun># y mk_fact;;Stack overflow during evaluation
(looping recursion?).
04/20/23 30
Eager Eval Y in Ocaml
# let rec y f x = f (y f) x;;
val y : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
# y mk_fact;;- : int -> int = <fun># y mk_fact 5;;- : int = 120 Use recursion to get recursion
04/20/23 31
Some Other Combinators
For your general exposure
I = x . x K = x. y. x K* = x. y. y
S = x. y. z. x z (y z)