Cody Roux - Pure Type Systems - Boston Haskell Meetup

Preview:

Citation preview

Pure Type Systems:Dependents When You Need Them

Cody Roux

Draper Laboratories

February 17, 2015

Cody Roux (Draper Labs) PTSes February 17, 2015 1 / 38

Introduction

This talk is not about Haskell!

Cody Roux (Draper Labs) PTSes February 17, 2015 2 / 38

Introduction

Or is it?

Wait, which Haskell?

good ol’ Haskell 98

-XTypeFamilies

-XExistentialQuantification

-XRank2Types

-XRankNTypes

-XDataKinds

-XPolyKinds

-XGADTs

-XConstraintKinds

-XImpredicativeTypes

etc.

Cody Roux (Draper Labs) PTSes February 17, 2015 3 / 38

Introduction

This talk is about abstraction!

We want to understand -XFooBar in a unified framework

Cody Roux (Draper Labs) PTSes February 17, 2015 4 / 38

Abstraction

The simplest form of abstraction

We have an expression 2 + 2

We can abstract it as x + x where x = 2

Have we gained anything?

Cody Roux (Draper Labs) PTSes February 17, 2015 5 / 38

Abstraction

We can form the λ-abstraction

λx . x + x

This is already a very powerful idea!

Cody Roux (Draper Labs) PTSes February 17, 2015 6 / 38

STLC

The Simply Typed λ-Calculus

Some base types A,B ,C , ...

Higher-order functions λx .λf .f x : A → (A → B) → B

A small miracle: every function is terminating.

Cody Roux (Draper Labs) PTSes February 17, 2015 7 / 38

Polymorphism

We want to have polymorphic functions

(λx .x) 3 → 3

(λx .x) true → true

How do we add this feature?

Cody Roux (Draper Labs) PTSes February 17, 2015 8 / 38

Polymorphic formulas

There are 2 possible answers!

First

Add type-level variables, X ,Y ,Z , ...

Add polymorphic quantification

∀X .X → X

Cody Roux (Draper Labs) PTSes February 17, 2015 9 / 38

Polymorphic formulas

What does ∀X .T quantify over?

1 Only the simple types

2 Any type from the extended language

These lead to dramatically different systems!

In the first case, the extension is conservative (no “new” functions)

In the second case, it is not (system F)

Cody Roux (Draper Labs) PTSes February 17, 2015 10 / 38

Dependent types

We can add term-level information to types:

[1, 2, 3] : ListN

[1, 2, 3] : VecN 3

We can add quantification as well:

reverse : ∀n,VecN n → VecN n

When is this kind of dependency conservative?

Cody Roux (Draper Labs) PTSes February 17, 2015 11 / 38

Pure Type Systems

Pure type systems:

are a generic framework for logics/programming lang.

only allow universal quantification/dependent function space

Cody Roux (Draper Labs) PTSes February 17, 2015 12 / 38

Pure Type Systems

Pure type systems are:

1 Expressive: ∃ a PTS that can express set theory

2 Well studied: invented in the 80s (Barendregt) and studied ever since!

3 Flexible: found at the core of several functional languages, includingHaskell, Agda, Coq.

4 Can be complex! There are several longstanding open questionsincluding

1 Typed Conversion ⇔ Untyped Conversion

2 Weak Normalization ⇔ Strong Normalization

Cody Roux (Draper Labs) PTSes February 17, 2015 13 / 38

Pure Type Systems

Can we answer our questions using PTS?

Cody Roux (Draper Labs) PTSes February 17, 2015 14 / 38

Pure Type Systems

A Pure Type System is defined as

1 A set of Sorts S

2 A set of Axioms A ⊆ S × S

3 A set of Rules R ⊆ S × S × S

That’s it!

Cody Roux (Draper Labs) PTSes February 17, 2015 15 / 38

Pure Type Systems

Informally

Elements ∗,�, ι, ... ∈ S represent a category of objects.

For example

∗ may represent the category of propositions

� may represent the category of types

ι may represent the category of natural numbers

Cody Roux (Draper Labs) PTSes February 17, 2015 16 / 38

Pure Type Systems

(s1, s2) ∈ A informally means:

s1 is a member of the category s2

Cody Roux (Draper Labs) PTSes February 17, 2015 17 / 38

Pure Type Systems

(s1, s2, s3) ∈ R informally means:

Quantifying over an element of s2 parametrized over an element of s1gives a result in s3

