Extensions de PTS
Entiers, floats, ...
Tuples, Structures, Records, ...
Algebraic data types Types r ´ecursifs
Types existentiels
Types r ´ecursifs
G ´en ´eralement d ´enot ´es:
least fixed point:
µf = µx.f x ' f (f (f (f (...(f (⊥))))))
greatest fixed point:
νf = νx.f x ' f (f (f (f (...(f (>))))))
List α = µ (λl → Unit + (α × l)) Stream α = ν (λl → (α × l))
µ
ne marche pas pourStream
!µ
ajoute jusqu’ `a obtenir un point fixeν
Egalit ´e des types r ´ecursifs ´
type List1 α | nil | cons α (List1 α );
type List2 α | nil | cons α (List1 α );
type List3 α | nil | cons α (List4 α );
type List4 α | nil | cons α (List3 α );
Ces types sont-ils tous ´egaux?
Iso- vs ´ Equi- r ´ecursion
Deux s ´emantiques possibles:
equirecursive types:
µf = f (µf )
isorecursive types:
Γ ` e : µf
Γ ` unroll e : f (µf ) Γ ` e : f (µf )
Γ ` roll e : µf
roll
/unroll
ne peuvent convertirList1
`aList3
roll
/unroll
facilitent grandement la v ´erification des typesR ´ecursion ”impropre”
type Tree α | leaf α | node (Tree ( α × α )) Tree = µ (λ(t : Type → Type )
→ λ(α : Type ) → α + t (α × α))
Complique encore plus l’implantation des types ´equir ´ecursifs
Γ ` e : (µ f ) τ
1... τ
nΓ ` unroll e : f (µ f ) τ
1... τ
nΓ ` e : f (µ f ) τ
1... τ
nΓ ` roll e : (µ f ) τ
1... τ
nQuantification existentielle
Utile quand un type ne sera connu qu’ `a l’ex ´ecution:
filter
:
NListα n → ∃n
0.
NListα n;
Essayons d’encoder la quantification universelle:
∃t.τ ' ¬∀t.¬t
∃t : κ.τ ' ((t : κ) → t →
False) →
FalseUtilisable pour des preuves
Renvoyer toujours False est probl ´ematique dans des programmes
⇒
G ´en ´eralis ´e `a n’importe quel typeTypes existentiels
∃t : κ.τ ' (α : Type ) → ((t : κ) → τ → α) → α
Introduction (parfois d ´enot ´e
ht = τ, e : f i
)Γ ` e : f τ
Γ ` pack τ e : ∃t : κ.f t
Elimination (parfois d ´enot ´e´
open e
1... in e
2)Γ ` e
1: ∃t : κ.τ
1Γ, t : κ, x : τ
1` e
2: τ
2Γ ` let pack t x = e
1in e
2: τ
2Types existentiels (exemples)
Une liste de taille non-sp ´ecifi ´ee:
List α ' ∃n : Nat . NList α n
Une repr ´esentation de fermeture:
τ
1→ τ
2' ∃
ctx: Type . Pair ((τ
1,
ctx) → τ
2)
ctxO `u l’appelle `a une telle fermeture
f
devient:let pack t x = f in
let code = x.1 // code : ( τ
1, t) → τ
2let env = x.2 // env : t
Existentiels = paires d ´ependantes
∃t : κ.τ ' (α : Type ) → ((t : κ) → τ → α) → α
Rappelons l’encodage de Church des paires:
Pair
τ
1τ
2' (α : Type ) → (τ
1→ τ
2→ α) → α
Diff ´erences:
•
Premier champ vient d’une autre sorte•
Type du deuxi `eme champ peut d ´ependre de la valeur du premierG ´en ´eralisation
Existentiels deviennent un cas particulier: