aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cospan.agda252
1 files changed, 234 insertions, 18 deletions
diff --git a/Cospan.agda b/Cospan.agda
index 19c422a..f3bb5f5 100644
--- a/Cospan.agda
+++ b/Cospan.agda
@@ -11,9 +11,19 @@ open FinitelyCocompleteCategory 𝒞
open import Categories.Diagram.Duality U using (Pushout⇒coPullback)
open import Categories.Diagram.Pushout U using (Pushout)
-open import Categories.Diagram.Pushout.Properties U using (glue; swap)
-open import Categories.Morphism U using (_≅_)
+open import Categories.Diagram.Pushout.Properties U using (glue; swap; pushout-resp-≈)
+open import Categories.Morphism U using (_≅_; module ≅)
open import Categories.Morphism.Duality U using (op-≅⇒≅)
+open import Categories.Morphism.Reasoning U using
+ ( switch-fromtoˡ
+ ; glueTrianglesˡ
+ ; id-comm
+ ; id-comm-sym
+ ; pullˡ
+ ; pullʳ
+ ; assoc²''
+ ; assoc²'
+ )
import Categories.Diagram.Pullback op as Pb using (up-to-iso)
@@ -51,12 +61,45 @@ compose-3 c₁ c₂ c₃ = record { f₁ = P₃.i₁ ∘ P₁.i₁ ∘ C₁.f₁
module P₂ = pushout C₂.f₂ C₃.f₁
module P₃ = pushout P₁.i₂ P₂.i₁
-record Same (P P′ : Cospan A B) : Set (ℓ ⊔ e) where
+record Same (C C′ : Cospan A B) : Set (ℓ ⊔ e) where
+
+ module C = Cospan C
+ module C′ = Cospan C′
+
+ field
+ ≅N : C.N ≅ C′.N
+
+ open _≅_ ≅N public
field
- iso : Cospan.N P ≅ Cospan.N P′
- from∘f₁≈f₁′ : _≅_.from iso ∘ Cospan.f₁ P ≈ Cospan.f₁ P′
- from∘f₂≈f₂′ : _≅_.from iso ∘ Cospan.f₂ P ≈ Cospan.f₂ P′
+ from∘f₁≈f₁′ : from ∘ C.f₁ ≈ C′.f₁
+ from∘f₂≈f₂′ : from ∘ C.f₂ ≈ C′.f₂
+
+same-refl : {C : Cospan A B} → Same C C
+same-refl = record
+ { ≅N = ≅.refl
+ ; from∘f₁≈f₁′ = identityˡ
+ ; from∘f₂≈f₂′ = identityˡ
+ }
+
+same-sym : {C C′ : Cospan A B} → Same C C′ → Same C′ C
+same-sym C≅C′ = record
+ { ≅N = ≅.sym ≅N
+ ; from∘f₁≈f₁′ = Equiv.sym (switch-fromtoˡ ≅N from∘f₁≈f₁′)
+ ; from∘f₂≈f₂′ = Equiv.sym (switch-fromtoˡ ≅N from∘f₂≈f₂′)
+ }
+ where
+ open Same C≅C′
+
+same-trans : {C C′ C″ : Cospan A B} → Same C C′ → Same C′ C″ → Same C C″
+same-trans C≈C′ C′≈C″ = record
+ { ≅N = ≅.trans C≈C′.≅N C′≈C″.≅N
+ ; from∘f₁≈f₁′ = glueTrianglesˡ C′≈C″.from∘f₁≈f₁′ C≈C′.from∘f₁≈f₁′
+ ; from∘f₂≈f₂′ = glueTrianglesˡ C′≈C″.from∘f₂≈f₂′ C≈C′.from∘f₂≈f₂′
+ }
+ where
+ module C≈C′ = Same C≈C′
+ module C′≈C″ = Same C′≈C″
glue-i₁ : (p : Pushout f g) → Pushout h (Pushout.i₁ p) → Pushout (h ∘ f) g
glue-i₁ p = glue p
@@ -67,13 +110,137 @@ glue-i₂ p₁ p₂ = swap (glue (swap p₁) (swap p₂))
up-to-iso : (p p′ : Pushout f g) → Pushout.Q p ≅ Pushout.Q p′
up-to-iso p p′ = op-≅⇒≅ (Pb.up-to-iso (Pushout⇒coPullback p) (Pushout⇒coPullback p′))
+id-unique : (p : Pushout f g) → (Pushout.universal p) (Pushout.commute p) ≈ id
+id-unique p = Equiv.sym (Pushout.unique p identityˡ identityˡ)
+
+pushout-f-id : Pushout f id
+pushout-f-id {_} {_} {f} = record
+ { i₁ = id
+ ; i₂ = f
+ ; commute = id-comm-sym
+ ; universal = λ {B} {h₁} {h₂} eq → h₁
+ ; unique = λ {E} {h₁} {h₂} {eq} {j} j∘i₁≈h₁ j∘i₂≈h₂ → Equiv.sym identityʳ ○ j∘i₁≈h₁
+ ; universal∘i₁≈h₁ = λ {E} {h₁} {h₂} {eq} → identityʳ
+ ; universal∘i₂≈h₂ = λ {E} {h₁} {h₂} {eq} → eq ○ identityʳ
+ }
+ where
+ open HomReasoning
+
+pushout-id-g : Pushout id g
+pushout-id-g {_} {_} {g} = record
+ { i₁ = g
+ ; i₂ = id
+ ; commute = id-comm
+ ; universal = λ {B} {h₁} {h₂} eq → h₂
+ ; unique = λ {E} {h₁} {h₂} {eq} {j} j∘i₁≈h₁ j∘i₂≈h₂ → Equiv.sym identityʳ ○ j∘i₂≈h₂
+ ; universal∘i₁≈h₁ = λ {E} {h₁} {h₂} {eq} → Equiv.sym eq ○ identityʳ
+ ; universal∘i₂≈h₂ = λ {E} {h₁} {h₂} {eq} → identityʳ
+ }
+ where
+ open HomReasoning
+
+extend-i₁-iso
+ : {f : A ⇒ B}
+ {g : A ⇒ C}
+ (p : Pushout f g)
+ (B≅D : B ≅ D)
+ → Pushout (_≅_.from B≅D ∘ f) g
+extend-i₁-iso {_} {_} {_} {_} {f} {g} p B≅D = record
+ { i₁ = P.i₁ ∘ B≅D.to
+ ; i₂ = P.i₂
+ ; commute = begin
+ (P.i₁ ∘ B≅D.to) ∘ B≅D.from ∘ f ≈⟨ assoc²'' ⟨
+ P.i₁ ∘ (B≅D.to ∘ B≅D.from) ∘ f ≈⟨ refl⟩∘⟨ B≅D.isoˡ ⟩∘⟨refl ⟩
+ P.i₁ ∘ id ∘ f ≈⟨ refl⟩∘⟨ identityˡ ⟩
+ P.i₁ ∘ f ≈⟨ P.commute ⟩
+ P.i₂ ∘ g ∎
+ ; universal = λ { eq → P.universal (assoc ○ eq) }
+ ; unique = λ {_} {h₁} {_} {j} ≈₁ ≈₂ →
+ let
+ ≈₁′ = begin
+ j ∘ P.i₁ ≈⟨ refl⟩∘⟨ identityʳ ⟨
+ j ∘ P.i₁ ∘ id ≈⟨ refl⟩∘⟨ refl⟩∘⟨ B≅D.isoˡ ⟨
+ j ∘ P.i₁ ∘ B≅D.to ∘ B≅D.from ≈⟨ assoc²' ⟨
+ (j ∘ P.i₁ ∘ B≅D.to) ∘ B≅D.from ≈⟨ ≈₁ ⟩∘⟨refl ⟩
+ h₁ ∘ B≅D.from ∎
+ in P.unique ≈₁′ ≈₂
+ ; universal∘i₁≈h₁ = λ {E} {h₁} {_} {eq} →
+ begin
+ P.universal (assoc ○ eq) ∘ P.i₁ ∘ B≅D.to ≈⟨ sym-assoc ⟩
+ (P.universal (assoc ○ eq) ∘ P.i₁) ∘ B≅D.to ≈⟨ P.universal∘i₁≈h₁ ⟩∘⟨refl ⟩
+ (h₁ ∘ B≅D.from) ∘ B≅D.to ≈⟨ assoc ⟩
+ h₁ ∘ B≅D.from ∘ B≅D.to ≈⟨ refl⟩∘⟨ B≅D.isoʳ ⟩
+ h₁ ∘ id ≈⟨ identityʳ ⟩
+ h₁ ∎
+ ; universal∘i₂≈h₂ = P.universal∘i₂≈h₂
+ }
+ where
+ module P = Pushout p
+ module B≅D = _≅_ B≅D
+ open HomReasoning
+
+extend-i₂-iso
+ : {f : A ⇒ B}
+ {g : A ⇒ C}
+ (p : Pushout f g)
+ (C≅D : C ≅ D)
+ → Pushout f (_≅_.from C≅D ∘ g)
+extend-i₂-iso {_} {_} {_} {_} {f} {g} p C≅D = swap (extend-i₁-iso (swap p) C≅D)
+
+compose-idˡ : {C : Cospan A B} → Same (compose C identity) C
+compose-idˡ {_} {_} {C} = record
+ { ≅N = ≅P
+ ; from∘f₁≈f₁′ = begin
+ ≅P.from ∘ P.i₁ ∘ C.f₁ ≈⟨ assoc ⟨
+ (≅P.from ∘ P.i₁) ∘ C.f₁ ≈⟨ P.universal∘i₁≈h₁ ⟩∘⟨refl ⟩
+ id ∘ C.f₁ ≈⟨ identityˡ ⟩
+ C.f₁ ∎
+ ; from∘f₂≈f₂′ = begin
+ ≅P.from ∘ P.i₂ ∘ id ≈⟨ refl⟩∘⟨ identityʳ ⟩
+ ≅P.from ∘ P.i₂ ≈⟨ P.universal∘i₂≈h₂ ⟩
+ C.f₂ ∎
+ }
+ where
+ open HomReasoning
+ module C = Cospan C
+ P = pushout C.f₂ id
+ module P = Pushout P
+ P′ = pushout-f-id {f = C.f₂}
+ ≅P = up-to-iso P P′
+ module ≅P = _≅_ ≅P
+
+compose-idʳ : {C : Cospan A B} → Same (compose identity C) C
+compose-idʳ {_} {_} {C} = record
+ { ≅N = ≅P
+ ; from∘f₁≈f₁′ = begin
+ ≅P.from ∘ P.i₁ ∘ id ≈⟨ refl⟩∘⟨ identityʳ ⟩
+ ≅P.from ∘ P.i₁ ≈⟨ P.universal∘i₁≈h₁ ⟩
+ C.f₁ ∎
+ ; from∘f₂≈f₂′ = begin
+ ≅P.from ∘ P.i₂ ∘ C.f₂ ≈⟨ assoc ⟨
+ (≅P.from ∘ P.i₂) ∘ C.f₂ ≈⟨ P.universal∘i₂≈h₂ ⟩∘⟨refl ⟩
+ id ∘ C.f₂ ≈⟨ identityˡ ⟩
+ C.f₂ ∎
+ }
+ where
+ open HomReasoning
+ module C = Cospan C
+ P = pushout id C.f₁
+ module P = Pushout P
+ P′ = pushout-id-g {g = C.f₁}
+ ≅P = up-to-iso P P′
+ module ≅P = _≅_ ≅P
+
+compose-id² : Same {A} (compose identity identity) identity
+compose-id² = compose-idˡ
+
compose-3-right
: {c₁ : Cospan A B}
{c₂ : Cospan B C}
{c₃ : Cospan C D}
→ Same (compose c₁ (compose c₂ c₃)) (compose-3 c₁ c₂ c₃)
compose-3-right {_} {_} {_} {_} {c₁} {c₂} {c₃} = record
- { iso = up-to-iso P₄′ P₄
+ { ≅N = up-to-iso P₄′ P₄
; from∘f₁≈f₁′ = sym-assoc ○ P₄′.universal∘i₁≈h₁ ⟩∘⟨refl ○ assoc
; from∘f₂≈f₂′ = sym-assoc ○ P₄′.universal∘i₂≈h₂ ⟩∘⟨refl
}
@@ -99,7 +266,7 @@ compose-3-left
{c₃ : Cospan C D}
→ Same (compose (compose c₁ c₂) c₃) (compose-3 c₁ c₂ c₃)
compose-3-left {_} {_} {_} {_} {c₁} {c₂} {c₃} = record
- { iso = up-to-iso P₄′ P₄
+ { ≅N = up-to-iso P₄′ P₄
; from∘f₁≈f₁′ = sym-assoc ○ P₄′.universal∘i₁≈h₁ ⟩∘⟨refl
; from∘f₂≈f₂′ = sym-assoc ○ P₄′.universal∘i₂≈h₂ ⟩∘⟨refl ○ assoc
}
@@ -124,27 +291,76 @@ compose-assoc
{c₂ : Cospan B C}
{c₃ : Cospan C D}
→ Same (compose c₁ (compose c₂ c₃)) (compose (compose c₁ c₂) c₃)
-compose-assoc = ?
+compose-assoc = same-trans compose-3-right (same-sym compose-3-left)
compose-sym-assoc
: {c₁ : Cospan A B}
{c₂ : Cospan B C}
{c₃ : Cospan C D}
→ Same (compose (compose c₁ c₂) c₃) (compose c₁ (compose c₂ c₃))
-compose-sym-assoc = ?
+compose-sym-assoc = same-trans compose-3-left (same-sym compose-3-right)
+
+compose-equiv
+ : {c₂ c₂′ : Cospan B C}
+ {c₁ c₁′ : Cospan A B}
+ → Same c₂ c₂′
+ → Same c₁ c₁′
+ → Same (compose c₁ c₂) (compose c₁′ c₂′)
+compose-equiv {_} {_} {_} {c₂} {c₂′} {c₁} {c₁′} ≈C₂ ≈C₁ = record
+ { ≅N = up-to-iso P P″
+ ; from∘f₁≈f₁′ = begin
+ ≅P.from ∘ P.i₁ ∘ C₁.f₁ ≈⟨ assoc ⟨
+ (≅P.from ∘ P.i₁) ∘ C₁.f₁ ≈⟨ P.universal∘i₁≈h₁ ⟩∘⟨refl ⟩
+ (P′.i₁ ∘ ≈C₁.from) ∘ C₁.f₁ ≈⟨ assoc ⟩
+ P′.i₁ ∘ ≈C₁.from ∘ C₁.f₁ ≈⟨ refl⟩∘⟨ ≈C₁.from∘f₁≈f₁′ ⟩
+ P′.i₁ ∘ C₁′.f₁ ∎
+ ; from∘f₂≈f₂′ = begin
+ ≅P.from ∘ P.i₂ ∘ C₂.f₂ ≈⟨ assoc ⟨
+ (≅P.from ∘ P.i₂) ∘ C₂.f₂ ≈⟨ P.universal∘i₂≈h₂ ⟩∘⟨refl ⟩
+ (P′.i₂ ∘ ≈C₂.from) ∘ C₂.f₂ ≈⟨ assoc ⟩
+ P′.i₂ ∘ ≈C₂.from ∘ C₂.f₂ ≈⟨ refl⟩∘⟨ ≈C₂.from∘f₂≈f₂′ ⟩
+ P′.i₂ ∘ C₂′.f₂ ∎
+ }
+ where
+ module C₁ = Cospan c₁
+ module C₁′ = Cospan c₁′
+ module C₂ = Cospan c₂
+ module C₂′ = Cospan c₂′
+ P = pushout C₁.f₂ C₂.f₁
+ P′ = pushout C₁′.f₂ C₂′.f₁
+ module ≈C₁ = Same ≈C₁
+ module ≈C₂ = Same ≈C₂
+ P′′ : Pushout (≈C₁.to ∘ C₁′.f₂) (≈C₂.to ∘ C₂′.f₁)
+ P′′ = extend-i₂-iso (extend-i₁-iso P′ (≅.sym ≈C₁.≅N)) (≅.sym ≈C₂.≅N)
+ P″ : Pushout C₁.f₂ C₂.f₁
+ P″ =
+ pushout-resp-≈
+ P′′
+ (Equiv.sym (switch-fromtoˡ ≈C₁.≅N ≈C₁.from∘f₂≈f₂′))
+ (Equiv.sym (switch-fromtoˡ ≈C₂.≅N ≈C₂.from∘f₁≈f₁′))
+ module P = Pushout P
+ module P′ = Pushout P′
+ ≅P : P.Q ≅ P′.Q
+ ≅P = up-to-iso P P″
+ module ≅P = _≅_ ≅P
+ open HomReasoning
-CospanC : Category _ _ _
-CospanC = record
+Cospans : Category o (o ⊔ ℓ) (ℓ ⊔ e)
+Cospans = record
{ Obj = Obj
; _⇒_ = Cospan
; _≈_ = Same
; id = identity
; _∘_ = flip compose
- ; assoc = ?
+ ; assoc = compose-assoc
; sym-assoc = compose-sym-assoc
- ; identityˡ = ?
- ; identityʳ = {! !}
- ; identity² = {! !}
- ; equiv = {! !}
- ; ∘-resp-≈ = {! !}
+ ; identityˡ = compose-idˡ
+ ; identityʳ = compose-idʳ
+ ; identity² = compose-id²
+ ; equiv = record
+ { refl = same-refl
+ ; sym = same-sym
+ ; trans = same-trans
+ }
+ ; ∘-resp-≈ = compose-equiv
}