Compiling to -calculus and church encodings e ::= (lambda (x) e) - - PowerPoint PPT Presentation

compiling to calculus and church encodings e lambda x e e
SMART_READER_LITE
LIVE PREVIEW

Compiling to -calculus and church encodings e ::= (lambda (x) e) - - PowerPoint PPT Presentation

Compiling to -calculus and church encodings e ::= (lambda (x) e) | (e e) | x Alonzo Church = ( U U ) = (( (u) (u u)) ( (u) (u u))) (u u)[u U ] = (( (u) (u u)) ( (u) (u u))) Church encoding e ::= (letrec ([x


slide-1
SLIDE 1

Compiling to

λ-calculus and church encodings

λ

slide-2
SLIDE 2

e ::= (lambda (x) e) | (e e) | x

slide-3
SLIDE 3

Alonzo Church

slide-4
SLIDE 4

Ω = (U U) = ((λ (u) (u u)) Ω (λ (u) (u u))) (u u)[u ← U] = ((λ (u) (u u)) (λ (u) (u u)))

β

slide-5
SLIDE 5
slide-6
SLIDE 6
slide-7
SLIDE 7

Church encoding

slide-8
SLIDE 8

e ::= (letrec ([x (lambda (x …) e)]))
 | (let ([x e] …) e) | (lambda (x …) e) | (e e …) | x | (if e e e) | (+ e e) | (* e e) | (cons e e) | (car e) | (cdr e) | d d ::= ℕ | #t | #f | ‘() x ::= <vars>

slide-9
SLIDE 9

e ::= (letrec ([x (lambda (x …) e)]))
 | (let ([x e] …) e) | (lambda (x …) e) | (e e …) | x | (if e e e) | (+ e e) | (* e e) | (cons e e) | (car e) | (cdr e) | d d ::= ℕ | #t | #f | ‘() x ::= <vars> e ::= ) ) e)

slide-10
SLIDE 10

Desugaring Let

slide-11
SLIDE 11

(let ([x e] …) ebody)

slide-12
SLIDE 12

((λ (x …) ebody) e …) (let ([x e] …) ebody)

slide-13
SLIDE 13

Currying

slide-14
SLIDE 14

Gottlob Frege Moses Schönfinkel

slide-15
SLIDE 15

(λ (x y z) e) (λ (x) e) (λ () e) (λ (x) e) (λ (_) e) (λ (x) (λ (y) (λ (z) e)))

slide-16
SLIDE 16

(f a b c d) ((((f a) b) c) d) (f a) (f a) (f) (f f)

slide-17
SLIDE 17

e ::= (letrec ([x (lambda (x) e)])) | (lambda (x) e) | (e e) | x | (if e e e) | ((+ e) e) | ((* e) e) | ((cons e) e) | (car e) | (cdr e) | d d ::= ℕ | #t | #f | ‘() x ::= <vars>

slide-18
SLIDE 18

Conditionals & Booleans

slide-19
SLIDE 19

(if #t eT eF) eT (if #f eT eF) eF

slide-20
SLIDE 20

(if #t eT eF) (if #f eT eF) ((λ (t f) t) ((λ (t f) f) ((λ (t f) t) vT vF) ((λ (t f) f) vT vF) vT vF

slide-21
SLIDE 21

((λ (t f) t) eT Ω)

.........

slide-22
SLIDE 22

((λ () eT)) eT ((λ (t f) (t)) (λ () eT) (λ () Ω)) vT

slide-23
SLIDE 23

Turn all values into verbs!

(Focus on the behaviors that are implicit in values.)

slide-24
SLIDE 24

e ::= (letrec ([x (lambda (x) e)])) | (lambda (x) e) | (e e) | x | ((+ e) e) | ((* e) e) | ((cons e) e) | (car e) | (cdr e) | d d ::= ℕ | ‘() x ::= <vars>

slide-25
SLIDE 25

Natural Numbers

slide-26
SLIDE 26

(λ (f) (λ (x) (fN x))) 0: (λ (f) (λ (x) x)) 1: (λ (f) (λ (x) (f x))) 2: (λ (f) (λ (x) (f (f x)))) 3: (λ (f) (λ (x) (f (f (f x)))))

slide-27
SLIDE 27

church+ = (λ (n) (λ (m) (λ (f) (λ (x) …))))

slide-28
SLIDE 28

church+ = (λ (n) (λ (m) (λ (f) (λ (x) ((n f) ((m f) x))))))

slide-29
SLIDE 29

church* = (λ (n) (λ (m) (λ (f) (λ (x) …))))

slide-30
SLIDE 30

church* = (λ (n) (λ (m) (λ (f) (λ (x) ((n (m f)) x)))))

slide-31
SLIDE 31

fN = fN*M

M

slide-32
SLIDE 32

e ::= (letrec ([x (lambda (x) e)])) | (lambda (x) e) | (e e) | x | ((cons e) e) | (car e) | (cdr e) | d d ::= ‘() x ::= <vars>

slide-33
SLIDE 33

Lists

slide-34
SLIDE 34

We need to be able to case-split.

The fundamental problem:

We take two callbacks as with #t, #f!

The solution:

slide-35
SLIDE 35

‘() = (λ (when-cons) (λ (when-null) (when-null))) (cons a b) = (λ (when-cons) (λ (when-null) (when-cons a b)))

slide-36
SLIDE 36

e ::= (letrec ([x (lambda (x) e)])) | (lambda (x) e) | (e e) | x x ::= <vars>

slide-37
SLIDE 37

Y combinator

slide-38
SLIDE 38

(letrec ([fact (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))]) (fact 5))

slide-39
SLIDE 39

(letrec ([fact (λ (fact) (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))]) (fact 5))

slide-40
SLIDE 40

(letrec ([mk (λ (fact) (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))]) ((mk mk) 5))

slide-41
SLIDE 41

(letrec ([mk (λ (mk) (λ (n) (if (= n 0) 1 (* n ((mk mk) (- n 1)))))]) ((mk mk) 5))

slide-42
SLIDE 42

Y

slide-43
SLIDE 43

(Y f) = f (Y f)

(It’s a fixed-point combinator!)

slide-44
SLIDE 44
slide-45
SLIDE 45

Y = (U (λ (y) (λ (f) (f (λ (x) (((y y) f) x)))))

slide-46
SLIDE 46

(letrec ([fact (Y (λ (fact) (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))]) (fact 5))

slide-47
SLIDE 47

e ::= (lambda (x) e) | (e e) | x

slide-48
SLIDE 48

(define (church->nat cv) ) (define (church->list cv) ) (define (church->bool cv) )

De-churching

slide-49
SLIDE 49

(define (church->nat cv) ((cv add1) 0)) (define (church->list cv) ) (define (church->bool cv) )

De-churching

slide-50
SLIDE 50

(define (church->nat cv) ((cv add1) 0)) (define (church->list cv) ((cv (λ (car) (λ (cdr) (cons car (church->list cdr))))) (λ (na) ‘()))) (define (church->bool cv) )

De-churching

slide-51
SLIDE 51

(define (church->nat cv) ((cv add1) 0)) (define (church->list cv) ((cv (λ (car) (λ (cdr) (cons car (church->list cdr))))) (λ (na) ‘()))) (define (church->bool cv) ((cv (λ () #t)) (λ () #f)))

De-churching

slide-52
SLIDE 52

(letrec ([map (λ (f lst) (if (null? lst) '() (cons (f (car lst)) (map f (cdr lst)))))]) (map (λ (x) (+ 1 x)) '(0 5 3)))

slide-53
SLIDE 53

(define lst (((((((((λ (Y-comb) (λ (church:null?) (λ (church:cons) (λ (church:car) (λ (church:cdr) (λ (church:+) (λ (church:*) (λ (church:not) ((λ (map) ((map (λ (x) ((church:+ (λ (f) (λ (x) (f x)))) x))) ((church:cons (λ (f) (λ (x) x))) ((church:cons (λ (f) (λ (x) (f (f (f (f (f x)))))))) ((church:cons (λ (f) (λ (x) (f (f (f x)))))) (λ (when-cons) (λ (when-null) (when-null (λ (x) x))))))))) (Y-comb (λ (map)

> (map church->nat (church->list lst)) '(1 6 4)

slide-54
SLIDE 54

Now we can write a church encoder!