if A : s1 and B(x) : s2 when x : A

then ∀x : A.B(x) : s3

We will write Πx : A.B instead of ∀x : A.B(x) (tradition)

Cody Roux (Draper Labs) PTSes February 17, 2015 18 / 38

Pure Type Systems

Given a PTS P we have the following type system:

Type/Sort formation

Γ ⊢axiom (s1, s2) ∈ A

Γ ⊢ s1 : s2

Γ ⊢ A : s1 Γ, x : A ⊢ B : s2prod (s1, s2, s3) ∈ R

Γ ⊢ Πx : A.B : s3

Cody Roux (Draper Labs) PTSes February 17, 2015 19 / 38

Pure Type Systems

Term formation

Γ ⊢ A : svar s ∈ S

Γ, x : A ⊢ x : A

Γ, x : A ⊢ t : B Γ ⊢ Πx : A.B : sabs s ∈ S

Γ ⊢ λx : A.t : Πx : A.B

Γ ⊢ t : Πx : A.B Γ ⊢ u : AappΓ ⊢ t u : B [x 7→ u]

Cody Roux (Draper Labs) PTSes February 17, 2015 20 / 38

Pure Type Systems

Conversion

Γ ⊢ t : A Γ ⊢ A′ : sconv A ≃β A

′, s ∈ S

Γ ⊢ t : A′

Where ≃β is β-equality

(λx : A.t)u ≃β t[x 7→ u]

We omit the boring rules...

Cody Roux (Draper Labs) PTSes February 17, 2015 21 / 38

Pure Type Systems

The rest of this talk

Understanding this definition!

Cody Roux (Draper Labs) PTSes February 17, 2015 22 / 38

Simply Typed Lambda Calculus

We can model the STLC using

S = {∗,�}

A = {(∗,�)}

R = {(∗, ∗, ∗)}

We have e.g.A : ∗ ⊢ λx : A.x : A → A

taking A → A = Πx : A. A

Cody Roux (Draper Labs) PTSes February 17, 2015 23 / 38

The λ-cube

Some more examples, contained in a family called the λ-cube:

The sorts are ∗,�

∗ : �

The rules are (k1, k2, k2) with ki = ∗ or �

Each dimension of the cube highlights a different feature

Cody Roux (Draper Labs) PTSes February 17, 2015 24 / 38

The λ-cube

STLC

F

λΠ

λ2

λω

λΠω

CC

Cody Roux (Draper Labs) PTSes February 17, 2015 25 / 38

λ-cube

STLC = (∗, ∗)

F = (∗, ∗) (�, ∗)

λω = (∗, ∗) (�,�)

λΠ = (∗, ∗) (∗,�)

λ2 = (∗, ∗) (∗,�) (�, ∗)

Fω = (∗, ∗) (�, ∗) (�,�)

λΠω = (∗, ∗) (∗,�) (�,�)

CC = (∗, ∗) (∗,�) (�, ∗) (�,�)

STLC

F

λΠ

λ2

λω

λΠω

CC

Cody Roux (Draper Labs) PTSes February 17, 2015 26 / 38

λ-cube features

Calculus Rule Feature Example

STLC (∗, ∗) Ordinary (higher-order) functions id : N → N

F (�, ∗) Impredicative polymorphism id : ∀X .X → X

λω (�,�) Type constructors rev : List A → List A

λΠ (∗,�) Dependent Types head : VecN (n + 1) → N

Cody Roux (Draper Labs) PTSes February 17, 2015 27 / 38

Example

Let’s work out an example in CC :

Induction on lists

∀A P l , P (nil A) → (∀a r , P r → P (cons A y r)) → P l

Π(A : ∗)(P : List A → ∗)(l : List A). P (nil A) →(

Π(a : A)(r : List A). P r → P (cons A y r))

→ P l

X → Y still means Π : A. B

Whiteboard time!

Cody Roux (Draper Labs) PTSes February 17, 2015 28 / 38

Example

No whiteboard?

List : ∗ → ∗

nil : ΠA : ∗. List A

cons : ΠA : ∗. A → List A → List A

Cody Roux (Draper Labs) PTSes February 17, 2015 29 / 38

Example

⊢ ∗ : �

A : ∗ ⊢ List A : ∗ . . . ⊢ ∗ : �A : ∗ ⊢ List A → ∗ : �

. . . ⊢ P (nil A) : ∗...

