Advanced Features of Type Systems
Concepts of Programming Languages—CoPL ’15 Sebastian Hungerecker
Institute for Software Engineering and Programming Languages
February 8, 2016
Sebastian Hungerecker February 8, 2016 1
Advanced Features of Type Systems Concepts of Programming - - PowerPoint PPT Presentation
Advanced Features of Type Systems Concepts of Programming LanguagesCoPL 15 Sebastian Hungerecker Institute for Software Engineering and Programming Languages February 8, 2016 Sebastian Hungerecker February 8, 2016 1 Introduction
Institute for Software Engineering and Programming Languages
Sebastian Hungerecker February 8, 2016 1
◮ Type systems turn wrong behavior into errors ◮ Static type systems turn run-time into compile-time errors ◮ Advanced features catch even more errors at compile time
Sebastian Hungerecker February 8, 2016 2
Sebastian Hungerecker February 8, 2016 3
Sebastian Hungerecker February 8, 2016 4
Sebastian Hungerecker February 8, 2016 5
Sebastian Hungerecker February 8, 2016 6
Sebastian Hungerecker February 8, 2016 7
Sebastian Hungerecker February 8, 2016 8
Sebastian Hungerecker February 8, 2016 9
Sebastian Hungerecker February 8, 2016 9
Sebastian Hungerecker February 8, 2016 10
Sebastian Hungerecker February 8, 2016 11
Sebastian Hungerecker February 8, 2016 12
Sebastian Hungerecker February 8, 2016 13
Sebastian Hungerecker February 8, 2016 13
◮ 0+x = x is trivial ◮ x+0 = x needs to be proven
Sebastian Hungerecker February 8, 2016 14
Sebastian Hungerecker February 8, 2016 15
plusSuccRightSucc : Claim (l : Nat) -> (r : Nat) -> ∀ℓ ∈ N.∀r ∈ N. S (l + r) = l + (S r) S(ℓ+r) = ℓ+S(r) Induction Basis plusSuccRightSucc Z r = S(0+r) = 0+S(r) refl follows from definition Inductive Step plusSuccRightSucc (S l) r = S S(ℓ)+r = let inductiveHypot = Inductive Hypothesis plusSuccRightSucc l r S(ℓ+r) = ℓ+S(r) in proof { intros;
= S S(ℓ+r) rewrite inductiveHypot;
IH
= S ℓ+S(r) trivial;
Def
= S(ℓ)+S(r) }
Sebastian Hungerecker February 8, 2016 16
plusSuccRightSucc : Claim (l : Nat) -> (r : Nat) -> ∀ℓ ∈ N.∀r ∈ N. S (l + r) = l + (S r) S(ℓ+r) = ℓ+S(r) Induction Basis plusSuccRightSucc Z r = S(0+r) = 0+S(r) refl follows from definition Inductive Step plusSuccRightSucc (S l) r = S S(ℓ)+r = let inductiveHypot = Inductive Hypothesis plusSuccRightSucc l r S(ℓ+r) = ℓ+S(r) in proof { intros;
= S S(ℓ+r) rewrite inductiveHypot;
IH
= S ℓ+S(r) trivial;
Def
= S(ℓ)+S(r) }
Sebastian Hungerecker February 8, 2016 16
◮ Dependent ADTs cool, but cumbersome ◮ Combine types with predicates
◮ Automated SMT solver instead of manual theorem proving
Sebastian Hungerecker February 8, 2016 17
◮ Integers: int ◮ Integer vectors: intvec n ◮ Arrays: [elementType | shapeVector]
Sebastian Hungerecker February 8, 2016 18
Sebastian Hungerecker February 8, 2016 19
Sebastian Hungerecker February 8, 2016 20
◮ Array access: array.[ iv ] ◮ array: [ T | shape ] ◮ iv: indexvec r shape where r is the length of shape
Sebastian Hungerecker February 8, 2016 21
Sebastian Hungerecker February 8, 2016 22
◮ Value can’t be used more than once ◮ Operations need to produce new value
Sebastian Hungerecker February 8, 2016 23
Sebastian Hungerecker February 8, 2016 24
Sebastian Hungerecker February 8, 2016 24
◮ Type systems turn wrong behavior into errors ◮ Static type systems turn run-time into compile-time errors
◮ Advanced features catch even more errors at compile time
Sebastian Hungerecker February 8, 2016 25
◮ NullPointerExceptions through option types ◮ Validity of generated XML by translating XML schemas to type
◮ SQL queries through row types ◮ Transactionality through monads ◮ Termination through dependent types & theorem proving
Sebastian Hungerecker February 8, 2016 26