Slide 1

Slide 1 text

Logical Types for Untyped Languages Sam Tobin-Hochstadt & Matthias Felleisen PLT @ Northeastern University ICFP, September 27, 2010

Slide 2

Slide 2 text

Types for Untyped Languages: • Ruby [Furr et al 09] • Perl [Tang 06] • Thorn [Wrigstad et al 09] • ActionScript [Adobe 06] • Typed Racket

Slide 3

Slide 3 text

Types for Untyped Languages: • Reynolds 68 • Cartwright 75 • Wright & Cartwright 94 • Henglein & Rehof 95

Slide 4

Slide 4 text

"Some account should be taken of the premises in conditional expressions." Reynolds, 1968

Slide 5

Slide 5 text

"Type testing predicates aggravate the loss of static type information." Henglein & Rehof, 1995

Slide 6

Slide 6 text

Types and Predicates

Slide 7

Slide 7 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))]))

Slide 8

Slide 8 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) n : Peano n n : Peano

Slide 9

Slide 9 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) n : Peano n n : Peano

Slide 10

Slide 10 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) n : 'Z 0 n : 'Z

Slide 11

Slide 11 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) n : (List 'S Peano) n n : List 'S Peano

Slide 12

Slide 12 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))]))

Slide 13

Slide 13 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) s : (U String Symbol) s* : (U String Symbol) s s : U String Symbol s* s* : U String Symbol

Slide 14

Slide 14 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) s : String s* : String s s : String s* s* : String

Slide 15

Slide 15 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) s : String s* : Symbol s s : String s* s* : Symbol

Slide 16

Slide 16 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) s : Symbol s* : String s s : Symbol s* s* : String

Slide 17

Slide 17 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) s : Symbol s* : Symbol s s : Symbol s* s* : Symbol

Slide 18

Slide 18 text

Types and Propositions

Slide 19

Slide 19 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))]))

Slide 20

Slide 20 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) n : (List 'S Peano) add1 convert rest n n : List 'S Peano

Slide 21

Slide 21 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) ⊢ (List 'S Peano) @ n add1 convert rest n ⊢ List 'S Peano @ n

Slide 22

Slide 22 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) ⊢ (List 'S Peano) @ n symbol? n ⊢ Symbol @ n

Slide 23

Slide 23 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) ⊢ Peano @ n ⊢ Symbol @ n ⊢ (List 'S Peano) @ n symbol? n ⊢ Symbol @ n

Slide 24

Slide 24 text

(define-type Peano (U 'Z (List 'S Peano))) (: convert : Peano -> Number) (define (convert n) (cond [(symbol? n) 0] [else (add1 (convert (rest n)))])) ⊢ (U 'Z (List 'S Peano)) @ n ⊢ Symbol @ n ⊢ (List 'S Peano) @ n symbol? n ⊢ Symbol @ n

Slide 25

Slide 25 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))]))

Slide 26

Slide 26 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) ⊢ String @ s ⊢ String @ s* string-append s s* ⊢ String @ s ⊢ String @ s*

Slide 27

Slide 27 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) ⊢ String @ s ∧ String @ s* ⊢ String @ s ⊢ String @ s* string? s String @ s string? s* String @ s*

Slide 28

Slide 28 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) ⊢ Symbol @ s* string-append s symbol->string s* Symbol @ s*

Slide 29

Slide 29 text

(: combine : (U String Symbol) (U String Symbol) -> String) (define (combine s s*) (cond [(and (string? s) (string? s*)) (string-append s s*)] [(string? s) (string-append s (symbol->string s*))] [(string? s*) (string-append (symbol->string s) s*)] [else (string-append (symbol->string s) (symbol->string s*))])) ⊢ String @ s ⊢ String @ s ⊃ String @ s* ⊢ Symbol @ s* and string? s string? s* String @ s ⊃ String @ s* string? s String @ s

Slide 30

Slide 30 text

(string? s )

Slide 31

Slide 31 text

(string? s ) String @ s

Slide 32

Slide 32 text

(string? s ) String @ s | String @ s

Slide 33

Slide 33 text

(x:Any -> Bool : String@x | String@x) s (string? s ) String @ s | String @ s x:Any -> Bool : String@x | String@x string? s s

Slide 34