. . . ⊢ . . . : ∗

...A : ∗ ⊢ Π(P : List A → ∗)(l : List A) . . . : ∗

⊢ Π(A : ∗)(P : List A → ∗)(l : List A). P (nil A) →(

Π(a : A)(r : List A). P r → P (cons A y r))

→ P l : ∗

Cody Roux (Draper Labs) PTSes February 17, 2015 30 / 38

Other Calculi

Here are a few other examples:

Name Sorts Axioms Rules

STLC(1 base type) ι, ∗ (ι, ∗) (∗, ∗, ∗)

STLC ∗,� (∗,�) (∗, ∗, ∗)

∗ : ∗ ∗ (∗, ∗) (∗, ∗, ∗)

System F ∗,� (∗,�) (∗, ∗, ∗), (�, ∗, ∗)

CC ∗,� (∗,�) (∗, ∗, ∗), (�, ∗, ∗),(∗,�,�), (�,�,�)

U− ∗,�,△ (∗,�), (∗, ∗, ∗), (�, ∗, ∗),(�,△) (�,�,�), (△,�,�)

CCω ∗,�i , (∗,�i ), (∗, ∗, ∗), (�i , ∗, ∗),(core of Coq) i ∈ N (�i ,�j ), i < j (�i ,�j ,�k), k ≥ max(i , j)

Cody Roux (Draper Labs) PTSes February 17, 2015 31 / 38

Normalization

A PTS is normalizing ⇔ Γ ⊢ t : T ⇒ t has a β-normal form.

Normalization is a central property:

1 It ensures decidability of type-checking

2 It implies consistency of the system as a logic

Cody Roux (Draper Labs) PTSes February 17, 2015 32 / 38

Normalization

Normalization is hard to predict:

Name Axioms Rules Norm.

STLC(1 base type) (ι, ∗) (∗, ∗, ∗) Yes

STLC (∗,�) (∗, ∗, ∗) Yes

∗ : ∗ (∗, ∗) (∗, ∗, ∗) No

System F (∗,�) (∗, ∗, ∗), (�, ∗, ∗) Yes

CC (∗,�) (∗, ∗, ∗), (�, ∗, ∗), Yes(∗,�,�), (�,�,�)

U− (∗,�), (∗, ∗, ∗), (�, ∗, ∗), No(�,△) (�,�,�), (△,�,�)

CCω (∗,�i ), (∗, ∗, ∗), (�i , ∗, ∗), Yes(core of Coq) (�i ,�j), i < j (�i ,�j ,�k), k ≥ max(i , j)

Cody Roux (Draper Labs) PTSes February 17, 2015 33 / 38

Other Features

PTSes can capture things like predicative polymorphism:

Only instantiate ∀s with monomorphic types

∀X .X → X 7→ N → N yes

∀X .X → X 7→ (∀Y .Y → Y ) → (∀Y .Y → Y ) no

Sorts: ∗, ∗̂,�

Axioms: ∗ : �, ∗̂ : �

Rules: STLC + {(�, ∗, ∗̂), (�, ∗̂, ∗̂)}

Cody Roux (Draper Labs) PTSes February 17, 2015 34 / 38

Other Features

We can seperate type-level data and program-level data

Sorts: ∗t , ∗p ,�t ,�p

Axioms: ∗t : �t , ∗p : �p

Rules:{(∗t , ∗t , ∗t), (∗p , ∗p , ∗p), (∗t ,�p ,�p)}

Nt lives in ∗t , Np lives in ∗p

Similar to GADTs!

Cody Roux (Draper Labs) PTSes February 17, 2015 35 / 38

More about U−

Remember U−:

R = {(∗, ∗, ∗), (�, ∗, ∗), (�,�,�), (△,�,�)}

This corresponds to Kind Polymorphism!

But...

It is inconsistent!U− ⊢ t : ∀X . X

This is (maybe) bad news for constraint kinds!

Cody Roux (Draper Labs) PTSes February 17, 2015 36 / 38

Conclusion

Pure Type Systems are functional languages with simple syntax

They can explain many aspects of the Haskell Type System.

Pure Type Systems give fine grained ways of extending the typingrules.

The meta-theory can be studied in a single generic framework.

There are still hard theory questions about PTS.

Cody Roux (Draper Labs) PTSes February 17, 2015 37 / 38

The End

Cody Roux (Draper Labs) PTSes February 17, 2015 38 / 38

Recommended