Library Modules.Prelims.FibrationInitialPushout
Modularity in a fibration setting
< f1, ff1 c0 , d0 ------------> c1 , d1 | | | | f2 , ff2 | | g2 , gg2 | | | | | | V V c2 , d2 ------------> c' , d' g1 , gg1>
- the restricting diagram in the category C is a pushout
- d1, d2, d' are initial in their respective fiber categories D{c1}, D{c2}, D{d'} (this implies that gg1 and gg2 are uniquely determined : see disp_InitialArrowUnique)
Require Import UniMath.Foundations.PartD.
Require Import UniMath.Foundations.Propositions.
Require Import UniMath.Foundations.Sets.
Require Import UniMath.CategoryTheory.Core.Prelude.
Require Import UniMath.CategoryTheory.limits.pushouts.
Require Import UniMath.CategoryTheory.limits.initial.
Require Import UniMath.CategoryTheory.DisplayedCats.Auxiliary.
Require Import UniMath.CategoryTheory.DisplayedCats.Core.
Require Import UniMath.CategoryTheory.DisplayedCats.Constructions.
Require Import UniMath.CategoryTheory.DisplayedCats.Fibrations.
Open Scope cat.
Section pr.
Context {C : category} (dC : disp_cat C).
Definition disp_mor_to_total_mor {x y : C} {xx : dC x} {yy : dC y}
{f : C ⟦ x, y ⟧}(ff : xx -->[f] yy) : total_category dC ⟦ _ ,, xx, _ ,,yy ⟧
:= _ ,, ff.
Local Notation TT := disp_mor_to_total_mor.
Context (cl : cleaving dC).
Require Import UniMath.Foundations.Propositions.
Require Import UniMath.Foundations.Sets.
Require Import UniMath.CategoryTheory.Core.Prelude.
Require Import UniMath.CategoryTheory.limits.pushouts.
Require Import UniMath.CategoryTheory.limits.initial.
Require Import UniMath.CategoryTheory.DisplayedCats.Auxiliary.
Require Import UniMath.CategoryTheory.DisplayedCats.Core.
Require Import UniMath.CategoryTheory.DisplayedCats.Constructions.
Require Import UniMath.CategoryTheory.DisplayedCats.Fibrations.
Open Scope cat.
Section pr.
Context {C : category} (dC : disp_cat C).
Definition disp_mor_to_total_mor {x y : C} {xx : dC x} {yy : dC y}
{f : C ⟦ x, y ⟧}(ff : xx -->[f] yy) : total_category dC ⟦ _ ,, xx, _ ,,yy ⟧
:= _ ,, ff.
Local Notation TT := disp_mor_to_total_mor.
Context (cl : cleaving dC).
Let xx be initial in the fiber category over x ∈ C.
If there is a morphism f : x → y in C, then there is a unique morphism over f
Definition disp_InitialArrow {x y : C} {xx : dC x} {yy : dC y}
(init : isInitial (fiber_category _ _) xx)
(f : C ⟦ x, y ⟧) :=
transportf _ (id_left f)
(iscontrpr1 (init _);; (cl _ _ f yy ))%mor_disp.
Lemma disp_InitialArrowUnique {x y : C} {xx : dC x} {yy : dC y}
(init : isInitial (fiber_category _ _) xx)
{f : C ⟦ x, y ⟧}(ff : xx -->[f] yy) : ff =
disp_InitialArrow init f.
Proof.
revert ff.
unfold disp_InitialArrow.
destruct (id_left f).
cbn.
intro ff.
unfold idfun.
cbn.
etrans; [eapply pathsinv0; use cartesian_factorisation_commutes; revgoals|].
- set (gg := cl _ _ f yy).
exact ( cartesian_lift_is_cartesian _ _ gg).
- cbn.
apply (maponpaths (fun x => (x;; _)%mor_disp)) .
apply iscontr_uniqueness.
Qed.
Context
{c0 c1 c2 c' : C}
{f1 : C ⟦ c0, c1 ⟧}{f2 : C ⟦ c0, c2 ⟧}
{g1 : C ⟦ c1, c' ⟧}{g2 : C ⟦ c2, c' ⟧}
{d0 : dC c0} {d1 : dC c1} {d2 : dC c2} {d' : dC c'}
(init_d1 : isInitial (fiber_category _ _) d1)
(init_d2 : isInitial (fiber_category _ _) d2)
(init_d' : isInitial (fiber_category _ _) d') .
Lemma pushout_total
(ff1 : d0 -->[f1] d1)(ff2 : d0 -->[f2] d2)
(gg1 := disp_InitialArrow (yy := d') init_d1 g1)
(gg2 := disp_InitialArrow init_d2 g2)
{eq_ff : TT ff1 · TT gg1 = TT ff2 · TT gg2}
(poC : isPushout f1 f2 g1 g2 (base_paths _ _ eq_ff))
: isPushout (TT ff1)(TT ff2)(TT gg1)(TT gg2) eq_ff.
Proof.
set (PO := mk_Pushout _ _ _ _ _ _ poC).
use mk_isPushout.
intros [x xx] [h1 hh1] [h2 hh2] heq_hh.
cbn in h1, hh1, h2, hh2.
use unique_exists.
- use TT.
+ apply (PushoutArrow PO _ h1 h2).
exact (base_paths _ _ heq_hh).
+ apply disp_InitialArrow.
assumption.
- split.
+ use total2_paths2_b.
* apply (PushoutArrow_PushoutIn1 PO).
* etrans; [apply (disp_InitialArrowUnique init_d1)|].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d1).
+ use total2_paths2_b.
* apply (PushoutArrow_PushoutIn2 PO).
* etrans; [apply (disp_InitialArrowUnique init_d2)|].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d2).
- intros y.
apply isapropdirprod; apply homset_property.
- intros [k kk] [eqkk1 eqkk2].
cbn in k,kk.
use total2_paths2_b.
+ apply PushoutArrowUnique.
* apply (base_paths _ _ eqkk1).
* apply (base_paths _ _ eqkk2).
+ etrans; [apply (disp_InitialArrowUnique init_d')|].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d').
Qed.
(init : isInitial (fiber_category _ _) xx)
(f : C ⟦ x, y ⟧) :=
transportf _ (id_left f)
(iscontrpr1 (init _);; (cl _ _ f yy ))%mor_disp.
Lemma disp_InitialArrowUnique {x y : C} {xx : dC x} {yy : dC y}
(init : isInitial (fiber_category _ _) xx)
{f : C ⟦ x, y ⟧}(ff : xx -->[f] yy) : ff =
disp_InitialArrow init f.
Proof.
revert ff.
unfold disp_InitialArrow.
destruct (id_left f).
cbn.
intro ff.
unfold idfun.
cbn.
etrans; [eapply pathsinv0; use cartesian_factorisation_commutes; revgoals|].
- set (gg := cl _ _ f yy).
exact ( cartesian_lift_is_cartesian _ _ gg).
- cbn.
apply (maponpaths (fun x => (x;; _)%mor_disp)) .
apply iscontr_uniqueness.
Qed.
Context
{c0 c1 c2 c' : C}
{f1 : C ⟦ c0, c1 ⟧}{f2 : C ⟦ c0, c2 ⟧}
{g1 : C ⟦ c1, c' ⟧}{g2 : C ⟦ c2, c' ⟧}
{d0 : dC c0} {d1 : dC c1} {d2 : dC c2} {d' : dC c'}
(init_d1 : isInitial (fiber_category _ _) d1)
(init_d2 : isInitial (fiber_category _ _) d2)
(init_d' : isInitial (fiber_category _ _) d') .
Lemma pushout_total
(ff1 : d0 -->[f1] d1)(ff2 : d0 -->[f2] d2)
(gg1 := disp_InitialArrow (yy := d') init_d1 g1)
(gg2 := disp_InitialArrow init_d2 g2)
{eq_ff : TT ff1 · TT gg1 = TT ff2 · TT gg2}
(poC : isPushout f1 f2 g1 g2 (base_paths _ _ eq_ff))
: isPushout (TT ff1)(TT ff2)(TT gg1)(TT gg2) eq_ff.
Proof.
set (PO := mk_Pushout _ _ _ _ _ _ poC).
use mk_isPushout.
intros [x xx] [h1 hh1] [h2 hh2] heq_hh.
cbn in h1, hh1, h2, hh2.
use unique_exists.
- use TT.
+ apply (PushoutArrow PO _ h1 h2).
exact (base_paths _ _ heq_hh).
+ apply disp_InitialArrow.
assumption.
- split.
+ use total2_paths2_b.
* apply (PushoutArrow_PushoutIn1 PO).
* etrans; [apply (disp_InitialArrowUnique init_d1)|].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d1).
+ use total2_paths2_b.
* apply (PushoutArrow_PushoutIn2 PO).
* etrans; [apply (disp_InitialArrowUnique init_d2)|].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d2).
- intros y.
apply isapropdirprod; apply homset_property.
- intros [k kk] [eqkk1 eqkk2].
cbn in k,kk.
use total2_paths2_b.
+ apply PushoutArrowUnique.
* apply (base_paths _ _ eqkk1).
* apply (base_paths _ _ eqkk2).
+ etrans; [apply (disp_InitialArrowUnique init_d')|].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d').
Qed.
If d0 is initial, then the requirements are fulfilled
Context (init_d0 : isInitial (fiber_category _ _) d0).
Local Notation "##" := (disp_InitialArrow ).
Let ff1 : d0 -->[f1] d1 := ## init_d0 f1.
Let ff2 : d0 -->[f2] d2 := ## init_d0 f2.
Let gg1 : d1 -->[g1] d' := ## init_d1 g1.
Let gg2 : d2 -->[g2] d' := ## init_d2 g2.
Context {heq : f1 · g1 = f2 · g2}.
Lemma initial_cl_lift_square_eq : TT ff1 · TT gg1 = TT ff2 · TT gg2.
Proof.
use total2_paths2_b.
- exact heq.
- etrans; [ apply (disp_InitialArrowUnique init_d0) | ].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d0).
Qed.
Lemma pushout_total_initial
(poC : isPushout f1 f2 g1 g2 heq)
: isPushout (TT ff1)(TT ff2)(TT gg1)(TT gg2) initial_cl_lift_square_eq.
Proof.
apply pushout_total.
exact poC.
Qed.
End pr.
Local Notation "##" := (disp_InitialArrow ).
Let ff1 : d0 -->[f1] d1 := ## init_d0 f1.
Let ff2 : d0 -->[f2] d2 := ## init_d0 f2.
Let gg1 : d1 -->[g1] d' := ## init_d1 g1.
Let gg2 : d2 -->[g2] d' := ## init_d2 g2.
Context {heq : f1 · g1 = f2 · g2}.
Lemma initial_cl_lift_square_eq : TT ff1 · TT gg1 = TT ff2 · TT gg2.
Proof.
use total2_paths2_b.
- exact heq.
- etrans; [ apply (disp_InitialArrowUnique init_d0) | ].
apply pathsinv0.
apply (disp_InitialArrowUnique init_d0).
Qed.
Lemma pushout_total_initial
(poC : isPushout f1 f2 g1 g2 heq)
: isPushout (TT ff1)(TT ff2)(TT gg1)(TT gg2) initial_cl_lift_square_eq.
Proof.
apply pushout_total.
exact poC.
Qed.
End pr.