programming languages and compilers (cs 421)

31
06/27/22 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

Upload: ursa

Post on 05-Jan-2016

20 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Programming Languages and Compilers (CS 421)

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

Page 2: Programming Languages and Compilers (CS 421)

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

Page 3: Programming Languages and Compilers (CS 421)

04/20/23 3

Untyped -Calculus

Only three kinds of expressions: Variables: x, y, z, w, … Abstraction: x. e (Function creation) Application: e1 e2

Page 4: Programming Languages and Compilers (CS 421)

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

Page 5: Programming Languages and Compilers (CS 421)

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 )

Page 6: Programming Languages and Compilers (CS 421)

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

Page 7: Programming Languages and Compilers (CS 421)

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

Page 8: Programming Languages and Compilers (CS 421)

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 = ?

Page 9: Programming Languages and Compilers (CS 421)

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

Page 10: Programming Languages and Compilers (CS 421)

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

Page 11: Programming Languages and Compilers (CS 421)

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

Page 12: Programming Languages and Compilers (CS 421)

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

Page 13: Programming Languages and Compilers (CS 421)

04/20/23 13

and or

Page 14: Programming Languages and Compilers (CS 421)

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

Page 15: Programming Languages and Compilers (CS 421)

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

Page 16: Programming Languages and Compilers (CS 421)

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

Page 17: Programming Languages and Compilers (CS 421)

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)

Page 18: Programming Languages and Compilers (CS 421)

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

Page 19: Programming Languages and Compilers (CS 421)

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

Page 20: Programming Languages and Compilers (CS 421)

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

Page 21: Programming Languages and Compilers (CS 421)

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

Page 22: Programming Languages and Compilers (CS 421)

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

Page 23: Programming Languages and Compilers (CS 421)

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

Page 24: Programming Languages and Compilers (CS 421)

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

Page 25: Programming Languages and Compilers (CS 421)

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

Page 26: Programming Languages and Compilers (CS 421)

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)

Page 27: Programming Languages and Compilers (CS 421)

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

Page 28: Programming Languages and Compilers (CS 421)

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

Page 29: Programming Languages and Compilers (CS 421)

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?).

Page 30: Programming Languages and Compilers (CS 421)

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

Page 31: Programming Languages and Compilers (CS 421)

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)