Logical Types for Scheme
Sam Tobin-Hochstadt PLT @ Northeastern University NEPLS, April 29, 2010
1
Logical Types for Scheme Sam Tobin-Hochstadt PLT @ Northeastern - - PowerPoint PPT Presentation
Logical Types for Scheme Sam Tobin-Hochstadt PLT @ Northeastern University NEPLS, April 29, 2010 1 What do these languages have in common? COBOL Scheme Ruby Haskell 2 What do these languages have in common? COBOL
Sam Tobin-Hochstadt PLT @ Northeastern University NEPLS, April 29, 2010
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#lang typed/scheme (: twice : Any -> Number) (define (twice x) (if (number? x) (* 2 x) 0))
16
#lang typed/scheme (: twice : Any -> Number) (define (twice x) (if (number? x) (* 2 x) 0)) Numberx
17
#lang typed/scheme (: twice : (U Number String) -> Number) (define (twice x) (if (number? x) (* 2 x) (* 2 (string-length x))))
18
#lang typed/scheme (: twice : (U Number String) -> Number) (define (twice x) (if (number? x) (* 2 x) (* 2 (string-length x)))) Numberx
19
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(or (number? x) (string? x)) (twice x)] [else 0]))
20
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(or (number? x) (string? x)) (twice x)] [else 0])) Numberx ∨ Stringx
21
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(or (number? x) (string? x)) (twice x)] [else 0])) Numberx ∨ Stringx (U Number String)x
22
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(and (number? x) (string? y)) (+ (twice x) (twice y))] [else 0]))
23
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(and (number? x) (string? y)) (+ (twice x) (twice y))] [else 0])) Numberx ∧ Stringy
24
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(and (number? x) (string? y)) (+ (twice x) (twice y))] [(number? x) (* 2 y)] [else 0]))
25
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(and (number? x) (string? y)) (+ (twice x) (twice y))] [(number? x) (* 2 y)] [else 0])) Numberx ∨ Stringy
26
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(and (number? x) (string? y)) (+ (twice x) (twice y))] [(number? x) (* 2 y)] [else 0])) Numberx ∨ Stringy , Numberx Stringy
27
#lang typed/scheme (: twice : (U Number String) -> Number) (: g : Any (U Number String) -> Number) (define (g x y) (cond [(and (number? x) (string? y)) (+ (twice x) (twice y))] [(number? x) (* 2 y)] [else 0])) (U Number String)y , Stringy Numbery
28
#lang typed/scheme (: twice-car : (Pair Any Any) -> Number) (define (twice-car x) (if (number? (car x)) (* 2 (car x)) 0))
29
#lang typed/scheme (: twice-car : (Pair Any Any) -> Number) (define (twice-car x) (if (number? (car x)) (* 2 (car x)) 0)) Number_car(x)
30
#lang typed/scheme (: car-num? : (Pair Any Any) -> Boolean : Number @ car) (define (car-num? x) (number? (car x)))
31
#lang typed/scheme (: car-num? : (Pair Any Any) -> Boolean : Number @ car) (define (car-num? x) (number? (car x)))
32
33
Γ e : T ; φ1 | φ2
34
Γ e : T ; φ1 | φ2 e ::= n | c | (λ x : T . e) | (e e) | (if e e e)
35
Γ e : T ; φ1 | φ2 T ::= Number | (U T ...) | #t | #f | (x:T -> T : φ|φ)
36
Γ e : T ; φ1 | φ2 φ ::= T_π(x) | T_π(x) | φ1 ∨ φ2 | φ1 ∧ φ2 | φ1 ⊃ φ2
37
Γ e : T ; φ1 | φ2 φ ::= T_π(x) | T_π(x) | φ1 ∨ φ2 | φ1 ∧ φ2 | φ1 ⊃ φ2
38
Γ e : T ; φ1 | φ2 Γ ::= T_π(x) ...
39
Γ e : T ; φ1 | φ2 Γ ::= φ ...
40
Γ φ
41
Γ φ Numberx ∨ Stringy , Numberx Stringy
42
(if e1 e2 e3)
43
(if e1 e2 e3) Γ e1 : T1 ; φ_+|φ_-
44
(if e1 e2 e3) Γ e1 : T1 ; φ_+|φ_- Γ,φ_+ e2 : T ; φ1_+|φ1_- Γ,φ_- e3 : T ; φ2_+|φ2_-
45
(if e1 e2 e3) Γ e1 : T1 ; φ_+|φ_- Γ,φ_+ e2 : T ; φ1_+|φ1_- Γ,φ_- e3 : T ; φ2_+|φ2_-
46
Γ (if e1 e2 e3) : T ; φ1_+∨φ2_+ | φ1_-∨φ2_- Γ e1 : T1 ; φ_+|φ_- Γ,φ_+ e2 : T ; φ1_+|φ1_- Γ,φ_- e3 : T ; φ2_+|φ2_-
47
Γ (if e1 e2 e3) : T ; φ1_+∨φ2_+ | φ1_-∨φ2_- Γ e1 : T1 ; φ_+|φ_- Γ,φ_+ e2 : T ; φ1_+|φ1_- Γ,φ_- e3 : T ; φ2_+|φ2_-
48
Γ (if e1 e2 e3) : T ; φ1_+∨φ2_+ | φ1_-∨φ2_- Γ e1 : T1 ; φ_+|φ_- Γ,φ_+ e2 : T ; φ1_+|φ1_- Γ,φ_- e3 : T ; φ2_+|φ2_-
49
Γ x : T
50
Γ x : T Γ Tx
51
52
53