From ee37f2eb6d73b6ef5b3f9a9589bd72eb30d464dc Mon Sep 17 00:00:00 2001 From: Max New <maxsnew@gmail.com> Date: Fri, 27 Apr 2018 18:27:12 -0400 Subject: [PATCH] [agda] change to de bruijn because of better judgmental equality --- code/gcbpv.agda | 240 +++++++++++++++++++++++++++--------------------- 1 file changed, 133 insertions(+), 107 deletions(-) diff --git a/code/gcbpv.agda b/code/gcbpv.agda index a8b65dd..31cb0d7 100644 --- a/code/gcbpv.agda +++ b/code/gcbpv.agda @@ -4,27 +4,39 @@ open import Data.Empty open import Data.Unit open import Data.Sum open import Relation.Binary.PropositionalEquality +open import Data.Nat +open import Data.Fin +open import Data.Vec +import Data.Vec.Properties open ≡-Reasoning +lookup-map : ∀ {a b n} {A : Set a} {B : Set b} + (i : Fin n) (f : A → B) (xs : Vec A n) → + lookup i (Data.Vec.map f xs) ≡ f (lookup i xs) +lookup-map zero f (x ∷ xs) = refl +lookup-map (suc i) f (x ∷ xs) = lookup-map i f xs + data Stoup : Set where None : Stoup One : Stoup -⟦_⟧st : Stoup -> Set -⟦ None ⟧st = ⊥ -⟦ One ⟧st = ⊤ +-- | Semantics +-- | ⟦ S ⟧st X =~ ⟦ S ⟧ -> X +⟦_⟧st : Stoup -> Set -> Set +⟦ None ⟧st X = ⊤ +⟦ One ⟧st X = X record StCtx (X : Set) : Set where constructor stctx field S : Stoup - ty : ⟦ S ⟧st -> X + ty : ⟦ S ⟧st X cdot : forall (X : Set) -> StCtx X -cdot X = record { S = None ; ty = ⊥-elim } +cdot X = record { S = None ; ty = tt } hstoup : forall {Y : Set} -> Y -> StCtx Y -hstoup B = record { S = One ; ty = \ x → B } +hstoup B = record { S = One ; ty = B } data Dimension : Set where Top : Dimension @@ -118,98 +130,102 @@ clttrans B1 B2 B3 (lt B12 x xâ‚) (lt B23 xâ‚‚ x₃) = lt (ctrans B12 B23 (trans record VCtx (I : DCtx) : Setâ‚ where field - Vars : Set - vty : Vars -> VType I + Vars : â„• + vty : Vec (VType I) Vars infixl 20 _,,_ _,,_ : forall {I} -> VCtx I -> VType I -> VCtx I -Γ ,, A = record { Vars = VCtx.Vars Γ ⊎ ⊤ ; vty = \ { (injâ‚ x) -> VCtx.vty Γ x; (injâ‚‚ tt) -> A } } +Γ ,, A = record { Vars = suc (VCtx.Vars Γ) ; vty = A ∷ VCtx.vty Γ } infix 90 _⟪_⟫v infix 90 _⟪_⟫c _⟪_⟫v : VCtx onevar -> Dimension -> VCtx (cdot _) -Γ ⟪ i ⟫v = record { Vars = VCtx.Vars Γ ; vty = λ x → ((VCtx.vty Γ) x) ⟨ i ⟩v } +Γ ⟪ i ⟫v = record { Vars = VCtx.Vars Γ ; vty = Data.Vec.map (\A -> A ⟨ i ⟩v) (VCtx.vty Γ) } -vctxrefl : VCtx (cdot _) -> VCtx onevar -vctxrefl Γ = record { Vars = VCtx.Vars Γ ; vty = λ x → vrefl (VCtx.vty Γ x) } +-- ctx-app-lem : ∀ Γ i -> Γ ⟪ i ⟫v -record VctxComp (Γ⊤ Γ⊥ : VCtx onevar) : Setâ‚ where - field - SameVar : Set - eq⊤ : SameVar ≡ VCtx.Vars Γ⊤ - eq⊥ : SameVar ≡ VCtx.Vars Γ⊥ - eqδ : - forall (x : SameVar) -> - (VCtx.vty Γ⊤ (subst _ eq⊤ x) ⟨ Bot ⟩v) ≡ VCtx.vty Γ⊥ (subst _ eq⊥ x) ⟨ Top ⟩v - -eq-to-compvars : ∀ Γ⊤ Γ⊥ -> Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v -> VCtx.Vars Γ⊤ ≡ VCtx.Vars Γ⊥ -eq-to-compvars Γ⊤ Γ⊥ eq = - begin VCtx.Vars Γ⊤ - ≡⟨ refl ⟩ - VCtx.Vars (Γ⊤ ⟪ Bot ⟫v) - ≡⟨ cong VCtx.Vars eq ⟩ - VCtx.Vars (Γ⊥ ⟪ Top ⟫v) - ≡⟨ refl ⟩ - VCtx.Vars Γ⊥ - ∎ - -lemlem : forall {I} Vars (vty1 : Vars -> VType I) vty2 -> record { Vars = Vars ; vty = vty1 } ≡ record { Vars = Vars; vty = vty2 } -> vty1 ≡ vty2 -lemlem Vars vty1 vty2 refl = refl - -lem : ∀ (Γ⊥ : VCtx onevar) -> - (Γ⊤ : VCtx onevar) -> - (p : Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v) -> - (x : VCtx.Vars Γ⊤) -> - VCtx.vty (Γ⊤ ⟪ Bot ⟫v) x ≡ VCtx.vty (Γ⊥ ⟪ Top ⟫v) (subst (λ v → v) (eq-to-compvars Γ⊤ Γ⊥ p) x) -lem Γ⊥ Γ⊤ p x with (eq-to-compvars Γ⊤ Γ⊥ p) -lem Γ⊥ record { Vars = .(VCtx.Vars Γ⊥) ; vty = vty⊤ } p Vars⊥ | refl = - begin - vty⊤ Vars⊥ ⟨ Bot ⟩v - ≡⟨ refl ⟩ - VCtx.vty (record { Vars = VCtx.Vars Γ⊥ ; vty = λ x → vty⊤ x ⟨ Bot ⟩v }) Vars⊥ - ≡⟨ cong (λ x → VCtx.vty (record { Vars = VCtx.Vars Γ⊥ ; vty = x }) Vars⊥) (lemlem (VCtx.Vars Γ⊥) (λ z → vty⊤ z ⟨ Bot ⟩v) ((λ x → VCtx.vty Γ⊥ x ⟨ Top ⟩v)) p) ⟩ - VCtx.vty (record { Vars = VCtx.Vars Γ⊥ ; vty = λ x → VCtx.vty Γ⊥ x ⟨ Top ⟩v }) Vars⊥ - ≡⟨ refl ⟩ - VCtx.vty Γ⊥ Vars⊥ ⟨ Top ⟩v - ∎ - -eq-to-comp : ∀ Γ⊤ Γ⊥ -> Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v -> VctxComp Γ⊤ Γ⊥ -eq-to-comp Γ⊤ Γ⊥ p = - record { - SameVar = VCtx.Vars Γ⊤ ; - eq⊤ = refl ; - eq⊥ = eq-to-compvars Γ⊤ Γ⊥ p ; - eqδ = λ x → - begin - VCtx.vty Γ⊤ x ⟨ Bot ⟩v - ≡⟨ refl ⟩ - VCtx.vty (Γ⊤ ⟪ Bot ⟫v) x - ≡⟨ lem Γ⊥ Γ⊤ p x ⟩ - VCtx.vty (Γ⊥ ⟪ Top ⟫v) (subst (λ v → v) (eq-to-compvars Γ⊤ Γ⊥ p) x) - ≡⟨ refl ⟩ - VCtx.vty Γ⊥ (subst (λ v → v) (eq-to-compvars Γ⊤ Γ⊥ p) x) ⟨ Top ⟩v - ∎ - } - -vctxtrans : ∀ (Γ⊤ Γ⊥ : VCtx onevar) -> Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v -> VCtx onevar -vctxtrans Γ⊤ Γ⊥ p with eq-to-comp Γ⊤ Γ⊥ p -vctxtrans Γ⊤ Γ⊥ p | record { SameVar = SameVar ; eq⊤ = eq⊤ ; eq⊥ = eq⊥ ; eqδ = eqδ } = - record { Vars = SameVar ; vty = λ x → - vtrans (VCtx.vty Γ⊤ (subst (λ z → z) eq⊤ x)) - (VCtx.vty Γ⊥ (subst (λ z → z) eq⊥ x)) - (eqδ x) - } +vctxrefl : VCtx (cdot _) -> VCtx onevar +vctxrefl Γ = record { Vars = VCtx.Vars Γ ; vty = Data.Vec.map vrefl (VCtx.vty Γ) } + +-- record VctxComp (Γ⊤ Γ⊥ : VCtx onevar) : Setâ‚ where +-- field +-- SameVar : Set +-- eq⊤ : SameVar ≡ VCtx.Vars Γ⊤ +-- eq⊥ : SameVar ≡ VCtx.Vars Γ⊥ +-- eqδ : +-- forall (x : SameVar) -> +-- (VCtx.vty Γ⊤ (subst _ eq⊤ x) ⟨ Bot ⟩v) ≡ VCtx.vty Γ⊥ (subst _ eq⊥ x) ⟨ Top ⟩v + +-- eq-to-compvars : ∀ Γ⊤ Γ⊥ -> Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v -> VCtx.Vars Γ⊤ ≡ VCtx.Vars Γ⊥ +-- eq-to-compvars Γ⊤ Γ⊥ eq = +-- begin VCtx.Vars Γ⊤ +-- ≡⟨ refl ⟩ +-- VCtx.Vars (Γ⊤ ⟪ Bot ⟫v) +-- ≡⟨ cong VCtx.Vars eq ⟩ +-- VCtx.Vars (Γ⊥ ⟪ Top ⟫v) +-- ≡⟨ refl ⟩ +-- VCtx.Vars Γ⊥ +-- ∎ + +-- lemlem : forall {I} Vars (vty1 : Vars -> VType I) vty2 -> record { Vars = Vars ; vty = vty1 } ≡ record { Vars = Vars; vty = vty2 } -> vty1 ≡ vty2 +-- lemlem Vars vty1 vty2 refl = refl + +-- lem : ∀ (Γ⊥ : VCtx onevar) -> +-- (Γ⊤ : VCtx onevar) -> +-- (p : Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v) -> +-- (x : VCtx.Vars Γ⊤) -> +-- VCtx.vty (Γ⊤ ⟪ Bot ⟫v) x ≡ VCtx.vty (Γ⊥ ⟪ Top ⟫v) (subst (λ v → v) (eq-to-compvars Γ⊤ Γ⊥ p) x) +-- lem Γ⊥ Γ⊤ p x with (eq-to-compvars Γ⊤ Γ⊥ p) +-- lem Γ⊥ record { Vars = .(VCtx.Vars Γ⊥) ; vty = vty⊤ } p Vars⊥ | refl = +-- begin +-- vty⊤ Vars⊥ ⟨ Bot ⟩v +-- ≡⟨ refl ⟩ +-- VCtx.vty (record { Vars = VCtx.Vars Γ⊥ ; vty = λ x → vty⊤ x ⟨ Bot ⟩v }) Vars⊥ +-- ≡⟨ cong (λ x → VCtx.vty (record { Vars = VCtx.Vars Γ⊥ ; vty = x }) Vars⊥) (lemlem (VCtx.Vars Γ⊥) (λ z → vty⊤ z ⟨ Bot ⟩v) ((λ x → VCtx.vty Γ⊥ x ⟨ Top ⟩v)) p) ⟩ +-- VCtx.vty (record { Vars = VCtx.Vars Γ⊥ ; vty = λ x → VCtx.vty Γ⊥ x ⟨ Top ⟩v }) Vars⊥ +-- ≡⟨ refl ⟩ +-- VCtx.vty Γ⊥ Vars⊥ ⟨ Top ⟩v +-- ∎ + +-- eq-to-comp : ∀ Γ⊤ Γ⊥ -> Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v -> VctxComp Γ⊤ Γ⊥ +-- eq-to-comp Γ⊤ Γ⊥ p = +-- record { +-- SameVar = VCtx.Vars Γ⊤ ; +-- eq⊤ = refl ; +-- eq⊥ = eq-to-compvars Γ⊤ Γ⊥ p ; +-- eqδ = λ x → +-- begin +-- VCtx.vty Γ⊤ x ⟨ Bot ⟩v +-- ≡⟨ refl ⟩ +-- VCtx.vty (Γ⊤ ⟪ Bot ⟫v) x +-- ≡⟨ lem Γ⊥ Γ⊤ p x ⟩ +-- VCtx.vty (Γ⊥ ⟪ Top ⟫v) (subst (λ v → v) (eq-to-compvars Γ⊤ Γ⊥ p) x) +-- ≡⟨ refl ⟩ +-- VCtx.vty Γ⊥ (subst (λ v → v) (eq-to-compvars Γ⊤ Γ⊥ p) x) ⟨ Top ⟩v +-- ∎ +-- } + +-- vctxtrans : ∀ (Γ⊤ Γ⊥ : VCtx onevar) -> Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v -> VCtx onevar +-- vctxtrans Γ⊤ Γ⊥ p with eq-to-comp Γ⊤ Γ⊥ p +-- vctxtrans Γ⊤ Γ⊥ p | record { SameVar = SameVar ; eq⊤ = eq⊤ ; eq⊥ = eq⊥ ; eqδ = eqδ } = +-- record { Vars = SameVar ; vty = λ x → +-- vtrans (VCtx.vty Γ⊤ (subst (λ z → z) eq⊤ x)) +-- (VCtx.vty Γ⊥ (subst (λ z → z) eq⊥ x)) +-- (eqδ x) +-- } CCtx : DCtx -> Set CCtx I = StCtx (CType I) _⟪_⟫c : CCtx onevar -> Dimension -> CCtx (cdot _) -Δ ⟪ i ⟫c = stctx (StCtx.S Δ) λ x → StCtx.ty Δ x ⟨ i ⟩c +stctx None ty ⟪ i ⟫c = stctx None tt +stctx One ty ⟪ i ⟫c = stctx One (ty ⟨ i ⟩c) cctxrefl : CCtx (cdot _) -> CCtx onevar -cctxrefl Δ = stctx (StCtx.S Δ) λ x → crefl (StCtx.ty Δ x) +cctxrefl (stctx None ty) = stctx None tt +cctxrefl (stctx One ty) = stctx One (crefl ty) data Value : forall {I} -> VCtx I -> VType I -> Setâ‚ _⟨_⟩vv : forall {Γ : VCtx onevar} {A} -> @@ -228,7 +244,7 @@ _⟨_⟩cc : forall {Γ : VCtx onevar}{Δ}{B} -> Term (Γ ⟪ i ⟫v) (Δ ⟪ i ⟫c) (B ⟨ i ⟩c) data Value where - var : forall {I} (Γ : VCtx I) (x : VCtx.Vars Γ) -> Value Γ (VCtx.vty Γ x) + var : forall {I} (Γ : VCtx I) (x : Fin (VCtx.Vars Γ)) A -> A ≡ lookup x (VCtx.vty Γ) -> Value Γ A vunit : forall {I} (Γ : VCtx I) -> Value Γ (VUnit _) vpair : forall {I}{Γ : VCtx I}{A}{A'} -> Value Γ A -> Value Γ A' -> Value Γ (A × A') vdestr : forall {I}{Γ : VCtx I}{A}{A'}{Am} -> @@ -238,23 +254,26 @@ data Value where vthunk : forall {I}{Γ : VCtx I}{B} -> Term Γ (cdot _) B -> Value Γ (U B) - valtrans : forall {Γ⊤}{Γ⊥}{A⊤}{A⊥} -> - (pctx : Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v) -> - (pty : A⊤ ⟨ Bot ⟩v ≡ A⊥ ⟨ Top ⟩v) -> - (v⊤ : Value Γ⊤ A⊤) -> - (v⊥ : Value Γ⊥ A⊥) -> - ValCompat Γ⊤ Γ⊥ A⊤ A⊥ pctx pty v⊤ v⊥ -> - Value (vctxtrans Γ⊤ Γ⊥ pctx) (vtrans A⊤ A⊥ pty) - -- VCtx.Vars Γ⊤ ≡ VCtx.Vars Γ⊥ -> - -- {!!} - -var Γ x ⟨ i ⟩vv = var (Γ ⟪ i ⟫v) x + -- valtrans : forall {Γ⊤}{Γ⊥}{A⊤}{A⊥} -> + -- (pctx : Γ⊤ ⟪ Bot ⟫v ≡ Γ⊥ ⟪ Top ⟫v) -> + -- (pty : A⊤ ⟨ Bot ⟩v ≡ A⊥ ⟨ Top ⟩v) -> + -- (v⊤ : Value Γ⊤ A⊤) -> + -- (v⊥ : Value Γ⊥ A⊥) -> + -- ValCompat Γ⊤ Γ⊥ A⊤ A⊥ pctx pty v⊤ v⊥ -> + -- Value (vctxtrans Γ⊤ Γ⊥ pctx) (vtrans A⊤ A⊥ pty) + +var Γ x A p ⟨ i ⟩vv = var (Γ ⟪ i ⟫v) x (A ⟨ i ⟩v) + (begin + A ⟨ i ⟩v + ≡⟨ cong (λ A → A ⟨ i ⟩v) p ⟩ + (lookup x (VCtx.vty Γ)) ⟨ i ⟩v + ≡⟨ sym (lookup-map x (\A -> A ⟨ i ⟩v) (VCtx.vty Γ)) ⟩ + lookup x (VCtx.vty (Γ ⟪ i ⟫v)) + ∎) vunit Γ ⟨ i ⟩vv = vunit (Γ ⟪ i ⟫v) vpair V V' ⟨ i ⟩vv = vpair (V ⟨ i ⟩vv) (V' ⟨ i ⟩vv) -vdestr V Vk ⟨ i ⟩vv = vdestr (V ⟨ i ⟩vv) {!Vk ⟨ i ⟩vv!} -vthunk M ⟨ i ⟩vv = vthunk {!M ⟨ i ⟩cc!} -(valtrans pctx pty v⊤ v⊥ compat) ⟨ Top ⟩vv = v⊤ ⟨ Top ⟩vv -(valtrans pctx pty v⊤ v⊥ compat) ⟨ Bot ⟩vv = {!v⊥ ⟨ Bot ⟩vv!} +vdestr V Vk ⟨ i ⟩vv = vdestr (V ⟨ i ⟩vv) (Vk ⟨ i ⟩vv) +vthunk M ⟨ i ⟩vv = vthunk (M ⟨ i ⟩cc) record ValCompat Γ⊤ Γ⊥ A⊤ A⊥ pctx pty v⊤ v⊥ where inductive @@ -285,25 +304,32 @@ data Term where Term Γ Δ B hole ⟨ i ⟩cc = hole -lambda M ⟨ i ⟩cc = {!lambda (M ⟨ i ⟩cc)!} +lambda M ⟨ i ⟩cc = lambda (M ⟨ i ⟩cc) app M V ⟨ i ⟩cc = app (M ⟨ i ⟩cc) (V ⟨ i ⟩vv) -force V ⟨ i ⟩cc = {!force (V ⟨ i ⟩vv)!} -ret V ⟨ i ⟩cc = {!ret (V ⟨ i ⟩vv)!} -lett M Mk ⟨ i ⟩cc = lett (M ⟨ i ⟩cc) {!Mk ⟨ i ⟩cc!} +force V ⟨ i ⟩cc = force (V ⟨ i ⟩vv) +ret V ⟨ i ⟩cc = ret (V ⟨ i ⟩vv) +lett M Mk ⟨ i ⟩cc = lett (M ⟨ i ⟩cc) (Mk ⟨ i ⟩cc) valrefl : forall {Γ}{A} -> Value Γ A -> Value (vctxrefl Γ) (vrefl A) termrefl : forall {Γ}{Δ}{B} -> Term Γ Δ B -> Term (vctxrefl Γ) (cctxrefl Δ) (crefl B) -valrefl (var Γ x) = var _ x +valrefl (var Γ x A p) = var (vctxrefl Γ) x (vrefl A) ( + begin + vrefl A + ≡⟨ cong vrefl p ⟩ + vrefl (lookup x (VCtx.vty Γ)) + ≡⟨ sym (lookup-map x vrefl (VCtx.vty Γ)) ⟩ + lookup x (VCtx.vty (vctxrefl Γ)) + ∎) valrefl (vunit Γ) = vunit _ valrefl (vpair V V') = vpair (valrefl V) (valrefl V') -valrefl (vdestr V Vk) = vdestr (valrefl V) {!valrefl Vk!} -valrefl (vthunk M) = vthunk {!termrefl M!} +valrefl (vdestr V Vk) = vdestr (valrefl V) (valrefl Vk) +valrefl (vthunk M) = vthunk (termrefl M) termrefl hole = hole -termrefl (lambda M) = {!lambda (termrefl M)!} +termrefl (lambda M) = lambda (termrefl M) termrefl (app M V) = app (termrefl M) (valrefl V) -termrefl (force V) = {!force (valrefl V)!} -termrefl (ret V) = {!ret (valrefl V)!} -termrefl (lett M Mk) = lett (termrefl M) {!(termrefl Mk)!} +termrefl (force V) = force (valrefl V) +termrefl (ret V) = ret (valrefl V) +termrefl (lett M Mk) = lett (termrefl M) ((termrefl Mk)) -- GitLab