Expressionless
Weak-Head
Normal Forms
Larry Diehl
Portland State University
June 3rd, 2015
Wednesday, June 3, 15
Slide 2
Slide 2 text
Motivation
• Dependent Type Checking
• Formal implementation of an “efficient”
dependent type checker with
grammatically-enforced partial
correctness and an independence
property.
With liberty
and justice for all.
Wednesday, June 3, 15
Slide 3
Slide 3 text
Outline
• Why DT checking is tricky
• Normalization using
• Only Expressions
• directly to NF
• passing through WHNF
• Only Normal forms
• via hereditary substitution
• An environment machine (closure-based)
• Expressions and dependent WHNFs
• Independent WHNFs
Wednesday, June 3, 15
Slide 4
Slide 4 text
Legend
Values depend on the expression monarchy :(
Values are independent!
Hey, I’ve seen this before...
Gotta go fast!
Wednesday, June 3, 15
Slide 5
Slide 5 text
Pro Tip
• Pay special attention to what
• `is-a-constructor
• mostly used for syntax
• is-a-function
• mostly used for semantics
Wednesday, June 3, 15
Slide 6
Slide 6 text
Complexity of
Dependent-Type Checking
Wednesday, June 3, 15
Slide 7
Slide 7 text
Type Checking
with Redexes
in Type and Term
one : if true then ℕ else ⊥
one = (λ x ! x) suc zero
Wednesday, June 3, 15
Slide 8
Slide 8 text
Type Checking
with Redexes
in Term
One : Set
One = if true then ℕ else ⊥
one : One
one = (λ x ! x) suc zero
Wednesday, June 3, 15
Slide 9
Slide 9 text
Type Checking
with Redexes
in Term
One : Set
One = if true then ℕ else ⊥
one : ℕ
one = (λ x ! x) suc zero
Wednesday, June 3, 15
Slide 10
Slide 10 text
infer Γ (f `∙ a) =
infer Γ a >>= λ A !
infer Γ f >>= λ
{ (`Π A' B) !
if A == A'
then return (B ∙ a)
else nothing
; _ ! nothing }
Wednesday, June 3, 15
Slide 11
Slide 11 text
infer : ∀{γ} !
Ctx γ ! Exp γ ! Maybe (Exp γ)
infer Γ (f `∙ a) =
infer Γ a >>= λ A !
infer Γ f >>= λ
{ (`Π A' B) !
if A == A'
then return (B ∙ a)
else nothing
; _ ! nothing }
Wednesday, June 3, 15
Slide 12
Slide 12 text
Normalizing Expressions
Directly to Normal Form
Wednesday, June 3, 15
Slide 13
Slide 13 text
data Exp (γ : ℕ) : Set where
`Type : Exp γ
`Π : (A : Exp γ)(B : Exp (suc γ)) ! Exp γ
`λ : (b : Exp (suc γ)) ! Exp γ
`var : (i : Var γ) ! Exp γ
_`∙_ : (f : Exp γ)(a : Exp γ) ! Exp γ
Wednesday, June 3, 15
Slide 14
Slide 14 text
data Exp (γ : ℕ) : Set where
`Type : Exp γ
`Π : (A : Exp γ)(B : Bind Exp γ) ! Exp γ
`λ : (b : Bind Exp γ) ! Exp γ
`var : (i : Var γ) ! Exp γ
_`∙_ : (f : Exp γ)(a : Exp γ) ! Exp γ
Wednesday, June 3, 15
Slide 15
Slide 15 text
record Bind (A : ℕ ! Set) (γ : ℕ) : Set where
inductive
constructor `∣_∣
field
val : A (suc γ)
Wednesday, June 3, 15
Slide 16
Slide 16 text
norm : ∀{γ} ! Exp γ ! Exp γ
norm `Type = `Type
norm (`Π A B) = `Π (norm A) `∣ norm B ∣
norm (`λ b) = `λ `∣ norm b ∣
norm (`var i) = `var i
norm (f `∙ a) = norm f ∙ norm a
_∙_ : ∀{γ} ! Exp γ ! Exp γ ! Exp γ
`λ `∣ b ∣ ∙ a = norm (sub a b)
f ∙ a = f `∙ a
Wednesday, June 3, 15
Slide 17
Slide 17 text
norm : ∀{γ} ! Exp γ ! Exp γ
norm `Type = `Type
norm (`Π A B) = `Π (norm A) (normᴮ B)
norm (`λ b) = `λ (normᴮ b)
norm (`var i) = `var i
norm (f `∙ a) = norm f ∙ norm a
normᴮ : ∀{γ} ! Bind Exp γ ! Bind Exp γ
normᴮ `∣ b ∣ = `∣ norm b ∣
_∙_ : ∀{γ} ! Exp γ ! Exp γ ! Exp γ
`λ b ∙ a = b ∙ᴮ a
f ∙ a = f `∙ a
_∙ᴮ_ : ∀{γ} ! Bind Exp γ ! Exp γ ! Exp γ
`∣ b ∣ ∙ᴮ a = norm (sub a b)
Wednesday, June 3, 15
Slide 18
Slide 18 text
Normalizing Expressions
via Hereditary Substitution
Wednesday, June 3, 15
Slide 19
Slide 19 text
data Nf (γ : ℕ) : Set where
`Type : Nf γ
`Π : (A : Nf γ) (B : Bind Nf γ) ! Nf γ
`λ : (b : Bind Nf γ) ! Nf γ
`[_] : Ne γ ! Nf γ
data Ne (γ : ℕ) : Set where
`var : (i : Var γ) ! Ne γ
_`∙_ : (f : Ne γ) (a : Nf γ) ! Ne γ
Wednesday, June 3, 15
Slide 20
Slide 20 text
Env : ℕ ! ℕ ! Set
Env φ γ = Vec (Nf φ) γ
_`!_ : ∀{γ} (A B : Nf γ) ! Nf γ
A `! B = `Π A `∣ wkn B ∣
lift : ∀{φ γ} ! Env φ γ ! Env (suc φ) (suc γ)
lift σ = `x 0 ∷ map wkn σ
Wednesday, June 3, 15
Slide 21
Slide 21 text
hsub : ∀{φ γ} ! Env φ γ ! Nf γ ! Nf φ
hsub σ `Type = `Type
hsub σ (`Π A B) = `Π (hsub σ A) (hsubᴮ σ B)
hsub σ (`λ b) = `λ (hsubᴮ σ b)
hsub σ `[ a ] = hsubᴺ σ a
hsubᴺ : ∀{φ γ} ! Env φ γ ! Ne γ ! Nf φ
hsubᴺ σ (`var i) = lookup i σ
hsubᴺ σ (f `∙ a) = hsubᴺ σ f ∙ hsub σ a
Wednesday, June 3, 15
Slide 22
Slide 22 text
hsubᴮ : ∀{φ γ}
! Env φ γ ! Bind Nf γ ! Bind Nf φ
hsubᴮ σ `∣ b ∣ = `∣ hsub (lift σ) b ∣
_∙_ : ∀{γ} ! Nf γ ! Nf γ ! Nf γ
`λ b ∙ a = b ∙ᴷ a
`[ f ] ∙ a = `[ f `∙ a ]
f ∙ a = undefined
_∙ᴷ_ : ∀{γ} ! Bind Nf γ ! Nf γ ! Nf γ
`∣ b ∣ ∙ᴷ a = hsub (a ∷ idEnv) b
Wednesday, June 3, 15
Slide 23
Slide 23 text
Wednesday, June 3, 15
Slide 24
Slide 24 text
Type Theory
U = { all types }
Wednesday, June 3, 15
Slide 25
Slide 25 text
Canonical Type Theory
U - Π
Π
Wednesday, June 3, 15
Slide 26
Slide 26 text
Canonical Type Theory
U - Π
Π
Wednesday, June 3, 15
Slide 27
Slide 27 text
data Exp (γ : ℕ) : Set where
`λ : (b : Bind Exp γ) ! Exp γ
`var : (i : Var γ) ! Exp γ
_`∙_ : (f : Exp γ) (a : Exp γ) ! Exp γ
Wednesday, June 3, 15
Slide 28
Slide 28 text
Pi : Nf 0
Pi = `Π `Type `∣ `x 0 `! `Type ∣ `! `Type
Π' : Nf 0
Π' = `λ `∣ `λ `∣ `Π (`x 1) `∣
`[ `xᴺ 1 `∙ `x 0 ] ∣ ∣ ∣
Prim : ℕ
Prim = 2
prim : Env 0 Prim
prim = Π' ∷ `Type ∷ []
Wednesday, June 3, 15
Slide 29
Slide 29 text
norm : ∀{γ} ! Exp γ ! Nf γ
norm (`λ b) = `λ (normᴮ b)
norm (`var i) = `[ `var i ]
norm (f `∙ a) = norm f ∙ norm a
normᴮ : ∀{γ} ! Bind Exp γ ! Bind Nf γ
normᴮ `∣ b ∣ = `∣ norm b ∣
prim-norm : Exp Prim ! Nf 0
prim-norm = hsub prim ∘ norm
Wednesday, June 3, 15
Slide 30
Slide 30 text
Normalizing Expressions
Through WHNF
Wednesday, June 3, 15
Slide 31
Slide 31 text
data Exp (γ : ℕ) : Set where
`Type : Exp γ
`Π : (A : Exp γ) (B : Bind Exp γ) ! Exp γ
`λ : (b : Bind Exp γ) ! Exp γ
`var : (i : Var γ) ! Exp γ
_`∙_ : (f : Exp γ) (a : Exp γ) ! Exp γ
Wednesday, June 3, 15
Slide 32
Slide 32 text
wh-norm : ∀{γ} ! Exp γ ! Exp γ
wh-norm `Type = `Type
wh-norm (`Π A B) =
`Π (wh-norm A) (wh-normᴮ B)
wh-norm (`λ b) =
`λ (wh-normᴮ b)
wh-norm (`var i) = `var i
wh-norm (f `∙ a) = wh-norm f ∙ wh-norm a
Wednesday, June 3, 15
Slide 33
Slide 33 text
wh-normᴮ : ∀{γ} ! Bind Exp γ ! Bind Exp γ
wh-normᴮ b = b
_∙_ : ∀{γ} ! Exp γ ! Exp γ ! Exp γ
`λ b ∙ a = b ∙ᴮ a
f ∙ a = f `∙ a
_∙ᴮ_ : ∀{γ} ! Bind Exp γ ! Exp γ ! Exp γ
`∣ b ∣ ∙ᴮ a = wh-norm (sub a b)
Wednesday, June 3, 15
Slide 34
Slide 34 text
-- WHNF as input
force : ∀{γ} ! Exp γ ! Exp γ
force `Type = `Type
force (`Π A B) = `Π (force A) (forceᴮ B)
force (`λ b) = `λ (forceᴮ b)
force (`var i) = `var i
force (f `∙ a) = force f `∙ force a
forceᴮ : ∀{γ} ! Bind Exp γ ! Bind Exp γ
forceᴮ `∣ b ∣ = `∣ force (wh-norm b) ∣
norm : ∀{γ} ! Exp γ ! Exp γ
norm = force ∘ wh-norm
Wednesday, June 3, 15
Slide 35
Slide 35 text
Normalizing using an
Environment Machine*
via Dependent WHNFs
* Such as Krivine’s machine, Felleisen et al.’s CEK
machine, and Leroy’s Zinc abstract machine.
Wednesday, June 3, 15
Slide 36
Slide 36 text
data Exp (γ : ℕ) : Set where
`Type : Exp γ
`Π : (A : Exp γ) (B : Bind Exp γ) ! Exp γ
`λ : (b : Bind Exp γ) ! Exp γ
`var : (i : Var γ) ! Exp γ
_`∙_ : (f : Exp γ) (a : Exp γ) ! Exp γ
Wednesday, June 3, 15
Slide 37
Slide 37 text
data Wh (γ : ℕ) : Set where
`Type : Wh γ
`Π : (A : Wh γ){δ:ℕ}
(σ : Env γ δ)(B : Exp (suc δ)) ! Wh γ
`λ : {δ:ℕ}
(σ : Env γ δ)(b : Exp (suc δ)) ! Wh γ
`[_] : Nu γ ! Wh γ
data Nu (γ : ℕ) : Set where
`var : (i : Var γ) ! Nu γ
_`∙_ : (f : Nu γ) (a : Wh γ) ! Nu γ
Wednesday, June 3, 15
Slide 38
Slide 38 text
data Wh (γ : ℕ) : Set where
`Type : Wh γ
`Π : (A : Wh γ) (B : Close Wh Exp γ) ! Wh γ
`λ : (b : Close Wh Exp γ) ! Wh γ
`[_] : Nu γ ! Wh γ
data Nu (γ : ℕ) : Set where
`var : (i : Var γ) ! Nu γ
_`∙_ : (f : Nu γ) (a : Wh γ) ! Nu γ
Wednesday, June 3, 15
Slide 39
Slide 39 text
record Bind (A : ℕ ! Set) (γ : ℕ) : Set where
inductive
constructor `∣_∣
field
val : A (suc γ)
Wednesday, June 3, 15
Slide 40
Slide 40 text
record Close
(A B : ℕ ! Set) (γ : ℕ) : Set where
inductive
constructor _`/_
field
{scope} : ℕ
env : Vec (A γ) scope
val : B (suc scope)
Wednesday, June 3, 15
Slide 41
Slide 41 text
Env : ℕ ! ℕ ! Set
Env φ γ = Vec (Wh φ) γ
_`!_ : ∀{γ} (A : Wh γ) (B : Exp γ) ! Wh γ
A `! B = `Π A ∣ wkn B ∣
∣_∣ : ∀{γ} ! Exp (suc γ) ! Close Wh Exp γ
∣ a ∣ = idEnv `/ a
Wednesday, June 3, 15
Slide 42
Slide 42 text
eval : ∀{φ γ} ! Env φ γ ! Exp γ ! Wh φ
eval σ `Type = `Type
eval σ (`Π A B) =
`Π (eval σ A) (evalᴷ σ B)
eval σ (`λ b) =
`λ (evalᴷ σ b)
eval σ (`var i) = lookup i σ
eval σ (f `∙ a) = eval σ f ∙ eval σ a
Wednesday, June 3, 15
Slide 43
Slide 43 text
evalᴷ : ∀{φ γ}
! Env φ γ ! Bind Exp γ ! Close Wh Exp φ
evalᴷ σ `∣ b ∣ = σ `/ b
_∙_ : ∀{γ} ! Wh γ ! Wh γ ! Wh γ
`λ b ∙ a = b ∙ᴷ a
`[ f ] ∙ a = `[ f `∙ a ]
f ∙ a = undefined
_∙ᴷ_ : ∀{γ} ! Close Wh Exp γ ! Wh γ ! Wh γ
(σ `/ b) ∙ᴷ a = eval (a ∷ σ) b
Wednesday, June 3, 15
Slide 44
Slide 44 text
data Nf (γ : ℕ) : Set where
`Type : Nf γ
`Π : (A : Nf γ) (B : Bind Nf γ) ! Nf γ
`λ : (b : Bind Nf γ) ! Nf γ
`[_] : Ne γ ! Nf γ
data Ne (γ : ℕ) : Set where
`var : (i : Var γ) ! Ne γ
_`∙_ : (f : Ne γ) (a : Nf γ) ! Ne γ
Wednesday, June 3, 15
Slide 45
Slide 45 text
force : ∀{γ} ! Wh γ ! Nf γ
force `Type = `Type
force (`Π A B) = `Π (force A) (forceᴷ B)
force (`λ b) = `λ (forceᴷ b)
force `[ a ] = `[ forceᴺ a ]
forceᴺ : ∀{γ} ! Nu γ ! Ne γ
forceᴺ (`var i) = `var i
forceᴺ (f `∙ a) = forceᴺ f `∙ force a
Wednesday, June 3, 15
Slide 46
Slide 46 text
forceᴷ : ∀{γ} ! Close Wh Exp γ ! Bind Nf γ
forceᴷ b = `∣ force (! b) ∣
!_ : ∀{γ} ! Close Wh Exp γ ! Wh (suc γ)
! (σ `/ b) = eval (lift σ) b
wh-norm : ∀{γ} ! Exp γ ! Wh γ
wh-norm = eval idEnv
norm : ∀{γ} ! Exp γ ! Nf γ
norm = force ∘ wh-norm
Wednesday, June 3, 15
Slide 47
Slide 47 text
Normalizing using an
Environment Machine*
via Independent WHNFs
* Such as Krivine’s machine, Felleisen et al.’s CEK
machine, and Leroy’s Zinc abstract machine.
Wednesday, June 3, 15
Slide 48
Slide 48 text
data Wh (γ : ℕ) : Set where
`Type : Wh γ
`Π : (A : Wh γ) (B : Close Wh Wh γ) ! Wh γ
`λ : (b : Close Wh Wh γ) ! Wh γ
`[_] : Nu γ ! Wh γ
data Nu (γ : ℕ) : Set where
`var : (i : Var γ) ! Nu γ
_`∙_ : (f : Nu γ) (a : Wh γ) ! Nu γ
Wednesday, June 3, 15
Slide 49
Slide 49 text
Env : ℕ ! ℕ ! Set
Env φ γ = Vec (Wh φ) γ
_`!_ : ∀{γ} (A B : Wh γ) ! Wh γ
A `! B = `Π A ∣ wkn B ∣
∣_∣ : ∀{γ} ! Wh (suc γ) ! Close Wh Wh γ
∣ a ∣ = idEnv `/ a
Wednesday, June 3, 15
Slide 50
Slide 50 text
wh-hsub : ∀{φ γ} ! Env φ γ ! Wh γ ! Wh φ
wh-hsub σ `Type = `Type
wh-hsub σ (`Π A B) =
`Π (wh-hsub σ A) (wh-hsubᴷ σ B)
wh-hsub σ (`λ b) =
`λ (wh-hsubᴷ σ b)
wh-hsub σ `[ a ] = wh-hsubᴺ σ a
wh-hsubᴺ : ∀{φ γ} ! Env φ γ ! Nu γ ! Wh φ
wh-hsubᴺ σ (`var i) = lookup i σ
wh-hsubᴺ σ (f `∙ a) =
wh-hsubᴺ σ f ∙ wh-hsub σ a
Wednesday, June 3, 15
Slide 51
Slide 51 text
wh-hsubᴷ : ∀{φ γ} !
Env φ γ ! Close Wh Wh γ ! Close Wh Wh φ
wh-hsubᴷ σ (ρ `/ b) = map (wh-hsub σ) ρ `/ b
_∙_ : ∀{γ} ! Wh γ ! Wh γ ! Wh γ
`λ b ∙ a = b ∙ᴷ a
`[ f ] ∙ a = `[ f `∙ a ]
f ∙ a = undefined
_∙ᴷ_ : ∀{γ} ! Close Wh Wh γ ! Wh γ ! Wh γ
(σ `/ b) ∙ᴷ a = wh-hsub (a ∷ σ) b
Wednesday, June 3, 15
Slide 52
Slide 52 text
data Nf (γ : ℕ) : Set where
`Type : Nf γ
`Π : (A : Nf γ) (B : Bind Nf γ) ! Nf γ
`λ : (b : Bind Nf γ) ! Nf γ
`[_] : Ne γ ! Nf γ
data Ne (γ : ℕ) : Set where
`var : (i : Var γ) ! Ne γ
_`∙_ : (f : Ne γ) (a : Nf γ) ! Ne γ
Wednesday, June 3, 15
Slide 53
Slide 53 text
force : ∀{γ} ! Wh γ ! Nf γ
force `Type = `Type
force (`Π A B) = `Π (force A) (forceᴷ B)
force (`λ b) = `λ (forceᴷ b)
force `[ a ] = `[ forceᴺ a ]
forceᴺ : ∀{γ} ! Nu γ ! Ne γ
forceᴺ (`var i) = `var i
forceᴺ (f `∙ a) = forceᴺ f `∙ force a
Wednesday, June 3, 15
Slide 54
Slide 54 text
forceᴷ : ∀{γ} ! Close Wh Wh γ ! Bind Nf γ
forceᴷ b = `∣ force (! b) ∣
!_ : ∀{γ} ! Close Wh Wh γ ! Wh (suc γ)
! (σ `/ b) = wh-hsub (lift σ) b
Wednesday, June 3, 15
Slide 55
Slide 55 text
data Exp (γ : ℕ) : Set where
`λ : (b : Bind Exp γ) ! Exp γ
`var : (i : Var γ) ! Exp γ
_`∙_ : (f : Exp γ) (a : Exp γ) ! Exp γ
Wednesday, June 3, 15
Slide 56
Slide 56 text
Pi : Wh 0
Pi = `Π `Type `∣ `x 0 `! `Type ∣ `! `Type
Π' : Wh 0
Π' = `λ `∣ `λ `∣ `Π (`x 1) `∣
`[ `xᴺ 1 `∙ `x 0 ] ∣ ∣ ∣
Prim : ℕ
Prim = 2
prim : Env 0 Prim
prim = Π' ∷ `Type ∷ []
Wednesday, June 3, 15
Slide 57
Slide 57 text
wh-norm : ∀{γ} ! Exp γ ! Wh γ
wh-norm (`λ b) = `λ (wh-normᴮ b)
wh-norm (`var i) = `[ `var i ]
wh-norm (f `∙ a) = wh-norm f ∙ wh-norm a
wh-normᴮ : ∀{γ} ! Bind Exp γ ! Close Wh Wh γ
wh-normᴮ `∣ b ∣ = ∣ wh-norm b ∣
Wednesday, June 3, 15
Slide 58
Slide 58 text
prim-wh-norm : Exp Prim ! Wh 0
prim-wh-norm = wh-hsub prim ∘ wh-norm
norm : ∀{γ} ! Exp γ ! Nf γ
norm = force ∘ wh-norm
prim-norm : Exp Prim ! Nf 0
prim-norm = force ∘ prim-wh-norm
Wednesday, June 3, 15
Slide 59
Slide 59 text
Incremental WHNF
κ-Conversion
Wednesday, June 3, 15
Slide 60
Slide 60 text
infer : ∀{γ} ! Ctx γ ! Exp γ ! Maybe (Wh γ)
infer Γ (f `∙ a) =
infer Γ a >>= λ A !
infer Γ f >>= λ
{ (`Π A' B) !
if A ≈ A'
then return (B ∙ᴷ wh-norm a)
else nothing
; _ ! nothing }
Wednesday, June 3, 15
_≈ᴷ_ : ∀{γ}
! Close Wh Wh γ
! Close Wh Wh γ
! Bool
b₁ ≈ᴷ b₂ = b₁ == b₂
∨ (! b₁) ≈ (! b₂)
!_ : ∀{γ} ! Close Wh Wh γ ! Wh (suc γ)
! (σ `/ b) = wh-hsub (lift σ) b
Wednesday, June 3, 15
Slide 63
Slide 63 text
POPL Goal
• All partial functions formalized as relations
• Realizability semantics for independent WHNFs
• Termination proof for wh-hsub
• Decidability proof for κ-conversion
• Completed above for Gödel’s System T
• Currently extending to MLTT
Wednesday, June 3, 15