@@ -5,10 +5,18 @@ open import Categories.Category using (Category)
55module Categories.Adjoint.Instance.Slice {o ℓ e} (C : Category o ℓ e) where
66
77open import Categories.Adjoint using (_⊣_)
8- open import Categories.Category.Slice C using (SliceObj; Slice⇒; slicearr)
9- open import Categories.Functor.Slice C using (Forgetful; Free)
8+ open import Categories.Category.BinaryProducts C
9+ open import Categories.Category.Cartesian using (Cartesian)
10+ open import Categories.Category.CartesianClosed using (CartesianClosed)
11+ open import Categories.Category.Slice C using (SliceObj; sliceobj; Slice⇒; slicearr)
12+ open import Categories.Functor.Slice C using (Forgetful; Free; Coforgetful)
13+ open import Categories.Morphism.Reasoning C
1014open import Categories.NaturalTransformation using (ntHelper)
15+ open import Categories.Diagram.Pullback C hiding (swap)
1116open import Categories.Object.Product C
17+ open import Categories.Object.Terminal C
18+
19+ open import Function.Base using (_$_)
1220
1321open Category C
1422open HomReasoning
@@ -44,3 +52,94 @@ module _ {A : Obj} (product : ∀ {X} → Product A X) where
4452 ⟨ π₁ , π₂ ⟩ ≈⟨ η ⟩
4553 id ∎
4654 }
55+
56+ module _ {A : Obj} (ccc : CartesianClosed C) (pullback : ∀ {X} {Y} {Z} (h : X ⇒ Z) (i : Y ⇒ Z) → Pullback h i) where
57+
58+ open CartesianClosed ccc
59+ open Cartesian cartesian
60+ open Terminal terminal
61+ open BinaryProducts products
62+
63+ Free⊣Coforgetful : Free {A = A} product ⊣ Coforgetful ccc pullback
64+ Free⊣Coforgetful = record
65+ { unit = ntHelper record
66+ { η = λ X → p.universal (sliceobj π₁) (λ-unique₂′ (unit-pb X))
67+ ; commute = λ {S} {T} f → p.unique-diagram (sliceobj π₁) !-unique₂ $ begin
68+ p.p₂ (sliceobj π₁) ∘ p.universal (sliceobj π₁) _ ∘ f ≈⟨ pullˡ (p.p₂∘universal≈h₂ (sliceobj π₁)) ⟩
69+ λg swap ∘ f ≈⟨ subst ⟩
70+ λg (swap ∘ first f) ≈⟨ λ-cong swap∘⁂ ⟩
71+ λg (second f ∘ swap) ≈˘⟨ λ-cong (∘-resp-≈ʳ β′) ⟩
72+ λg (second f ∘ eval′ ∘ first (λg swap)) ≈˘⟨ λ-cong (∘-resp-≈ʳ (∘-resp-≈ʳ (⁂-cong₂ (p.p₂∘universal≈h₂ (sliceobj π₁)) Equiv.refl))) ⟩
73+ λg (second f ∘ eval′ ∘ first (p.p₂ (sliceobj π₁) ∘ p.universal (sliceobj π₁) _)) ≈˘⟨ λ-cong (pull-last first∘first) ⟩
74+ λg ((second f ∘ eval′ ∘ first (p.p₂ (sliceobj π₁))) ∘ first (p.universal (sliceobj π₁) _)) ≈˘⟨ subst ⟩
75+ λg (second f ∘ eval′ ∘ first (p.p₂ (sliceobj π₁))) ∘ p.universal (sliceobj π₁) _ ≈˘⟨ pullˡ (p.p₂∘universal≈h₂ (sliceobj π₁)) ⟩
76+ p.p₂ (sliceobj π₁) ∘ p.universal (sliceobj π₁) _ ∘ p.universal (sliceobj π₁) _ ∎
77+ }
78+ ; counit = ntHelper record
79+ { η = λ X → slicearr (counit-△ X)
80+ ; commute = λ {S} {T} f → begin
81+ (eval′ ∘ first (p.p₂ T) ∘ swap) ∘ second (p.universal T _) ≈⟨ pull-last swap∘⁂ ⟩
82+ eval′ ∘ first (p.p₂ T) ∘ first (p.universal T _) ∘ swap ≈⟨ refl⟩∘⟨ pullˡ first∘first ⟩
83+ eval′ ∘ first (p.p₂ T ∘ p.universal T _) ∘ swap ≈⟨ refl⟩∘⟨ ⁂-cong₂ (p.p₂∘universal≈h₂ T) Equiv.refl ⟩∘⟨refl ⟩
84+ eval′ ∘ first (λg (h f ∘ eval′ ∘ first (p.p₂ S))) ∘ swap ≈⟨ pullˡ β′ ⟩
85+ (h f ∘ eval′ ∘ first (p.p₂ S)) ∘ swap ≈⟨ assoc²' ⟩
86+ h f ∘ eval′ ∘ first (p.p₂ S) ∘ swap ∎
87+ }
88+ ; zig = λ {X} → begin
89+ (eval′ ∘ first (p.p₂ (sliceobj π₁)) ∘ swap) ∘ second (p.universal (sliceobj π₁) _) ≈⟨ assoc²' ⟩
90+ eval′ ∘ first (p.p₂ (sliceobj π₁)) ∘ swap ∘ second (p.universal (sliceobj π₁) _) ≈⟨ refl⟩∘⟨ refl⟩∘⟨ swap∘⁂ ⟩
91+ eval′ ∘ first (p.p₂ (sliceobj π₁)) ∘ first (p.universal (sliceobj π₁) _) ∘ swap ≈⟨ refl⟩∘⟨ pullˡ first∘first ⟩
92+ eval′ ∘ first (p.p₂ (sliceobj π₁) ∘ p.universal (sliceobj π₁) _) ∘ swap ≈⟨ refl⟩∘⟨ ⁂-cong₂ (p.p₂∘universal≈h₂ (sliceobj π₁)) Equiv.refl ⟩∘⟨refl ⟩
93+ eval′ ∘ first (λg swap) ∘ swap ≈⟨ pullˡ β′ ⟩
94+ swap ∘ swap ≈⟨ swap∘swap ⟩
95+ id ∎
96+ ; zag = λ {X} → p.unique-diagram X !-unique₂ $ begin
97+ p.p₂ X ∘ p.universal X _ ∘ p.universal (sliceobj π₁) _ ≈⟨ pullˡ (p.p₂∘universal≈h₂ X) ⟩
98+ λg ((eval′ ∘ first (p.p₂ X) ∘ swap) ∘ eval′ ∘ first (p.p₂ (sliceobj π₁))) ∘ p.universal (sliceobj π₁) _ ≈˘⟨ pullˡ (subst ○ λ-cong assoc) ⟩
99+ λg ((eval′ ∘ first (p.p₂ X) ∘ swap) ∘ eval′) ∘ p.p₂ (sliceobj π₁) ∘ p.universal (sliceobj π₁) _ ≈⟨ refl⟩∘⟨ p.p₂∘universal≈h₂ (sliceobj π₁) ⟩
100+ λg ((eval′ ∘ first (p.p₂ X) ∘ swap) ∘ eval′) ∘ λg swap ≈⟨ subst ⟩
101+ λg (((eval′ ∘ first (p.p₂ X) ∘ swap) ∘ eval′) ∘ first (λg swap)) ≈⟨ λ-cong (pullʳ β′) ⟩
102+ λg ((eval′ ∘ first (p.p₂ X) ∘ swap) ∘ swap) ≈⟨ λ-cong (pull-last swap∘swap) ⟩
103+ λg (eval′ ∘ first (p.p₂ X) ∘ id) ≈⟨ λ-cong (∘-resp-≈ʳ identityʳ) ⟩
104+ λg (eval′ ∘ first (p.p₂ X)) ≈⟨ η-exp′ ⟩
105+ p.p₂ X ≈˘⟨ identityʳ ⟩
106+ p.p₂ X ∘ id ∎
107+ }
108+ where
109+ p : (X : SliceObj A) → Pullback {X = ⊤} {Z = A ^ A} {Y = Y X ^ A} (λg π₂) (λg (arr X ∘ eval′))
110+ p X = pullback (λg π₂) (λg (arr X ∘ eval′))
111+ module p X = Pullback (p X)
112+
113+ abstract1
114+ unit-pb : ∀ (X : Obj) → eval′ ∘ first {A = X} {C = A} (λg π₂ ∘ !) ≈ eval′ ∘ first (λg (π₁ ∘ eval′) ∘ λg swap)
115+ unit-pb X = begin
116+ eval′ ∘ first (λg π₂ ∘ !) ≈˘⟨ refl⟩∘⟨ first∘first ⟩
117+ eval′ ∘ first (λg π₂) ∘ first ! ≈⟨ pullˡ β′ ⟩
118+ π₂ ∘ first ! ≈⟨ π₂∘⁂ ○ identityˡ ⟩
119+ π₂ ≈˘⟨ project₁ ⟩
120+ π₁ ∘ swap ≈˘⟨ refl⟩∘⟨ β′ ⟩
121+ π₁ ∘ eval′ ∘ first (λg swap) ≈˘⟨ extendʳ β′ ⟩
122+ eval′ ∘ first (λg (π₁ ∘ eval′)) ∘ first (λg swap) ≈⟨ refl⟩∘⟨ first∘first ⟩
123+ eval′ ∘ first (λg (π₁ ∘ eval′) ∘ λg swap) ∎
124+ -- A good chunk of the above, maybe all if you squint, is duplicated with F₁-lemma
125+ -- eval′ ∘ first (λg π₂ ∘ !) ≈ eval′ ∘ first (λg (f ∘ eval′) ∘ first (λg g)
126+ -- With f : X ⇒ Y and g : Z × Y ⇒ X. Not sure what conditions f and g need to have
127+
128+ -- Would it be better if Free used π₂ rather than π₁?
129+ -- It would mean we could avoid this swap
130+ counit-△ : ∀ X → arr X ∘ eval′ ∘ first (p.p₂ X) ∘ swap ≈ π₁
131+ counit-△ X = begin
132+ arr X ∘ eval′ ∘ first (p.p₂ X) ∘ swap ≈˘⟨ assoc² ⟩
133+ ((arr X ∘ eval′) ∘ first (p.p₂ X)) ∘ swap ≈⟨ lemma ⟩∘⟨refl ⟩
134+ (π₂ ∘ first (p.p₁ X)) ∘ swap ≈⟨ (π₂∘⁂ ○ identityˡ) ⟩∘⟨refl ⟩
135+ π₂ ∘ swap ≈⟨ project₂ ⟩
136+ π₁ ∎
137+ where
138+ lemma : (arr X ∘ eval′) ∘ first (p.p₂ X) ≈ π₂ ∘ first (p.p₁ X)
139+ lemma = λ-inj $ begin
140+ λg ((arr X ∘ eval′) ∘ first (p.p₂ X)) ≈˘⟨ subst ⟩
141+ λg (arr X ∘ eval′) ∘ p.p₂ X ≈˘⟨ p.commute X ⟩
142+ λg π₂ ∘ p.p₁ X ≈⟨ subst ⟩
143+ λg (π₂ ∘ first (p.p₁ X)) ∎
144+
145+
0 commit comments