diff options
author | Chloe Brown <chloe.brown.00@outlook.com> | 2025-02-19 15:47:36 +0000 |
---|---|---|
committer | Chloe Brown <chloe.brown.00@outlook.com> | 2025-02-19 15:47:36 +0000 |
commit | 25feb8c72e5e4a76fbd4ab381105de6c19d6ab50 (patch) | |
tree | dd7dab0dfaf0cef77b43ee96984cbda92fd084f4 /src/CBPV/Family.agda | |
parent | 7e0169f7b6b9cb4c4323c320982c93e622999943 (diff) |
Update to stdlib 2.1.1 and other changes.main
I don't fully know what has changed because the changes are so old.
Doesn't yet compile due to not finishing proofs in `CBPV.Frex.Comp`.
Diffstat (limited to 'src/CBPV/Family.agda')
-rw-r--r-- | src/CBPV/Family.agda | 594 |
1 files changed, 314 insertions, 280 deletions
diff --git a/src/CBPV/Family.agda b/src/CBPV/Family.agda index 4a64726..dd01777 100644 --- a/src/CBPV/Family.agda +++ b/src/CBPV/Family.agda @@ -1,362 +1,396 @@ module CBPV.Family where -open import Data.List as List using (List; []; _∷_; map) +open import Data.List as List using (List; []; _∷_; foldr) +open import Data.List.Relation.Unary.All using (All; []; _∷_) +open import Data.Sum as ⊎ using (_⊎_; inj₁; inj₂; [_,_]; [_,_]′) open import Data.Unit using (⊤) -open import Function.Base using (_∘_; _$_; _⟨_⟩_; flip; case_return_of_) +open import Function.Base using (_∘_; _$_; _⟨_⟩_; flip; case_returning_of_) open import Reflection hiding (name; Name; _≟_) -open import Reflection.Argument using (_⟨∷⟩_) -open import Reflection.Term as Term using (_⋯⟅∷⟆_) -open import Relation.Binary.PropositionalEquality +open import Reflection.AST.Argument using (_⟨∷⟩_; _⟅∷⟆_) +open import Reflection.AST.Term as Term using (_⋯⟅∷⟆_) +open import Relation.Binary.PropositionalEquality.Core +open import Relation.Binary.PropositionalEquality using (module ≡-Reasoning) open import Relation.Nullary using (yes; no) -open import CBPV.Context +import Data.Sum.Properties as ⊎ + +open import CBPV.Context hiding (foldr) open import CBPV.Type -- Families and Morphisms ----------------------------------------------------- -infix 4 _⇾_ _⇾ᵛ_ _⇾ᶜ_ +infix 4 _⇾_ _⇾ᵗ_ + +_-Family : Set → Set₁ +A -Family = GenContext A → Set + +_-Sorted-_-Family : Set → Set → Set₁ +A -Sorted- B -Family = A → B -Family -Family : Set₁ -Family = Context → Set +_-SortedFamily : Set → Set₁ +A -SortedFamily = A -Sorted- A -Family ValFamily : Set₁ -ValFamily = ValType → Family +ValFamily = ValType -SortedFamily CompFamily : Set₁ -CompFamily = CompType → Family +CompFamily = CompType -Sorted- ValType -Family -_⇾_ : Family → Family → Set -X ⇾ Y = {Γ : Context} → X Γ → Y Γ +_⇾_ : {A : Set} → A -Family → A -Family → Set +X ⇾ Y = {Γ : _} → X Γ → Y Γ -_⇾ᵛ_ : ValFamily → ValFamily → Set -V ⇾ᵛ W = {A : ValType} → V A ⇾ W A - -_⇾ᶜ_ : CompFamily → CompFamily → Set -C ⇾ᶜ D = {B : CompType} → C B ⇾ D B +_⇾ᵗ_ : {A B : Set} → A -Sorted- B -Family → A -Sorted- B -Family → Set +V ⇾ᵗ W = {τ : _} → V τ ⇾ W τ -- Variables ------------------------------------------------------------------- private variable - Γ Δ Θ Π : Context - A A′ : ValType x y : Name - V W X : ValFamily + A B C : Set + Γ Δ Θ Π : GenContext A + τ τ′ : A + X Y : A -Sorted- B -Family -data VarPos (x : Name) (A : ValType) : Context → Set where - Here : VarPos x A (Γ :< (x :- A)) - There : VarPos x A Γ → VarPos x A (Γ :< (y :- A′)) +data VarPos (x : Name) (τ : A) : GenContext A → Set where + Here : VarPos x τ (Γ :< (x :- τ)) + There : VarPos x τ Γ → VarPos x τ (Γ :< (y :- τ′)) -weaklPos : (Δ : Context) → VarPos x A Γ → VarPos x A (Γ ++ Δ) -weaklPos [<] i = i -weaklPos (Δ :< (x :- A)) i = There (weaklPos Δ i) +record Var (τ : A) (Γ : GenContext A) : Set where + constructor MkVar + field + name : Name + pos : VarPos name τ Γ --- Reflection +open Var public -wknTerm : Term → Term -wknTerm t = quote There ⟨ con ⟩ 5 ⋯⟅∷⟆ t ⟨∷⟩ [] +toVar : VarPos x τ Γ → Var τ Γ +toVar pos = MkVar _ pos -weaklTerm : Term → Term → Term -weaklTerm Δ t = quote weaklPos ⟨ def ⟩ 3 ⋯⟅∷⟆ Δ ⟨∷⟩ t ⟨∷⟩ [] +-- Substitutions -------------------------------------------------------------- -searchCtx : - (wkn : Term → Term) → - (hole : Term) → - (name : Term) → - (Γ : Term) → - TC ⊤ -searchCtx wkn hole name (meta m _) = blockOnMeta m -searchCtx wkn hole name (con (quote [<]) []) = - typeError (termErr name ∷ strErr " not in context." ∷ []) -searchCtx wkn hole name (con (quote _:<_) (Γ ⟨∷⟩ con (quote _:-_) (meta x _ ⟨∷⟩ A ∷ []) ⟨∷⟩ [])) = - blockOnMeta x -searchCtx wkn hole name (con (quote _:<_) (Γ ⟨∷⟩ con (quote _:-_) (x ⟨∷⟩ A ∷ []) ⟨∷⟩ [])) = - catchTC - (do - debugPrint "squid" 10 (strErr "checking name " ∷ termErr x ∷ strErr "..." ∷ []) - unify name x - let soln = wkn (quote Here ⟨ con ⟩ 3 ⋯⟅∷⟆ []) - debugPrint "squid" 10 (strErr "testing solution " ∷ termErr soln ∷ strErr "..." ∷ []) - unify soln hole - debugPrint "squid" 10 (strErr "success!" ∷ [])) - (searchCtx (wkn ∘ wknTerm) hole name Γ) -searchCtx wkn hole name (def (quote _++_) (Γ ⟨∷⟩ Δ ⟨∷⟩ [])) = - catchTC - (searchCtx wkn hole name Δ) - (searchCtx (wkn ∘ weaklTerm Δ) hole name Γ) -searchCtx wkn hole name Γ = - typeError (termErr name ∷ strErr " not in context " ∷ termErr Γ ∷ []) --- searchCtx (con (quote [<]) []) y = return [] --- searchCtx (con (quote _:<_) (Γ ⟨∷⟩ con (quote _:-_) (x ⟨∷⟩ A ∷ []) ⟨∷⟩ [])) y = --- -- with x Term.≟ y --- -- ... | yes _ = --- do --- let head = quote Here ⟨ con ⟩ 3 ⋯⟅∷⟆ [] --- tail ← searchCtx Γ y --- return (head ∷ map wknTerm tail) --- -- ... | no _ = --- -- do --- -- tail ← searchCtx Γ y --- -- return (map wknTerm tail) --- searchCtx (def (quote _++_) (Γ ⟨∷⟩ Δ ⟨∷⟩ [])) y = --- do --- right ← searchCtx Δ y --- left ← searchCtx Γ y --- return (right List.++ map (weaklTerm Δ) left) - --- searchCtx (meta m _) y = blockOnMeta m --- searchCtx Γ y = --- do --- debugPrint "squid" 10 (strErr "stuck matching term " ∷ termErr Γ ∷ []) --- return [] - --- tryEach : List Term → Term → TC ⊤ --- tryEach [] hole = typeError (strErr "not in context" ∷ []) --- tryEach (t ∷ []) hole = --- do --- debugPrint "squid" 10 (strErr "trying term " ∷ termErr t ∷ []) --- unify t hole --- debugPrint "squid" 10 (strErr "success!" ∷ []) --- tryEach (t ∷ ts@(_ ∷ _)) hole = --- do --- debugPrint "squid" 10 (strErr "trying term " ∷ termErr t ∷ []) --- catchTC --- (do --- unify t hole --- debugPrint "squid" 10 (strErr "success!" ∷ [])) --- (tryEach ts hole) - -searchVarPos : Context → Name → Term → TC ⊤ -searchVarPos Γ x hole = - do - Γ ← quoteTC Γ - x ← quoteTC x - case x return (λ _ → TC ⊤) of λ - { (meta x _) → blockOnMeta x - ; _ → return _ - } - debugPrint "squid" 10 (strErr "Γ = " ∷ termErr Γ ∷ []) - debugPrint "squid" 10 (strErr "x = " ∷ termErr x ∷ []) - searchCtx (λ t → t) hole x Γ +infixl 9 _⨾_ [_]_⨾_ _⨾′_ _≈⨾_ _≈⨾′_ _⨾≈_ +infixl 4 copair _∥ˡ_ _∥ʳ_ +infixl 5 _:<_↦_ subst-step +infix 4 _~[_]↝_ _↝_ [_]_≈_ _≈_ --- searchVarPos : Context → Name → Term → TC ⊤ --- searchVarPos Γ x hole = --- do --- Γ ← quoteTC Γ --- (case Γ return (λ _ → TC ⊤) of λ --- { (meta m _) → blockOnMeta m --- ; _ → return _ --- }) --- x ← quoteTC x --- debugPrint "squid" 10 (strErr "Γ = " ∷ termErr Γ ∷ []) --- debugPrint "squid" 10 (strErr "x = " ∷ termErr x ∷ []) --- guesses ← searchCtx Γ x --- tryEach guesses hole - --- Back to business as normal - -record Var (A : ValType) (Γ : Context) : Set where - constructor %%_ +record _~[_]↝_ (Γ : GenContext A) (X : A -Sorted- B -Family) (Δ : GenContext B) : Set where + constructor tabulate + infixr 8 _@_ field - name : Name - @(tactic searchVarPos Γ name) {pos} : VarPos name A Γ + _@_ : Var τ Γ → X τ Δ -open Var public +open _~[_]↝_ public -toVar : VarPos x A Γ → Var A Γ -toVar pos = (%% _) {pos} +_↝_ : GenContext A → GenContext A → Set +Γ ↝ Δ = Γ ~[ Var ]↝ Δ -ThereVar : Var A Γ → Var A (Γ :< (y :- A′)) -ThereVar i = toVar $ There (i .pos) +[_]_@_ : (X : A -Sorted- B -Family) → Γ ~[ X ]↝ Δ → Var τ Γ → X τ Δ +[ X ] σ @ i = σ @ i --- Substitutions -------------------------------------------------------------- +-- Equality -infixl 9 _⨾_ [_]_⨾_ -infixr 8 _@_ -infixl 5 _:<_↦_ -infix 4 Subst _↝_ +record _≈_ (σ ς : Γ ~[ X ]↝ Δ) : Set where + constructor tabulate≈ + infixr 8 _@_ + field + _@_ : (i : Var τ Γ) → σ @ i ≡ ς @ i -data Subst (V : ValFamily) (Δ : Context) : Context → Set where - [<] : Subst V Δ [<] - _:<_↦_ : Subst V Δ Γ → (x : Name) → V A Δ → Subst V Δ (Γ :< (x :- A)) +open _≈_ public -syntax Subst V Δ Γ = Γ ~[ V ]↝ Δ +[_]_≈_ : (X : A -SortedFamily) → Γ ~[ X ]↝ Δ → Γ ~[ X ]↝ Δ → Set +[ V ] σ ≈ ς = σ ≈ ς -_↝_ : Context → Context → Set -Γ ↝ Δ = Γ ~[ Var ]↝ Δ +trans≈ : {σ₁ σ₂ σ₃ : Γ ~[ X ]↝ Δ} → σ₁ ≈ σ₂ → σ₂ ≈ σ₃ → σ₁ ≈ σ₃ +trans≈ σ₁≈σ₂ σ₂≈σ₃ @ i = trans (σ₁≈σ₂ @ i) (σ₂≈σ₃ @ i) + +-- Combinators + +_⨾_ : Γ ~[ X ]↝ Δ → (∀ {τ} → X τ Δ → Y τ Θ) → Γ ~[ Y ]↝ Θ +(σ ⨾ f) @ i = f (σ @ i) -_⨾_ : Γ ~[ V ]↝ Δ → (∀ {A} → V A Δ → W A Θ) → Γ ~[ W ]↝ Θ -[<] ⨾ f = [<] -(σ :< x ↦ v) ⨾ f = (σ ⨾ f) :< x ↦ f v +_⨾′_ : Γ ↝ Δ → Δ ~[ X ]↝ Θ → Γ ~[ X ]↝ Θ +(ρ ⨾′ f) @ i = f @ (ρ @ i) -[_]_⨾_ : (V : ValFamily) → Γ ~[ V ]↝ Δ → (∀ {A} → V A Δ → W A Θ) → Γ ~[ W ]↝ Θ +[_]_⨾_ : (X : A -SortedFamily) → Γ ~[ X ]↝ Δ → (∀ {τ} → X τ Δ → Y τ Θ) → Γ ~[ Y ]↝ Θ [ V ] σ ⨾ f = σ ⨾ f -tabulate : (∀ {A} → Var A Γ → V A Δ) → Γ ~[ V ]↝ Δ -tabulate {Γ = [<]} f = [<] -tabulate {Γ = Γ :< (x :- A)} f = tabulate (f ∘ ThereVar) :< x ↦ f (toVar Here) +_≈⨾_ : {σ ς : Γ ~[ X ]↝ Δ} → σ ≈ ς → (f : ∀ {τ} → X τ Δ → Y τ Θ) → [ Y ] (σ ⨾ f) ≈ (ς ⨾ f) +(σ≈ς ≈⨾ f) @ i = cong f (σ≈ς @ i) -lookup : Γ ~[ V ]↝ Δ → VarPos x A Γ → V A Δ -lookup (σ :< x ↦ v) Here = v -lookup (σ :< x ↦ v) (There i) = lookup σ i +_≈⨾′_ : {ρ ϱ : Γ ↝ Δ} → ρ ≈ ϱ → (σ : Δ ~[ X ]↝ Θ) → ρ ⨾′ σ ≈ ϱ ⨾′ σ +(ρ≈ϱ ≈⨾′ σ) @ i = cong (σ @_) (ρ≈ϱ @ i) -_@_ : Γ ~[ V ]↝ Δ → Var A Γ → V A Δ -σ @ i = lookup σ (i .pos) +_⨾≈_ : (ρ : Γ ↝ Δ) → {σ ς : Δ ~[ X ]↝ Θ} → σ ≈ ς → ρ ⨾′ σ ≈ ρ ⨾′ ς +(ρ ⨾≈ σ≈ς) @ i = σ≈ς @ ρ @ i -[_]_@_ : (V : ValFamily) → Γ ~[ V ]↝ Δ → Var A Γ → V A Δ -[ V ] σ @ i = σ @ i +-- Particular Substitutions + +-- id id : Γ ↝ Γ id = tabulate (λ x → x) -weakrPos : VarPos x A Δ → VarPos x A (Γ ++ Δ) +-- empty + +empty : [<] ~[ X ]↝ Γ +empty = tabulate (λ ()) + +-- weakr + +weakrPos : VarPos x τ Δ → VarPos x τ (Γ ++ Δ) weakrPos Here = Here weakrPos (There i) = There (weakrPos i) -weakrF : Var A Δ → Var A (Γ ++ Δ) +weakrF : Var τ Δ → Var τ (Γ ++ Δ) weakrF i = toVar $ weakrPos $ i .pos weakr : Δ ↝ Γ ++ Δ weakr = tabulate weakrF -weaklF : (Δ : Context) → Var A Γ → Var A (Γ ++ Δ) +-- weakl + +weaklPos : (Δ : GenContext A) → VarPos x τ Γ → VarPos x τ (Γ ++ Δ) +weaklPos [<] i = i +weaklPos (Δ :< (x :- τ)) i = There (weaklPos Δ i) + +weaklF : (Δ : GenContext A) → Var τ Γ → Var τ (Γ ++ Δ) weaklF Δ i = toVar $ weaklPos Δ $ i .pos -weakl : (Δ : Context) → Γ ↝ Γ ++ Δ +weakl : (Δ : GenContext A) → Γ ↝ Γ ++ Δ weakl Δ = tabulate (weaklF Δ) -copair : Γ ~[ V ]↝ Θ → Δ ~[ V ]↝ Θ → Γ ++ Δ ~[ V ]↝ Θ -copair σ [<] = σ -copair σ (ς :< x ↦ v) = copair σ ς :< x ↦ v +-- copair + +splitPos : (Δ : GenContext A) → VarPos x τ (Γ ++ Δ) → VarPos x τ Γ ⊎ VarPos x τ Δ +splitPos [<] i = inj₁ i +splitPos (Δ :< _) Here = inj₂ Here +splitPos (Δ :< _) (There i) = ⊎.map₂ There (splitPos Δ i) + +splitF : (Δ : GenContext A) → Var τ (Γ ++ Δ) → Var τ Γ ⊎ Var τ Δ +splitF Δ i = ⊎.map toVar toVar $ splitPos Δ $ i .pos + +copair : Γ ~[ X ]↝ Θ → Δ ~[ X ]↝ Θ → Γ ++ Δ ~[ X ]↝ Θ +copair σ ς @ i = [ σ @_ , ς @_ ] $ splitF _ i + +syntax copair σ ς = σ ∥ ς + +copairₙ : {Γs : List (GenContext A)} → All (_~[ X ]↝ Θ) Γs → foldr _++_ [<] Γs ~[ X ]↝ Θ +copairₙ [] @ () +copairₙ (σ ∷ σs) = σ ∥ copairₙ σs -pull : (Δ Θ : Context) → Γ ++ Δ ++ Θ ↝ Γ ++ Θ ++ Δ -pull Δ Θ = - copair {Δ = Θ} - (copair {Δ = Δ} (weakl Θ ⨾ (weakl Δ @_)) weakr) - (weakr ⨾ (weakl Δ @_)) +-- singleton + +singleton : (x : Name) → X τ Γ → [< x :- τ ] ~[ X ]↝ Γ +singleton x v @ (MkVar .x Here) = v + +-- snoc + +_:<_↦_ : Γ ~[ X ]↝ Δ → (x : Name) → X τ Δ → Γ :< (x :- τ) ~[ X ]↝ Δ +σ :< x ↦ v = σ ∥ singleton x v + +-- weakening + +data Path {A : Set} : GenContext A → GenContext A → Set where + ⌞_⌟ : (Γ : GenContext A) → Path Γ Γ + _∥ˡ_ : Path Γ Δ → (Θ : GenContext A) → Path Γ (Δ ++ Θ) + _∥ʳ_ : (Θ : GenContext A) → Path Γ Δ → Path Γ (Θ ++ Δ) + +wkn : Path Γ Δ → Γ ↝ Δ +wkn ⌞ Γ ⌟ = id +wkn (path ∥ˡ Θ) = wkn path ⨾′ weakl Θ +wkn (Θ ∥ʳ path) = wkn path ⨾′ weakr + +-- lift + +lift′ : (Θ : GenContext A) → Γ ↝ Δ → Γ ++ Θ ↝ Δ ++ Θ +lift′ Θ ρ = ρ ⨾ weaklF Θ ∥ weakr + +-- weakening variables + +_↑_ : Var τ Γ → (Δ : GenContext A) → Var τ (Γ ++ Δ) +i ↑ Δ = weakl Δ @ i + +_↑[_] : Var τ Γ → (x : Name) → Var τ (Γ :< (x :- τ′)) +i ↑[ x ] = i ↑ [< x :- _ ] + +_↑ : Var τ Γ → Var τ (Γ :< (x :- τ′)) +i ↑ = i ↑[ _ ] + +-- interaction with map + +map⁺Pos : {f : A → B} → Γ ~[ X ∘ f ]↝ Δ → VarPos x τ (map f Γ) → X τ Δ +map⁺Pos {Γ = Γ :< (x :- τ)} σ Here = σ @ toVar Here +map⁺Pos {Γ = Γ :< (x :- τ)} {X = X} σ (There i) = map⁺Pos {X = X} (tabulate (λ i → σ @ (i ↑))) i + +map⁺ : {f : A → B} → Γ ~[ X ∘ f ]↝ Δ → map f Γ ~[ X ]↝ Δ +map⁺ σ @ i = map⁺Pos σ (i .pos) + +varPosMap⁺ : {f : A → B} → VarPos x τ Γ → VarPos x (f τ) (map f Γ) +varPosMap⁺ Here = Here +varPosMap⁺ (There i) = There (varPosMap⁺ i) + +varMap⁺ : {f : A → B} → Var τ Γ → Var (f τ) (map f Γ) +varMap⁺ v = toVar (varPosMap⁺ $ v .pos) + +map⁻ : {f : A → B} → map f Γ ~[ X ]↝ Δ → Γ ~[ X ∘ f ]↝ Δ +map⁻ σ @ i = σ @ varMap⁺ i -- Properties -subst-ext : (σ ς : Γ ~[ V ]↝ Δ) → (∀ {A} → (i : Var A Γ) → σ @ i ≡ ς @ i) → σ ≡ ς -subst-ext [<] [<] ext = refl -subst-ext (σ :< x ↦ v) (ς :< .x ↦ w) ext = - cong₂ (_:< x ↦_) (subst-ext σ ς $ λ i → ext $ ThereVar i) (ext $ %% x) - -⨾-assoc : - (σ : Γ ~[ V ]↝ Δ) (f : ∀ {A} → V A Δ → W A Θ) (g : ∀ {A} → W A Θ → X A Π) → - _⨾_ {V = W} {W = X} (σ ⨾ f) g ≡ σ ⨾ (g ∘ f) -⨾-assoc [<] f g = refl -⨾-assoc (σ :< x ↦ v) f g = cong (_:< x ↦ g (f v)) (⨾-assoc σ f g) - -⨾-cong : - (σ : Γ ~[ V ]↝ Δ) {f g : ∀ {A} → V A Δ → W A Θ} → - (∀ {A} → (v : V A Δ) → f v ≡ g v) → - _⨾_ {W = W} σ f ≡ σ ⨾ g -⨾-cong [<] ext = refl -⨾-cong (σ :< x ↦ v) ext = cong₂ (_:< x ↦_) (⨾-cong σ ext) (ext v) - -lookup-⨾ : - (σ : Γ ~[ V ]↝ Δ) (f : ∀ {A} → V A Δ → W A Θ) (i : VarPos x A Γ) → - lookup {V = W} (σ ⨾ f) i ≡ f (lookup σ i) -lookup-⨾ (σ :< x ↦ v) f Here = refl -lookup-⨾ (σ :< x ↦ v) f (There i) = lookup-⨾ σ f i - -lookup-tabulate : - (V : ValFamily) (f : ∀ {A} → Var A Γ → V A Δ) (i : VarPos x A Γ) → - lookup {V = V} (tabulate f) i ≡ f (toVar i) -lookup-tabulate V f Here = refl -lookup-tabulate V f (There i) = lookup-tabulate V (f ∘ ThereVar) i - -@-⨾ : - (σ : Γ ~[ V ]↝ Δ) (f : ∀ {A} → V A Δ → W A Θ) (i : Var A Γ) → - _@_ {V = W} (σ ⨾ f) i ≡ f (σ @ i) -@-⨾ σ f i = lookup-⨾ σ f (i .pos) - -@-tabulate : - (V : ValFamily) (f : ∀ {A} → Var A Γ → V A Δ) (i : Var A Γ) → - _@_ {V = V} (tabulate f) i ≡ f i -@-tabulate V f i = lookup-tabulate V f (i .pos) - -tabulate-cong : - (V : ValFamily) → - {f g : ∀ {A} → Var A Γ → V A Δ} → - (∀ {A} → (v : Var A Γ) → f v ≡ g v) → - tabulate {V = V} f ≡ tabulate g -tabulate-cong {Γ = [<]} V ext = refl -tabulate-cong {Γ = Γ :< (x :- A)} V ext = - cong₂ (_:< x ↦_) (tabulate-cong V (ext ∘ ThereVar)) (ext $ %% x) - -tabulate-⨾ : - (f : ∀ {A} → Var A Γ → V A Δ) (g : ∀ {A} → V A Δ → W A Θ) → - tabulate {V = V} f ⨾ g ≡ tabulate {V = W} (g ∘ f) -tabulate-⨾ {Γ = [<]} f g = refl -tabulate-⨾ {Γ = Γ :< (x :- A)} f g = cong (_:< x ↦ g (f $ toVar Here)) (tabulate-⨾ (f ∘ ThereVar) g) - -tabulate-@ : (σ : Γ ~[ V ]↝ Δ) → tabulate (σ @_) ≡ σ -tabulate-@ [<] = refl -tabulate-@ (σ :< x ↦ v) = cong (_:< x ↦ v) (tabulate-@ σ) - -copair-⨾ : - (σ : Γ ~[ V ]↝ Θ) (ς : Δ ~[ V ]↝ Θ) (f : ∀ {A} → V A Θ → W A Π) → - copair {V = W} (σ ⨾ f) (ς ⨾ f) ≡ copair {V = V} σ ς ⨾ f -copair-⨾ σ [<] f = refl -copair-⨾ σ (ς :< x ↦ v) f = cong (_:< x ↦ f v) (copair-⨾ σ ς f) - -copair-left : - (σ : Γ ~[ V ]↝ Θ) (ς : Δ ~[ V ]↝ Θ) (i : VarPos x A Γ) → - lookup (copair σ ς) (weaklPos Δ i) ≡ lookup σ i -copair-left σ [<] i = refl -copair-left σ (ς :< x ↦ v) i = copair-left σ ς i - -pull-left : - (Δ Θ : Context) (i : VarPos x A Γ) → - lookup (pull Δ Θ) (weaklPos Θ $ weaklPos Δ i) ≡ toVar (weaklPos Δ $ weaklPos Θ i) -pull-left {Γ = Γ} Δ Θ i = - begin - lookup (pull Δ Θ) (weaklPos Θ $ weaklPos Δ i) - ≡⟨ copair-left (copair {Δ = Δ} (weakl Θ ⨾ (weakl Δ @_)) weakr) (weakr {Γ = Γ} ⨾ (weakl Δ @_)) (weaklPos Δ i) ⟩ - lookup (copair {Δ = Δ} (weakl Θ ⨾ (weakl Δ @_)) weakr) (weaklPos Δ i) - ≡⟨ copair-left {Δ = Δ} (weakl Θ ⨾ (weakl Δ @_)) weakr i ⟩ - lookup (weakl Θ ⨾ (weakl Δ @_)) i - ≡⟨ lookup-⨾ (weakl Θ) (weakl Δ @_) i ⟩ - weakl Δ @ lookup (weakl Θ) i - ≡⟨ cong (weakl Δ @_) (lookup-tabulate Var (weaklF Θ) i) ⟩ - lookup (weakl Δ) (weaklPos Θ i) - ≡⟨ lookup-tabulate Var (weaklF Δ) (weaklPos Θ i) ⟩ - toVar (weaklPos Δ $ weaklPos Θ i) - ∎ +subst-step : + {x : Name} {σ ς : Γ :< (x :- τ) ~[ X ]↝ Δ} → + weakl [< x :- τ ] ⨾′ σ ≈ weakl [< x :- τ ] ⨾′ ς → + σ @ MkVar x Here ≡ ς @ MkVar x Here → + σ ≈ ς +subst-step σ↑≈ς↑ σ₀≡ς₀ @ MkVar x Here = σ₀≡ς₀ +subst-step σ↑≈ς↑ σ₀≡ς₀ @ MkVar x (There pos) = σ↑≈ς↑ @ MkVar x pos + +syntax subst-step {x = x} σ≈ς v≡w = σ≈ς :< x ⇒ v≡w + +-- weakl [<] is id + +weakl[<]≈id : weakl {Γ = Γ} [<] ≈ id +weakl[<]≈id = tabulate≈ (λ i → refl) + +-- copair is coslice coproduct + +splitPos-weaklPos : (Δ : GenContext A) → (i : VarPos x τ Γ) → splitPos Δ (weaklPos Δ i) ≡ inj₁ i +splitPos-weaklPos [<] i = refl +splitPos-weaklPos (Δ :< _) i = cong (⊎.map₂ There) (splitPos-weaklPos Δ i) + +splitF-weaklF : (Δ : GenContext A) (i : Var τ Γ) → splitF Δ (weaklF Δ i) ≡ inj₁ i +splitF-weaklF Δ i = cong (⊎.map toVar toVar) (splitPos-weaklPos Δ $ i .pos) + +copair-weakl : + (σ : Γ ~[ X ]↝ Θ) (ς : Δ ~[ X ]↝ Θ) → + [ X ] weakl Δ ⨾′ (σ ∥ ς) ≈ σ +copair-weakl σ ς @ i = cong [ σ @_ , ς @_ ] (splitF-weaklF _ i) + +splitPos-weakrPos : + (Γ : GenContext A) → (i : VarPos x τ Δ) → + splitPos {Γ = Γ} Δ (weakrPos i) ≡ inj₂ i +splitPos-weakrPos Γ Here = refl +splitPos-weakrPos Γ (There i) = cong (⊎.map₂ There) (splitPos-weakrPos Γ i) + +splitF-weakrF : (Γ : GenContext A) (i : Var τ Δ) → splitF Δ (weakrF i) ≡ inj₂ i +splitF-weakrF Γ i = cong (⊎.map toVar toVar) (splitPos-weakrPos Γ $ i .pos) + +copair-weakr : + (σ : Γ ~[ X ]↝ Θ) (ς : Δ ~[ X ]↝ Θ) → + [ X ] weakr {Γ = Γ} ⨾′ (σ ∥ ς) ≈ ς +copair-weakr σ ς @ i = cong [ σ @_ , ς @_ ] (splitF-weakrF _ i) + +weakPos-splitPos : + (Δ : GenContext A) (i : VarPos x τ (Γ ++ Δ)) → + [ weaklPos Δ , weakrPos ] (splitPos Δ i) ≡ i +weakPos-splitPos [<] i = refl +weakPos-splitPos (Δ :< _) Here = refl +weakPos-splitPos (Δ :< _) (There i) = begin + [ There ∘ weaklPos Δ , weakrPos ]′ (⊎.map₂ There $ splitPos Δ i) ≡⟨ ⊎.[,]-map (splitPos Δ i) ⟩ + [ There ∘ weaklPos Δ , weakrPos ∘ There ]′ (splitPos Δ i) ≡⟨⟩ + [ There ∘ weaklPos Δ , There ∘ weakrPos ]′ (splitPos Δ i) ≡˘⟨ ⊎.[,]-∘ There (splitPos Δ i) ⟩ + There ([ weaklPos Δ , weakrPos ]′ $ splitPos Δ i) ≡⟨ cong There (weakPos-splitPos Δ i) ⟩ + There i ∎ + where open ≡-Reasoning + +weakF-splitF : (Δ : GenContext A) (i : Var τ (Γ ++ Δ)) → [ weaklF Δ , weakrF ] (splitF Δ i) ≡ i +weakF-splitF Δ i = begin + [ weaklF Δ , weakrF ] (splitF Δ i) ≡⟨ ⊎.[,]-map (splitPos Δ $ i .pos) ⟩ + [ weaklF Δ ∘ toVar , weakrF ∘ toVar ] (splitPos Δ $ i .pos) ≡⟨⟩ + [ toVar ∘ weaklPos Δ , toVar ∘ weakrPos ] (splitPos Δ $ i .pos) ≡˘⟨ ⊎.[,]-∘ toVar (splitPos Δ $ i .pos) ⟩ + toVar ([ weaklPos Δ , weakrPos ]′ $ splitPos Δ $ i .pos) ≡⟨ cong toVar (weakPos-splitPos Δ (i .pos)) ⟩ + toVar (i .pos) ≡⟨⟩ + i ∎ + where open ≡-Reasoning + +copair-unique : + {X : A -Sorted- B -Family} → + (σ : Γ ~[ X ]↝ Θ) (ς : Δ ~[ X ]↝ Θ) (s : Γ ++ Δ ~[ X ]↝ Θ) → + (weakl Δ ⨾′ s ≈ σ) → (weakr ⨾′ s ≈ ς) → + (σ ∥ ς) ≈ s +copair-unique {Δ = Δ} σ ς s wkl⨾s≈σ wkr⨾s≈ς @ i = begin + [ σ @_ , ς @_ ] (splitF Δ i) ≡˘⟨ ⊎.[,]-cong (wkl⨾s≈σ @_) (wkr⨾s≈ς @_) (splitF Δ i) ⟩ + [ (weakl Δ ⨾′ s) @_ , (weakr ⨾′ s) @_ ] (splitF Δ i) ≡˘⟨ ⊎.[,]-∘ (s @_) (splitF Δ i) ⟩ + s @ ([ weaklF Δ , weakrF ] $ splitF Δ i) ≡⟨ cong (s @_) (weakF-splitF Δ i) ⟩ + s @ i ∎ where open ≡-Reasoning -- Special Families ----------------------------------------------------------- infixr 5 _⇒_ -_⇒_ : Family → Family → Family +_⇒_ : A -Family → A -Family → A -Family (X ⇒ Y) Γ = X Γ → Y Γ -_^_ : Family → ValFamily → Family -(X ^ V) Γ = {Δ : Context} → Γ ~[ V ]↝ Δ → X Δ - -_^ᵛ_ : ValFamily → ValFamily → ValFamily -(W ^ᵛ V) A = W A ^ V +_^_ : A -Family → B -Sorted- A -Family → B -Family +(X ^ V) Γ = {Δ : GenContext _} → Γ ~[ V ]↝ Δ → X Δ -_^ᶜ_ : CompFamily → ValFamily → CompFamily -(C ^ᶜ V) B = C B ^ V +_^ᵗ_ : A -Sorted- B -Family → C -Sorted- B -Family → A -Sorted- C -Family +(W ^ᵗ V) τ = W τ ^ V -□_ : Family → Family +□_ : A -Family → A -Family □_ = _^ Var -□ᵛ_ : ValFamily → ValFamily -□ᵛ_ = _^ᵛ Var +□ᵗ_ : A -Sorted- B -Family → A -Sorted- B -Family +□ᵗ_ = _^ᵗ Var -□ᶜ_ : CompFamily → CompFamily -□ᶜ_ = _^ᶜ Var - -δ : Context → Family → Family +δ : GenContext A → A -Family → A -Family δ Δ X Γ = X (Γ ++ Δ) -δᵛ : Context → ValFamily → ValFamily -δᵛ Δ V A = δ Δ (V A) +δᵗ : GenContext B → A -Sorted- B -Family → A -Sorted- B -Family +δᵗ Δ V τ = δ Δ (V τ) + +-- Reflection ------------------------------------------------------------------ + +wknTerm : Term → Term +wknTerm t = quote There ⟨ con ⟩ 5 ⋯⟅∷⟆ t ⟨∷⟩ [] + +weaklTerm : Term → Term → Term +weaklTerm Δ t = quote weaklPos ⟨ def ⟩ 3 ⋯⟅∷⟆ Δ ⟨∷⟩ t ⟨∷⟩ [] + +searchCtx : + (wkn : Term → Term) → + (hole : Term) → + (name : Term) → + (Γ : Term) → + TC ⊤ +searchCtx wkn hole name (meta m _) = blockOnMeta m +searchCtx wkn hole name (con (quote _:<_) (_ ⟅∷⟆ Γ ⟨∷⟩ con (quote _:-_) (_ ⟅∷⟆ meta x _ ⟨∷⟩ ty ∷ []) ⟨∷⟩ [])) = + blockOnMeta x +searchCtx wkn hole name (con (quote _:<_) (_ ⟅∷⟆ Γ ⟨∷⟩ con (quote _:-_) (_ ⟅∷⟆ x ⟨∷⟩ ty ∷ []) ⟨∷⟩ [])) = + catchTC + (do + debugPrint "squid" 10 (strErr "checking name " ∷ termErr x ∷ strErr "..." ∷ []) + unify name x + let soln = wkn (quote Here ⟨ con ⟩ 3 ⋯⟅∷⟆ []) + debugPrint "squid" 10 (strErr "testing solution " ∷ termErr soln ∷ strErr "..." ∷ []) + unify soln hole + debugPrint "squid" 10 (strErr "success!" ∷ [])) + (searchCtx (wkn ∘ wknTerm) hole name Γ) +searchCtx wkn hole name (con (quote [<]) (_ ⟅∷⟆ [])) = + typeError (termErr name ∷ strErr " not in context." ∷ []) +searchCtx wkn hole name (def (quote _++_) (_ ⟅∷⟆ Γ ⟨∷⟩ Δ ⟨∷⟩ [])) = + catchTC + (searchCtx wkn hole name Δ) + (searchCtx (wkn ∘ weaklTerm Δ) hole name Γ) +searchCtx wkn hole name Γ = + typeError (termErr name ∷ strErr " not in context " ∷ termErr Γ ∷ []) + +searchVarPos : {A : Set} → GenContext A → Name → Term → TC ⊤ +searchVarPos Γ x hole = + do + Γ ← quoteTC Γ + x ← quoteTC x + case x returning (λ _ → TC ⊤) of λ + { (meta x _) → blockOnMeta x + ; _ → pure _ + } + debugPrint "squid" 10 (strErr "Γ = " ∷ termErr Γ ∷ []) + debugPrint "squid" 10 (strErr "x = " ∷ termErr x ∷ []) + searchCtx (λ t → t) hole x Γ -δᶜ : Context → CompFamily → CompFamily -δᶜ Δ C B = δ Δ (C B) +%%_ : + {A : Set} → {ty : A} → {Γ : GenContext A} → + (x : Name) → {@(tactic searchVarPos Γ x) pos : VarPos x ty Γ} → Var ty Γ +%%_ x {pos} = MkVar x pos |