Slide 34 text

Latent Propositions (x:Any -> Bool : String@x | String@x) Objects s (string? s ) String @ s | String @ s Propositions x:Any -> Bool : String@x | String@x string? s s

Slide 35

Slide 35 text

Latent Propositions (x:Any -> Bool : String@x | String@x) Objects car(s) (string? (car s)) String @ car(s) | String @ car(s) Propositions x:Any -> Bool : String@x | String@x string? car s car(s)

Slide 36

Slide 36 text

(λ ([s : (Pair Any Any)]) (string? (car s))) String @ car(s) | String @ car(s)

Slide 37

Slide 37 text

(λ ([s : (Pair Any Any)]) (string? (car s))) (s:(Pair Any Any) -> Bool : String @ car(s) | String @ car(s))

Slide 38

Slide 38 text

Propositional Logic

Slide 39

Slide 39 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o

Slide 40

Slide 40 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o e ::= n | c | (λ x : T . e) | (e e) | (if e e e)

Slide 41

Slide 41 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o T ::= Number | (U T ...) | #t | #f | (x:T -> T : φ|φ)

Slide 42

Slide 42 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o φ ::= T@π(x) | T@π(x) | φ1 ∨ φ2 | φ1 ∧ φ2 | φ1 ⊃ φ2

Slide 43

Slide 43 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o Γ ::= x:T ...

Slide 44

Slide 44 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o Γ ::= x:T T@π(x) ...

Slide 45

Slide 45 text

Judgments Γ ⊢ e : T ; φ1 | φ2 ; o Γ ::= x:T T@π(x) φ ...

Slide 46

Slide 46 text

Judgments Γ ⊢ φ

Slide 47

Slide 47 text

Judgments Γ ⊢ φ Number @ x ∨ String @ y , Number @ x ⊢ String @ y

Slide 48

Slide 48 text

Typing (if e1 e2 e3 )

Slide 49

Slide 49 text

Typing Γ,φ+ ⊢ e2 : T ; φ1+ |φ1- ; o Γ,φ- ⊢ e3 : T ; φ2+ |φ2- ; o Γ ⊢ e1 : T' ; φ+ |φ- ; o' (if e1 e2 e3 )

Slide 50

Slide 50 text

Typing Γ,φ+ ⊢ e2 : T ; φ1+ |φ1- ; o Γ,φ- ⊢ e3 : T ; φ2+ |φ2- ; o Γ ⊢ e1 : T' ; φ+ |φ- ; o' Γ ⊢ (if e1 e2 e3 ) : T ; φ1+ ∨φ2+ | φ1- ∨φ2- ; o

Slide 51

Slide 51 text

Typing Γ ⊢ x : T

Slide 52

Slide 52 text

Typing Γ ⊢ Tx Γ ⊢ x : T

Slide 53

Slide 53 text

Evaluation

Slide 54

Slide 54 text

Scaling Multiple Arguments Multiple Values User-defined Datatypes Local Binding Adapting Mutable Structures Mutable Variables

Slide 55

Slide 55 text

Local Binding Γ ⊢ e0 : S ; φ*+ | φ*- ; o Γ, S@x, #f @ x ⊃ φ*+ ⊢ e1 : T ; φ+ | φ- ; o* Γ ⊢ (let [x e0 ] e1 ) : T[o/x] ; φ+ | φ- [o/x] ; o*[o/x]

Slide 56

Slide 56 text

Empirical Evaluation Estimated usage of two idioms in Racket code base (600k lines) • Local binding with or: ~470 uses • Predicates with Selectors: ~440 uses

Slide 57

Slide 57 text

Prior Work None of the Examples Shivers 91, Henglein & Rehof 95, Crary et al 98, ... Just convert Aiken et al 94, Wright 94, Flanagan 97, Komondoor et al 2005 Everything but abstraction Bierman et al 2010

Slide 58

Slide 58 text

Conclusions Propositions can relate types and terms

Slide 59

Slide 59 text

Conclusions Propositions can relate types and terms Existing programs are a source of type system ideas

Slide 60

Slide 60 text

Thank You Code and Documentation http://www.racket-lang.org [email protected]

Slide 61

Slide 61 text

Thank You Code and Documentation http://www.racket-lang.org [email protected]