Slide 1

Slide 1 text

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

Slide 61

Slide 61 text

_≈_ : ∀{γ} ! Wh γ ! Wh γ ! Bool `Type ≈ `Type = true `Π A₁ B₁ ≈ `Π A₂ B₂ = A₁ ≈ A₂ ∧ B₁ ≈ᴷ B₂ `λ b₁ ≈ `λ b₂ = b₁ ≈ᴷ b₂ `[ a₁ ] ≈ `[ a₂ ] = a₁ ≈ᴺ a₂ _ ≈ _ = false _≈ᴺ_ : ∀{γ} ! Nu γ ! Nu γ ! Bool (f₁ `∙ a₁) ≈ᴺ (f₂ `∙ a₂) = (f₁ ≈ᴺ f₂) ∧ a₁ ≈ a₂ `var i ≈ᴺ `var j = i ==ᴿ j _ ≈ᴺ _ = false Wednesday, June 3, 15

Slide 62

Slide 62 text

_≈ᴷ_ : ∀{γ} ! 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

Slide 64

Slide 64 text

Questions? > Wednesday, June 3, 15