{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.SecondPass.FinCatNEmbeddingMismatch where
open import Agda.Builtin.Equality using (_≡_; refl)
open import Agda.Builtin.Sigma using (_,_)
open import Level using (lift)
open import Relation.Binary.PropositionalEquality.Core using (cong; sym; _≢_)
open import Relation.Binary.PropositionalEquality.Properties using (module ≡-Reasoning)
open ≡-Reasoning
open import Relation.Nullary using (¬_)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Unit.Polymorphic.Base using (tt)
open import Data.Product.Base using (proj₁; proj₂)
open import Data.Fin.Base using (Fin) renaming (zero to fzero; suc to fsuc)
open import Categories.Category.Core using (Category)
open import Categories.Functor.Core using (Functor)
open import ALMA.Cosmos.ContCategoryLemmas using (ShapeOf; PosOf; actSOf)
open import ALMA.Cosmos.ContCatEquiv using (ShapeCat)
open import ALMA.SecondPass.Unfolding using (Unfolding)
open import ALMA.SecondPass.Cosmos using (Cosmos; out)
open import ALMA.SecondPass.CumulativeHierarchy using (EmbeddingData; mkEmbeddingData)
open import ALMA.SecondPass.StrictLift using
(strictStep-suc; StrictLayer; EmbeddingRule; outer-rule; strictEmbed; strictEmbed-unfoldFunctor)
open import ALMA.SecondPass.CumulativeHierarchyLimit using (Tower)
open import ALMA.SecondPass.FinCatNWitness
open import ALMA.SecondPass.FinCatNTowerLemmas
open import ALMA.SecondPass.FinCatNColimit
open import ALMA.SecondPass.DependentEmbedding
using (dep-embed-general; dep-unfoldFunctor-general)
strictEmbed-F₀-first
: ∀ {o h e s p} (L : StrictLayer o h e s p)
(A : Category.Obj (StrictLayer.C L))
(s : ShapeOf (StrictLayer.FC L) A)
(u : ShapeOf (StrictLayer.FC (strictStep-suc L)) (A , s))
→ proj₁ (strictEmbed-unfoldFunctor L .Functor.F₀ ((A , s) , u))
≡ A
strictEmbed-F₀-first L A s u = refl
dep-embed-general-F₀-first
: ∀ {o h e s p} (L : StrictLayer o h e s p)
(pos-inhab : ∀ {A : Category.Obj (StrictLayer.C L)}
(s : ShapeOf (StrictLayer.FC L) A)
→ PosOf (StrictLayer.FC L) {A = A} s)
(pos-singleton : ∀ {A : Category.Obj (StrictLayer.C L)}
(s : ShapeOf (StrictLayer.FC L) A)
→ (p q : PosOf (StrictLayer.FC L) {A = A} s) → p ≡ q)
(shape-singleton : (A : Category.Obj (StrictLayer.C (strictStep-suc L)))
→ (s t : ShapeOf (StrictLayer.FC (strictStep-suc L)) A)
→ s ≡ t)
(x : Cosmos (StrictLayer.C L) (StrictLayer.FC L))
(ed : EmbeddingData x)
(A : Category.Obj (StrictLayer.C L))
(s : ShapeOf (StrictLayer.FC L) A)
(u : ShapeOf (StrictLayer.FC (strictStep-suc L)) (A , s))
→ proj₁ (dep-unfoldFunctor-general L pos-inhab pos-singleton x
.Functor.F₀ ((A , s) , u))
≡ Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , s)
dep-embed-general-F₀-first L pos-inhab pos-singleton shape-singleton
x ed A s u = refl
embed-mismatch-general
: ∀ {o h e s p} (L : StrictLayer o h e s p)
(pos-inhab : ∀ {A : Category.Obj (StrictLayer.C L)}
(s : ShapeOf (StrictLayer.FC L) A)
→ PosOf (StrictLayer.FC L) {A = A} s)
(pos-singleton : ∀ {A : Category.Obj (StrictLayer.C L)}
(s : ShapeOf (StrictLayer.FC L) A)
→ (p q : PosOf (StrictLayer.FC L) {A = A} s) → p ≡ q)
(shape-singleton : (A : Category.Obj (StrictLayer.C (strictStep-suc L)))
→ (s t : ShapeOf (StrictLayer.FC (strictStep-suc L)) A)
→ s ≡ t)
(x : Cosmos (StrictLayer.C L) (StrictLayer.FC L))
(ed : EmbeddingData x)
(A : Category.Obj (StrictLayer.C L))
(s : ShapeOf (StrictLayer.FC L) A)
(u : ShapeOf (StrictLayer.FC (strictStep-suc L)) (A , s))
{Y : Set}
(π : Category.Obj (StrictLayer.C L) → Y)
→ π (Unfolding.unfoldFunctor (out x) .Functor.F₀ (A , s))
≢ π A
→ strictEmbed L x ed
≢ dep-embed-general L pos-inhab pos-singleton
shape-singleton x ed
embed-mismatch-general L pos-inhab pos-singleton shape-singleton
x ed A s u {Y} π ineq eq =
ineq (sym (cong {A = Cosmos (StrictLayer.C (strictStep-suc L))
(StrictLayer.FC (strictStep-suc L))}
{B = Y}
(λ c → π (proj₁ (Unfolding.unfoldFunctor (out c)
.Functor.F₀ ((A , s) , u))))
eq))
module FinCatNEmbeddingMismatch (m : ℕ) where
open FinCatN m
open FinCatNTowerLemmas m
open FinCatNColimit m
ed-const0 : EmbeddingData cosmos-const0N
ed-const0 = mkEmbeddingData
(λ _ _ → tt)
(λ _ _ → refl)
cosmos-const0N
z : Category.Obj
(ShapeCat (StrictLayer.C (strictStep-suc nLayer))
(StrictLayer.FC (strictStep-suc nLayer)))
z = ((fsuc {n = suc m} (fzero {n = m}) , lift tt) , lift (lift tt))
apply-eq
: EmbeddingRule.Embed outer-rule nLayer ≡ FinCatNColimit.dep-embed m 0
→ EmbeddingRule.Embed outer-rule nLayer cosmos-const0N ed-const0
≡ FinCatNColimit.dep-embed m 0 cosmos-const0N ed-const0
apply-eq eq = cong (λ f → f cosmos-const0N ed-const0) eq
eq-obj
: (eq : EmbeddingRule.Embed outer-rule nLayer ≡ FinCatNColimit.dep-embed m 0)
→ Unfolding.unfoldFunctor
(out (EmbeddingRule.Embed outer-rule nLayer cosmos-const0N ed-const0))
.Functor.F₀ z
≡ Unfolding.unfoldFunctor
(out (FinCatNColimit.dep-embed m 0 cosmos-const0N ed-const0))
.Functor.F₀ z
eq-obj eq = cong (λ c → Unfolding.unfoldFunctor (out c) .Functor.F₀ z)
(apply-eq eq)
eq-first
: (eq : EmbeddingRule.Embed outer-rule nLayer ≡ FinCatNColimit.dep-embed m 0)
→ proj₁ (Unfolding.unfoldFunctor
(out (EmbeddingRule.Embed outer-rule nLayer cosmos-const0N ed-const0))
.Functor.F₀ z)
≡ proj₁ (Unfolding.unfoldFunctor
(out (FinCatNColimit.dep-embed m 0 cosmos-const0N ed-const0))
.Functor.F₀ z)
eq-first eq = cong proj₁ (eq-obj eq)
lhs-first
: proj₁ (Unfolding.unfoldFunctor
(out (EmbeddingRule.Embed outer-rule nLayer cosmos-const0N ed-const0))
.Functor.F₀ z)
≡ fsuc {n = suc m} (fzero {n = m})
lhs-first = refl
rhs-first
: proj₁ (Unfolding.unfoldFunctor
(out (FinCatNColimit.dep-embed m 0 cosmos-const0N ed-const0))
.Functor.F₀ z)
≡ fzero
rhs-first = refl
embed-eq-false-zero
: ¬ (EmbeddingRule.Embed outer-rule nLayer ≡ FinCatNColimit.dep-embed m 0)
embed-eq-false-zero eq =
fsuc-fzero≠fzero (begin
fsuc {n = suc m} (fzero {n = m})
≡˘⟨ lhs-first ⟩
proj₁ (Unfolding.unfoldFunctor
(out (EmbeddingRule.Embed outer-rule nLayer cosmos-const0N ed-const0))
.Functor.F₀ z)
≡⟨ eq-first eq ⟩
proj₁ (Unfolding.unfoldFunctor
(out (FinCatNColimit.dep-embed m 0 cosmos-const0N ed-const0))
.Functor.F₀ z)
≡⟨ rhs-first ⟩
fzero
∎)
ed-for : ∀ k
(y : Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k)))
(ed : EmbeddingData y)
→ EmbeddingData (FinCatNColimit.dep-embed m k y ed)
ed-for k y ed .EmbeddingData.retract {A} s =
( EmbeddingData.retract ed (proj₂ A)
, shape-singleton-at k (proj₁ A)
(actSOf (StrictLayer.FC (Tower.layer nTower k))
(EmbeddingData.retract ed (proj₂ A))
(Unfolding.pos-to-shape (out y) (proj₂ A)
(pos-inhabited-tower k (proj₁ A) (proj₂ A))))
(proj₂ A) )
ed-for k y ed .EmbeddingData.retract-natural {A} {B} {s} {t} f eq =
EmbeddingData.retract-natural ed (proj₁ f) (proj₂ f)
ed-for k y ed .EmbeddingData.next {A} s =
ed-for k
(Unfolding.unfold-next (out y) {A = proj₁ A} (proj₂ A))
(EmbeddingData.next ed {A = proj₁ A} (proj₂ A))
mutual
const0-k : ∀ k
→ Cosmos (StrictLayer.C (Tower.layer nTower k))
(StrictLayer.FC (Tower.layer nTower k))
const0-k zero = cosmos-const0N
const0-k (suc k) = FinCatNColimit.dep-embed m k (const0-k k) (ed-base k)
ed-base : ∀ k → EmbeddingData (const0-k k)
ed-base zero = ed-const0
ed-base (suc k) = ed-for k (const0-k k) (ed-base k)
proj-obj∘embed-obj : ∀ k (a : Fin n) → proj-obj k (embed-obj k a) ≡ a
proj-obj∘embed-obj zero a = refl
proj-obj∘embed-obj (suc k) a = proj-obj∘embed-obj k a
fzero-lemma : ∀ k
→ proj-obj k
(Unfolding.unfoldFunctor (out (const0-k k)) .Functor.F₀
(embed-obj k (fsuc fzero), embed-shape k (embed-obj k (fsuc fzero))))
≡ fzero
fzero-lemma zero = refl
fzero-lemma (suc k) = fzero-lemma k
fsuc-lemma : ∀ k
→ proj-obj k (proj₁ (embed-obj (suc k) (fsuc fzero))) ≡ fsuc fzero
fsuc-lemma zero = refl
fsuc-lemma (suc k) =
proj-obj∘embed-obj (suc k) (fsuc fzero)
embed-eq-false
: ∀ k
→ ¬ (EmbeddingRule.Embed outer-rule (Tower.layer nTower k)
≡ FinCatNColimit.dep-embed m k)
embed-eq-false k eq =
fsuc-fzero≠fzero (begin
fsuc {n = suc m} (fzero {n = m})
≡˘⟨ left≡fsuc ⟩
left-F₀
≡⟨ eq-F₀ ⟩
right-F₀
≡⟨ right≡fzero ⟩
fzero
∎)
where
x = const0-k k
ed-x = ed-base k
z-k = ( embed-obj (suc k) (fsuc fzero)
, embed-shape (suc k) (embed-obj (suc k) (fsuc fzero)) )
left = strictEmbed (Tower.layer nTower k) x ed-x
right = FinCatNColimit.dep-embed m k x ed-x
left-F₀ = proj-obj k
(Unfolding.unfoldFunctor (out left) .Functor.F₀ z-k .proj₁)
right-F₀ = proj-obj k
(Unfolding.unfoldFunctor (out right) .Functor.F₀ z-k .proj₁)
left≡fsuc : left-F₀ ≡ fsuc fzero
left≡fsuc = fsuc-lemma k
right≡fzero : right-F₀ ≡ fzero
right≡fzero = fzero-lemma k
eq1 = cong (λ f → f x ed-x) eq
eq-F₀ : left-F₀ ≡ right-F₀
eq-F₀ = cong (λ c → proj-obj k
(Unfolding.unfoldFunctor (out c) .Functor.F₀ z-k .proj₁)) eq1