Library UniMath.CategoryTheory.WeakEquivalences.Reflection.Pullbacks

In this file, we show that weak equivalences reflect pullbacks.

Require Import UniMath.Foundations.All.
Require Import UniMath.MoreFoundations.All.
Require Import UniMath.CategoryTheory.Core.Prelude.

Require Import UniMath.CategoryTheory.WeakEquivalences.Core.

Require Import UniMath.CategoryTheory.Limits.Pullbacks.
Require Import UniMath.CategoryTheory.Limits.Preservation.

Local Open Scope cat.

Section WeakEquivalencesReflectsPullbacks₀.

  Context
    {C D : category}
      {F : C D}
      (Fw : is_weak_equiv F)
      {x y z p : C}
      {f : C x, z}
      {fy : C y, z}
      {p : C p, x}
      {py : C p, y}
      (r : p · f = py · fy).

  Local Definition p_func : # F p · # F f = # F py · # F fy.
  Show proof.
    refine (! functor_comp _ _ _ @ _ @ functor_comp _ _ _).
    apply maponpaths.
    exact r.

  Context (iFP : isPullback p_func).
  Let FP := make_Pullback _ iFP.

  Lemma weak_equiv_reflects_pullbacks_uvp_uniqueness
    {a : ob C}
    {q₁ : Ca, x}
    {q₂ : Ca, y}
    : isaprop ( hk : Ca, p, hk · p = q₁ × hk · py = q₂).
  Show proof.
    use invproofirrelevance.
    intros φ φ.
    use subtypePath.
    { intro; apply isapropdirprod; apply homset_property. }

    refine (! homotinvweqweq (weq_from_fully_faithful (pr2 Fw) _ _) _ @ _).
    refine (_ @ homotinvweqweq (weq_from_fully_faithful (pr2 Fw) _ _) _).

    apply maponpaths.
    apply (MorphismsIntoPullbackEqual (pr22 FP)) ; simpl.
    - rewrite <- ! functor_comp.
      apply maponpaths.
      exact (pr12 φ @ ! pr12 φ).
    - rewrite <- ! functor_comp.
      apply maponpaths.
      exact (pr22 φ @ ! pr22 φ).

  Section WeakEquivalenceReflectsPullbackUniqueness.

    Context {a : C}
      {q₁ : Ca, x}
      {q₂ : Ca, y}
      (r' : q₁ · f = q₂ · fy).

    Definition weak_equiv_reflects_pullbacks_uvp_existence₀
      : C a, p .
    Show proof.
      use (fully_faithful_inv_hom (ff_from_weak_equiv _ Fw) _ _ _).
      use (pr11 (iFP (F _) (#F q₁) (#F q₂) _)).
      abstract (rewrite <- ! functor_comp ;
                apply maponpaths ;
                exact r').

    Lemma weak_equiv_reflects_pullback_uvp_existence_first_projection
      : weak_equiv_reflects_pullbacks_uvp_existence₀ · p = q₁.
    Show proof.
      simpl.
      refine (! homotinvweqweq (weq_from_fully_faithful (pr2 Fw) _ _) _ @ _).
      refine (_ @ homotinvweqweq (weq_from_fully_faithful (pr2 Fw) _ _) _).
      apply maponpaths.
      simpl.
      rewrite functor_comp.
      etrans. {
        apply maponpaths_2.
        apply (homotweqinvweq (weq_from_fully_faithful (pr2 Fw) _ _)).
      }
      apply (pr21 (iFP _ _ _ _)).

    Lemma weak_equiv_reflects_pullback_uvp_existence_second_projection
      : weak_equiv_reflects_pullbacks_uvp_existence₀ · py = q₂.
    Show proof.
      simpl.
      refine (! homotinvweqweq (weq_from_fully_faithful (pr2 Fw) _ _) _ @ _).
      refine (_ @ homotinvweqweq (weq_from_fully_faithful (pr2 Fw) _ _) _).
      apply maponpaths.
      simpl.
      rewrite functor_comp.
      etrans. {
        apply maponpaths_2.
        apply (homotweqinvweq (weq_from_fully_faithful (pr2 Fw) _ _)).
      }
      apply (pr21 (iFP _ _ _ _)).

    Definition weak_equiv_reflects_pullbacks_uvp_existence
      : hk : C a, p , hk · p = q₁ × hk · py = q₂.
    Show proof.

  End WeakEquivalenceReflectsPullbackUniqueness.

  Lemma weak_equiv_reflects_pullbacks
    : isPullback r.
  Show proof.
    intros a q₁ q₂ r'.
    use iscontraprop1.
    - apply weak_equiv_reflects_pullbacks_uvp_uniqueness.
    - exact (weak_equiv_reflects_pullbacks_uvp_existence r').

End WeakEquivalencesReflectsPullbacks₀.