Library UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.Logic.SubobjectDispCat
Require Import UniMath.MoreFoundations.All.
Require Import UniMath.CategoryTheory.Core.Prelude.
Require Import UniMath.CategoryTheory.DisplayedCats.Core.
Require Import UniMath.CategoryTheory.DisplayedCats.Isos.
Require Import UniMath.CategoryTheory.DisplayedCats.Univalence.
Require Import UniMath.CategoryTheory.DisplayedCats.Fibrations.
Require Import UniMath.CategoryTheory.Hyperdoctrines.Hyperdoctrine.
Require Import UniMath.CategoryTheory.Hyperdoctrines.FirstOrderHyperdoctrine.
Require Import UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.PERs.
Require Import UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.PERMorphisms.
Require Import UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.PERCategory.
Local Open Scope cat.
Local Open Scope hd.
Section PartialEqRelDispCat.
Context {H : first_order_hyperdoctrine}.
Require Import UniMath.CategoryTheory.Core.Prelude.
Require Import UniMath.CategoryTheory.DisplayedCats.Core.
Require Import UniMath.CategoryTheory.DisplayedCats.Isos.
Require Import UniMath.CategoryTheory.DisplayedCats.Univalence.
Require Import UniMath.CategoryTheory.DisplayedCats.Fibrations.
Require Import UniMath.CategoryTheory.Hyperdoctrines.Hyperdoctrine.
Require Import UniMath.CategoryTheory.Hyperdoctrines.FirstOrderHyperdoctrine.
Require Import UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.PERs.
Require Import UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.PERMorphisms.
Require Import UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.PERCategory.
Local Open Scope cat.
Local Open Scope hd.
Section PartialEqRelDispCat.
Context {H : first_order_hyperdoctrine}.
Definition per_subobject_def_law
{X : partial_setoid H}
(Ο : form X)
: UU
:= let x := Οβ (tm_var (π Γh X)) in
(β€ β’ βh (Ο [ x ] β x ~ x)).
Definition per_subobject_eq_law
{X : partial_setoid H}
(Ο : form X)
: UU
:= let x := Οβ (Οβ (tm_var ((π Γh X) Γh X))) in
let y := Οβ (tm_var ((π Γh X) Γh X)) in
(β€ β’ βh βh (x ~ y β Ο [ x ] β Ο [ y ])).
Definition per_subobject_laws
{X : partial_setoid H}
(Ο : form X)
: UU
:= per_subobject_def_law Ο
Γ
per_subobject_eq_law Ο.
Proposition isaprop_per_subobject_laws
{X : partial_setoid H}
(Ο : form X)
: isaprop (per_subobject_laws Ο).
Proof.
use isapropdirprod ;
use invproofirrelevance ;
intros p q ;
apply hyperdoctrine_proof_eq.
Qed.
Definition per_subobject
(X : partial_setoid H)
: UU
:= β (Ο : form X), per_subobject_laws Ο.
Definition make_per_subobject
{X : partial_setoid H}
(Ο : form X)
(HΟ : per_subobject_laws Ο)
: per_subobject X
:= Ο ,, HΟ.
Proposition isaset_per_subobject
(X : partial_setoid H)
: isaset (per_subobject X).
Proof.
use isaset_total2.
- apply isaset_hyperdoctrine_formula.
- intro Ο.
apply isasetaprop.
apply isaprop_per_subobject_laws.
Qed.
{X : partial_setoid H}
(Ο : form X)
: UU
:= let x := Οβ (tm_var (π Γh X)) in
(β€ β’ βh (Ο [ x ] β x ~ x)).
Definition per_subobject_eq_law
{X : partial_setoid H}
(Ο : form X)
: UU
:= let x := Οβ (Οβ (tm_var ((π Γh X) Γh X))) in
let y := Οβ (tm_var ((π Γh X) Γh X)) in
(β€ β’ βh βh (x ~ y β Ο [ x ] β Ο [ y ])).
Definition per_subobject_laws
{X : partial_setoid H}
(Ο : form X)
: UU
:= per_subobject_def_law Ο
Γ
per_subobject_eq_law Ο.
Proposition isaprop_per_subobject_laws
{X : partial_setoid H}
(Ο : form X)
: isaprop (per_subobject_laws Ο).
Proof.
use isapropdirprod ;
use invproofirrelevance ;
intros p q ;
apply hyperdoctrine_proof_eq.
Qed.
Definition per_subobject
(X : partial_setoid H)
: UU
:= β (Ο : form X), per_subobject_laws Ο.
Definition make_per_subobject
{X : partial_setoid H}
(Ο : form X)
(HΟ : per_subobject_laws Ο)
: per_subobject X
:= Ο ,, HΟ.
Proposition isaset_per_subobject
(X : partial_setoid H)
: isaset (per_subobject X).
Proof.
use isaset_total2.
- apply isaset_hyperdoctrine_formula.
- intro Ο.
apply isasetaprop.
apply isaprop_per_subobject_laws.
Qed.
Coercion per_subobject_to_form
{X : partial_setoid H}
(Ο : per_subobject X)
: form X
:= pr1 Ο.
Proposition per_subobject_def
{X : partial_setoid H}
(Ο : per_subobject X)
{Ξ : ty H}
{Ξ : form Ξ}
(x : tm Ξ X)
(p : Ξ β’ Ο [ x ])
: Ξ β’ x ~ x.
Proof.
use (impl_elim p).
pose proof (hyperdoctrine_proof_subst (!! : tm Ξ π) (pr12 Ο)) as q.
cbn in q.
rewrite forall_subst in q.
pose proof (q' := forall_elim q x) ; clear q.
rewrite hyperdoctrine_comp_subst in q'.
rewrite impl_subst in q'.
rewrite partial_setoid_subst in q'.
rewrite hyperdoctrine_pr2_subst in q'.
rewrite var_tm_subst in q'.
rewrite hyperdoctrine_pair_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite hyperdoctrine_pr2_subst in q'.
rewrite var_tm_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite hyperdoctrine_comp_subst in q'.
rewrite hyperdoctrine_pr2_subst in q'.
rewrite var_tm_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite truth_subst in q'.
refine (hyperdoctrine_cut _ q').
apply truth_intro.
Qed.
Proposition per_subobject_eq
{X : partial_setoid H}
(Ο : per_subobject X)
{Ξ : ty H}
{Ξ : form Ξ}
{x y : tm Ξ X}
(pβ : Ξ β’ x ~ y)
(pβ : Ξ β’ Ο [ x ])
: Ξ β’ Ο [ y ].
Proof.
use (impl_elim pβ).
use (impl_elim pβ).
pose proof (hyperdoctrine_proof_subst (!! : tm Ξ π) (pr22 Ο)) as q.
cbn in q.
rewrite truth_subst in q.
rewrite !forall_subst in q.
rewrite !impl_subst in q.
rewrite !partial_setoid_subst in q.
rewrite !hyperdoctrine_comp_subst in q.
rewrite !hyperdoctrine_pr2_subst in q.
rewrite !hyperdoctrine_pr1_subst in q.
rewrite !var_tm_subst in q.
rewrite hyperdoctrine_pair_pr1 in q.
rewrite hyperdoctrine_pair_pr2 in q.
rewrite hyperdoctrine_pair_subst in q.
rewrite hyperdoctrine_pair_pr2 in q.
rewrite hyperdoctrine_pr2_subst in q.
rewrite !var_tm_subst in q.
pose proof (q' := forall_elim q x) ; clear q.
rewrite forall_subst in q'.
rewrite !impl_subst in q'.
rewrite !partial_setoid_subst in q'.
rewrite !hyperdoctrine_comp_subst in q'.
rewrite !hyperdoctrine_pr2_subst in q'.
rewrite !hyperdoctrine_pr1_subst in q'.
rewrite !var_tm_subst in q'.
rewrite hyperdoctrine_pair_pr1 in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite hyperdoctrine_pair_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
pose proof (q'' := forall_elim q' y) ; clear q'.
rewrite !impl_subst in q''.
rewrite !partial_setoid_subst in q''.
rewrite !hyperdoctrine_comp_subst in q''.
rewrite !tm_subst_comp in q''.
rewrite !hyperdoctrine_pr1_subst in q''.
rewrite !hyperdoctrine_pr2_subst in q''.
rewrite !var_tm_subst in q''.
rewrite hyperdoctrine_pair_pr1 in q''.
rewrite hyperdoctrine_pair_pr2 in q''.
rewrite !tm_subst_var in q''.
refine (hyperdoctrine_cut _ q'').
apply truth_intro.
Qed.
{X : partial_setoid H}
(Ο : per_subobject X)
: form X
:= pr1 Ο.
Proposition per_subobject_def
{X : partial_setoid H}
(Ο : per_subobject X)
{Ξ : ty H}
{Ξ : form Ξ}
(x : tm Ξ X)
(p : Ξ β’ Ο [ x ])
: Ξ β’ x ~ x.
Proof.
use (impl_elim p).
pose proof (hyperdoctrine_proof_subst (!! : tm Ξ π) (pr12 Ο)) as q.
cbn in q.
rewrite forall_subst in q.
pose proof (q' := forall_elim q x) ; clear q.
rewrite hyperdoctrine_comp_subst in q'.
rewrite impl_subst in q'.
rewrite partial_setoid_subst in q'.
rewrite hyperdoctrine_pr2_subst in q'.
rewrite var_tm_subst in q'.
rewrite hyperdoctrine_pair_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite hyperdoctrine_pr2_subst in q'.
rewrite var_tm_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite hyperdoctrine_comp_subst in q'.
rewrite hyperdoctrine_pr2_subst in q'.
rewrite var_tm_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite truth_subst in q'.
refine (hyperdoctrine_cut _ q').
apply truth_intro.
Qed.
Proposition per_subobject_eq
{X : partial_setoid H}
(Ο : per_subobject X)
{Ξ : ty H}
{Ξ : form Ξ}
{x y : tm Ξ X}
(pβ : Ξ β’ x ~ y)
(pβ : Ξ β’ Ο [ x ])
: Ξ β’ Ο [ y ].
Proof.
use (impl_elim pβ).
use (impl_elim pβ).
pose proof (hyperdoctrine_proof_subst (!! : tm Ξ π) (pr22 Ο)) as q.
cbn in q.
rewrite truth_subst in q.
rewrite !forall_subst in q.
rewrite !impl_subst in q.
rewrite !partial_setoid_subst in q.
rewrite !hyperdoctrine_comp_subst in q.
rewrite !hyperdoctrine_pr2_subst in q.
rewrite !hyperdoctrine_pr1_subst in q.
rewrite !var_tm_subst in q.
rewrite hyperdoctrine_pair_pr1 in q.
rewrite hyperdoctrine_pair_pr2 in q.
rewrite hyperdoctrine_pair_subst in q.
rewrite hyperdoctrine_pair_pr2 in q.
rewrite hyperdoctrine_pr2_subst in q.
rewrite !var_tm_subst in q.
pose proof (q' := forall_elim q x) ; clear q.
rewrite forall_subst in q'.
rewrite !impl_subst in q'.
rewrite !partial_setoid_subst in q'.
rewrite !hyperdoctrine_comp_subst in q'.
rewrite !hyperdoctrine_pr2_subst in q'.
rewrite !hyperdoctrine_pr1_subst in q'.
rewrite !var_tm_subst in q'.
rewrite hyperdoctrine_pair_pr1 in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
rewrite hyperdoctrine_pair_subst in q'.
rewrite hyperdoctrine_pair_pr2 in q'.
pose proof (q'' := forall_elim q' y) ; clear q'.
rewrite !impl_subst in q''.
rewrite !partial_setoid_subst in q''.
rewrite !hyperdoctrine_comp_subst in q''.
rewrite !tm_subst_comp in q''.
rewrite !hyperdoctrine_pr1_subst in q''.
rewrite !hyperdoctrine_pr2_subst in q''.
rewrite !var_tm_subst in q''.
rewrite hyperdoctrine_pair_pr1 in q''.
rewrite hyperdoctrine_pair_pr2 in q''.
rewrite !tm_subst_var in q''.
refine (hyperdoctrine_cut _ q'').
apply truth_intro.
Qed.
Definition per_subobject_mor_law
{X Y : partial_setoid H}
(Ο : partial_setoid_morphism X Y)
(Οβ : per_subobject X)
(Οβ : per_subobject Y)
: UU
:= let x := Οβ (Οβ (tm_var ((π Γh X) Γh Y))) in
let y := Οβ (tm_var ((π Γh X) Γh Y)) in
(β€ β’ βh βh (Ο [ β¨ x , y β© ] β Οβ [ x ] β Οβ [ y ])).
Arguments per_subobject_mor_law {X Y} Ο Οβ Οβ /.
Proposition isaprop_per_subobject_mor_law
{X Y : partial_setoid H}
(Ο : partial_setoid_morphism X Y)
(Οβ : per_subobject X)
(Οβ : per_subobject Y)
: isaprop (per_subobject_mor_law Ο Οβ Οβ).
Proof.
use invproofirrelevance.
intros p q.
apply hyperdoctrine_proof_eq.
Qed.
Proposition per_subobject_mor
{X Y : partial_setoid H}
{Ο : partial_setoid_morphism X Y}
{Οβ : per_subobject X}
{Οβ : per_subobject Y}
(p : per_subobject_mor_law Ο Οβ Οβ)
{Ξ : ty H}
{Ξ : form Ξ}
{x : tm Ξ X}
{y : tm Ξ Y}
(qβ : Ξ β’ Ο [ β¨ x , y β© ])
(qβ : Ξ β’ Οβ [ x ])
: Ξ β’ Οβ [ y ].
Proof.
use (impl_elim qβ).
use (impl_elim qβ).
pose proof (hyperdoctrine_proof_subst (!! : tm Ξ π) p) as r.
cbn in r.
rewrite truth_subst in r.
rewrite !forall_subst in r.
rewrite !impl_subst in r.
rewrite !hyperdoctrine_comp_subst in r.
rewrite !hyperdoctrine_pr2_subst in r.
rewrite !hyperdoctrine_pr1_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pair_pr1 in r.
rewrite hyperdoctrine_pair_pr2 in r.
rewrite !hyperdoctrine_pair_subst in r.
rewrite hyperdoctrine_pair_pr2 in r.
rewrite hyperdoctrine_pr2_subst in r.
rewrite hyperdoctrine_pr1_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pair_pr1 in r.
rewrite hyperdoctrine_pair_pr2 in r.
rewrite hyperdoctrine_pr2_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pr2_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pair_pr2 in r.
pose proof (r' := forall_elim r x) ; clear r.
rewrite forall_subst in r'.
rewrite !impl_subst in r'.
rewrite !hyperdoctrine_comp_subst in r'.
rewrite !hyperdoctrine_pr2_subst in r'.
rewrite !hyperdoctrine_pr1_subst in r'.
rewrite !var_tm_subst in r'.
rewrite hyperdoctrine_pair_pr1 in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
rewrite !hyperdoctrine_pair_subst in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
rewrite hyperdoctrine_pr2_subst in r'.
rewrite hyperdoctrine_pr1_subst in r'.
rewrite !var_tm_subst in r'.
rewrite hyperdoctrine_pair_pr1 in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
rewrite hyperdoctrine_pr2_subst in r'.
rewrite !var_tm_subst in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
pose proof (r'' := forall_elim r' y) ; clear r'.
rewrite !impl_subst in r''.
rewrite !hyperdoctrine_comp_subst in r''.
rewrite !hyperdoctrine_pr2_subst in r''.
rewrite !var_tm_subst in r''.
rewrite hyperdoctrine_pair_pr2 in r''.
rewrite !hyperdoctrine_pair_subst in r''.
rewrite hyperdoctrine_pr2_subst in r''.
rewrite !var_tm_subst in r''.
rewrite hyperdoctrine_pair_pr2 in r''.
rewrite !tm_subst_comp in r''.
rewrite !hyperdoctrine_pr1_subst in r''.
rewrite !var_tm_subst in r''.
rewrite hyperdoctrine_pair_pr1 in r''.
rewrite !tm_subst_var in r''.
refine (hyperdoctrine_cut _ r'').
apply truth_intro.
Qed.
{X Y : partial_setoid H}
(Ο : partial_setoid_morphism X Y)
(Οβ : per_subobject X)
(Οβ : per_subobject Y)
: UU
:= let x := Οβ (Οβ (tm_var ((π Γh X) Γh Y))) in
let y := Οβ (tm_var ((π Γh X) Γh Y)) in
(β€ β’ βh βh (Ο [ β¨ x , y β© ] β Οβ [ x ] β Οβ [ y ])).
Arguments per_subobject_mor_law {X Y} Ο Οβ Οβ /.
Proposition isaprop_per_subobject_mor_law
{X Y : partial_setoid H}
(Ο : partial_setoid_morphism X Y)
(Οβ : per_subobject X)
(Οβ : per_subobject Y)
: isaprop (per_subobject_mor_law Ο Οβ Οβ).
Proof.
use invproofirrelevance.
intros p q.
apply hyperdoctrine_proof_eq.
Qed.
Proposition per_subobject_mor
{X Y : partial_setoid H}
{Ο : partial_setoid_morphism X Y}
{Οβ : per_subobject X}
{Οβ : per_subobject Y}
(p : per_subobject_mor_law Ο Οβ Οβ)
{Ξ : ty H}
{Ξ : form Ξ}
{x : tm Ξ X}
{y : tm Ξ Y}
(qβ : Ξ β’ Ο [ β¨ x , y β© ])
(qβ : Ξ β’ Οβ [ x ])
: Ξ β’ Οβ [ y ].
Proof.
use (impl_elim qβ).
use (impl_elim qβ).
pose proof (hyperdoctrine_proof_subst (!! : tm Ξ π) p) as r.
cbn in r.
rewrite truth_subst in r.
rewrite !forall_subst in r.
rewrite !impl_subst in r.
rewrite !hyperdoctrine_comp_subst in r.
rewrite !hyperdoctrine_pr2_subst in r.
rewrite !hyperdoctrine_pr1_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pair_pr1 in r.
rewrite hyperdoctrine_pair_pr2 in r.
rewrite !hyperdoctrine_pair_subst in r.
rewrite hyperdoctrine_pair_pr2 in r.
rewrite hyperdoctrine_pr2_subst in r.
rewrite hyperdoctrine_pr1_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pair_pr1 in r.
rewrite hyperdoctrine_pair_pr2 in r.
rewrite hyperdoctrine_pr2_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pr2_subst in r.
rewrite !var_tm_subst in r.
rewrite hyperdoctrine_pair_pr2 in r.
pose proof (r' := forall_elim r x) ; clear r.
rewrite forall_subst in r'.
rewrite !impl_subst in r'.
rewrite !hyperdoctrine_comp_subst in r'.
rewrite !hyperdoctrine_pr2_subst in r'.
rewrite !hyperdoctrine_pr1_subst in r'.
rewrite !var_tm_subst in r'.
rewrite hyperdoctrine_pair_pr1 in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
rewrite !hyperdoctrine_pair_subst in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
rewrite hyperdoctrine_pr2_subst in r'.
rewrite hyperdoctrine_pr1_subst in r'.
rewrite !var_tm_subst in r'.
rewrite hyperdoctrine_pair_pr1 in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
rewrite hyperdoctrine_pr2_subst in r'.
rewrite !var_tm_subst in r'.
rewrite hyperdoctrine_pair_pr2 in r'.
pose proof (r'' := forall_elim r' y) ; clear r'.
rewrite !impl_subst in r''.
rewrite !hyperdoctrine_comp_subst in r''.
rewrite !hyperdoctrine_pr2_subst in r''.
rewrite !var_tm_subst in r''.
rewrite hyperdoctrine_pair_pr2 in r''.
rewrite !hyperdoctrine_pair_subst in r''.
rewrite hyperdoctrine_pr2_subst in r''.
rewrite !var_tm_subst in r''.
rewrite hyperdoctrine_pair_pr2 in r''.
rewrite !tm_subst_comp in r''.
rewrite !hyperdoctrine_pr1_subst in r''.
rewrite !var_tm_subst in r''.
rewrite hyperdoctrine_pair_pr1 in r''.
rewrite !tm_subst_var in r''.
refine (hyperdoctrine_cut _ r'').
apply truth_intro.
Qed.
Definition disp_cat_ob_mor_per_subobject
: disp_cat_ob_mor (category_of_partial_setoids H).
Proof.
simple refine (_ ,, _).
- exact (Ξ» (X : partial_setoid H), per_subobject X).
- exact (Ξ» (X Y : partial_setoid H)
(Οβ : per_subobject X)
(Οβ : per_subobject Y)
(Ο : partial_setoid_morphism X Y),
per_subobject_mor_law Ο Οβ Οβ).
Defined.
Proposition disp_cat_id_comp_per_subobject
: disp_cat_id_comp
(category_of_partial_setoids H)
disp_cat_ob_mor_per_subobject.
Proof.
split.
- cbn.
intros X Ο.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
pose (xβ := Οβ (Οβ (tm_var ((π Γh X) Γh X)))).
pose (xβ := Οβ (tm_var ((π Γh X) Γh X))).
fold xβ xβ.
hypersimplify.
use impl_intro.
use per_subobject_eq.
+ exact xβ.
+ use weaken_left.
apply hyperdoctrine_hyp.
+ use weaken_right.
apply hyperdoctrine_hyp.
- intros X Y Z Οβ Οβ Οβ Οβ Οβ p q.
cbn -[per_subobject_mor_law] in * ; cbn.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
rewrite exists_subst.
use (exists_elim (hyperdoctrine_hyp _)).
use weaken_right.
rewrite impl_subst.
pose (x := Οβ (Οβ (Οβ (tm_var (((π Γh X) Γh Z) Γh Y))))).
pose (z := Οβ (Οβ (tm_var (((π Γh X) Γh Z) Γh Y)))).
pose (y := Οβ (tm_var (((π Γh X) Γh Z) Γh Y))).
hypersimplify.
fold x y z.
use impl_intro.
use (per_subobject_mor q).
+ exact y.
+ use weaken_left.
use weaken_right.
apply hyperdoctrine_hyp.
+ use (per_subobject_mor p).
* exact x.
* do 2 use weaken_left.
apply hyperdoctrine_hyp.
* use weaken_right.
apply hyperdoctrine_hyp.
Qed.
Definition disp_cat_data_per_subobject
: disp_cat_data (category_of_partial_setoids H).
Proof.
simple refine (_ ,, _).
- exact disp_cat_ob_mor_per_subobject.
- exact disp_cat_id_comp_per_subobject.
Defined.
Proposition disp_cat_axioms_per_subobject
: disp_cat_axioms
(category_of_partial_setoids H)
disp_cat_data_per_subobject.
Proof.
repeat split.
- intros.
apply isaprop_per_subobject_mor_law.
- intros.
apply isaprop_per_subobject_mor_law.
- intros.
apply isaprop_per_subobject_mor_law.
- intros.
apply isasetaprop.
apply isaprop_per_subobject_mor_law.
Qed.
Definition disp_cat_per_subobject
: disp_cat (category_of_partial_setoids H).
Proof.
simple refine (_ ,, _).
- exact disp_cat_data_per_subobject.
- exact disp_cat_axioms_per_subobject.
Defined.
Proposition locally_prop_disp_cat_per_subobject
: locally_propositional disp_cat_per_subobject.
Proof.
intros X Y Ο Οβ Οβ.
apply isaprop_per_subobject_mor_law.
Qed.
: disp_cat_ob_mor (category_of_partial_setoids H).
Proof.
simple refine (_ ,, _).
- exact (Ξ» (X : partial_setoid H), per_subobject X).
- exact (Ξ» (X Y : partial_setoid H)
(Οβ : per_subobject X)
(Οβ : per_subobject Y)
(Ο : partial_setoid_morphism X Y),
per_subobject_mor_law Ο Οβ Οβ).
Defined.
Proposition disp_cat_id_comp_per_subobject
: disp_cat_id_comp
(category_of_partial_setoids H)
disp_cat_ob_mor_per_subobject.
Proof.
split.
- cbn.
intros X Ο.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
pose (xβ := Οβ (Οβ (tm_var ((π Γh X) Γh X)))).
pose (xβ := Οβ (tm_var ((π Γh X) Γh X))).
fold xβ xβ.
hypersimplify.
use impl_intro.
use per_subobject_eq.
+ exact xβ.
+ use weaken_left.
apply hyperdoctrine_hyp.
+ use weaken_right.
apply hyperdoctrine_hyp.
- intros X Y Z Οβ Οβ Οβ Οβ Οβ p q.
cbn -[per_subobject_mor_law] in * ; cbn.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
rewrite exists_subst.
use (exists_elim (hyperdoctrine_hyp _)).
use weaken_right.
rewrite impl_subst.
pose (x := Οβ (Οβ (Οβ (tm_var (((π Γh X) Γh Z) Γh Y))))).
pose (z := Οβ (Οβ (tm_var (((π Γh X) Γh Z) Γh Y)))).
pose (y := Οβ (tm_var (((π Γh X) Γh Z) Γh Y))).
hypersimplify.
fold x y z.
use impl_intro.
use (per_subobject_mor q).
+ exact y.
+ use weaken_left.
use weaken_right.
apply hyperdoctrine_hyp.
+ use (per_subobject_mor p).
* exact x.
* do 2 use weaken_left.
apply hyperdoctrine_hyp.
* use weaken_right.
apply hyperdoctrine_hyp.
Qed.
Definition disp_cat_data_per_subobject
: disp_cat_data (category_of_partial_setoids H).
Proof.
simple refine (_ ,, _).
- exact disp_cat_ob_mor_per_subobject.
- exact disp_cat_id_comp_per_subobject.
Defined.
Proposition disp_cat_axioms_per_subobject
: disp_cat_axioms
(category_of_partial_setoids H)
disp_cat_data_per_subobject.
Proof.
repeat split.
- intros.
apply isaprop_per_subobject_mor_law.
- intros.
apply isaprop_per_subobject_mor_law.
- intros.
apply isaprop_per_subobject_mor_law.
- intros.
apply isasetaprop.
apply isaprop_per_subobject_mor_law.
Qed.
Definition disp_cat_per_subobject
: disp_cat (category_of_partial_setoids H).
Proof.
simple refine (_ ,, _).
- exact disp_cat_data_per_subobject.
- exact disp_cat_axioms_per_subobject.
Defined.
Proposition locally_prop_disp_cat_per_subobject
: locally_propositional disp_cat_per_subobject.
Proof.
intros X Y Ο Οβ Οβ.
apply isaprop_per_subobject_mor_law.
Qed.
Proposition is_univalent_disp_cat_per_subobject
: is_univalent_disp disp_cat_per_subobject.
Proof.
use is_univalent_disp_from_fibers.
intros X Οβ Οβ ; cbn in X, Οβ, Οβ.
use isweqimplimpl.
- intros pq.
pose (p := pr1 pq).
pose (q := pr12 pq).
cbn -[per_subobject_mor_law] in p, q.
use subtypePath.
{
intro.
apply isaprop_per_subobject_laws.
}
use hyperdoctrine_formula_eq.
+ pose (x := tm_var X).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
use (per_subobject_mor p).
* apply tm_var.
* fold x.
cbn.
hypersimplify.
use (per_subobject_def Οβ).
apply hyperdoctrine_hyp.
* apply hyperdoctrine_hyp.
+ pose (x := tm_var X).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
use (per_subobject_mor q).
* apply tm_var.
* fold x.
cbn.
hypersimplify.
use (per_subobject_def Οβ).
apply hyperdoctrine_hyp.
* apply hyperdoctrine_hyp.
- apply isaset_per_subobject.
- use isaproptotal2.
+ intro.
apply isaprop_is_z_iso_disp.
+ intros.
apply isaprop_per_subobject_mor_law.
Qed.
: is_univalent_disp disp_cat_per_subobject.
Proof.
use is_univalent_disp_from_fibers.
intros X Οβ Οβ ; cbn in X, Οβ, Οβ.
use isweqimplimpl.
- intros pq.
pose (p := pr1 pq).
pose (q := pr12 pq).
cbn -[per_subobject_mor_law] in p, q.
use subtypePath.
{
intro.
apply isaprop_per_subobject_laws.
}
use hyperdoctrine_formula_eq.
+ pose (x := tm_var X).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
use (per_subobject_mor p).
* apply tm_var.
* fold x.
cbn.
hypersimplify.
use (per_subobject_def Οβ).
apply hyperdoctrine_hyp.
* apply hyperdoctrine_hyp.
+ pose (x := tm_var X).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
rewrite <- (hyperdoctrine_id_subst (pr1 Οβ)).
use (per_subobject_mor q).
* apply tm_var.
* fold x.
cbn.
hypersimplify.
use (per_subobject_def Οβ).
apply hyperdoctrine_hyp.
* apply hyperdoctrine_hyp.
- apply isaset_per_subobject.
- use isaproptotal2.
+ intro.
apply isaprop_is_z_iso_disp.
+ intros.
apply isaprop_per_subobject_mor_law.
Qed.
Section Substitution.
Context {X Y : partial_setoid H}
(Ο : partial_setoid_morphism Y X)
(Ο : per_subobject X).
Let ΞΆ : form Y
:= let y := Οβ (tm_var (Y Γh X)) in
let x := Οβ (tm_var (Y Γh X)) in
(βh (Ο [ β¨ y , x β© ] β§ Ο [ x ])).
Proposition per_subobject_subst_laws
: per_subobject_laws ΞΆ.
Proof.
split.
- unfold ΞΆ.
use forall_intro.
use impl_intro.
use weaken_right.
rewrite exists_subst.
use (exists_elim (hyperdoctrine_hyp _)).
use weaken_right.
hypersimplify.
pose (x := Οβ (tm_var ((π Γh Y) Γh X))).
pose (y := Οβ (Οβ (tm_var ((π Γh Y) Γh X)))).
fold x y.
use weaken_left.
use (partial_setoid_mor_dom_defined Ο).
+ exact x.
+ apply hyperdoctrine_hyp.
- unfold ΞΆ.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
use impl_intro.
use hyp_sym.
rewrite !exists_subst.
use (exists_elim (weaken_left (hyperdoctrine_hyp _) _)).
rewrite !conj_subst.
use hyp_ltrans.
use weaken_right.
hypersimplify.
pose (yβ := Οβ (Οβ (Οβ (tm_var (((π Γh Y) Γh Y) Γh X))))).
pose (yβ := Οβ (Οβ (tm_var (((π Γh Y) Γh Y) Γh X)))).
pose (x := Οβ (tm_var (((π Γh Y) Γh Y) Γh X))).
fold yβ yβ x.
use exists_intro.
+ exact x.
+ hypersimplify.
fold yβ.
use conj_intro.
* use (partial_setoid_mor_eq_defined Ο).
** exact yβ.
** exact x.
** use weaken_left.
apply hyperdoctrine_hyp.
** use weaken_right.
use weaken_left.
use (partial_setoid_mor_cod_defined Ο).
*** exact yβ.
*** apply hyperdoctrine_hyp.
** use weaken_right.
use weaken_left.
apply hyperdoctrine_hyp.
* do 2 use weaken_right.
apply hyperdoctrine_hyp.
Qed.
Definition per_subobject_subst
: per_subobject Y.
Proof.
use make_per_subobject.
- exact ΞΆ.
- exact per_subobject_subst_laws.
Defined.
Arguments per_subobject_subst /.
Proposition per_subobject_subst_mor
: per_subobject_mor_law
Ο
per_subobject_subst
Ο.
Proof.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
use impl_intro.
cbn.
unfold ΞΆ.
use hyp_sym.
rewrite !exists_subst.
use (exists_elim (weaken_left (hyperdoctrine_hyp _) _)).
rewrite !conj_subst.
use hyp_ltrans.
use weaken_right.
hypersimplify.
pose (xβ := Οβ (Οβ (tm_var (((π Γh Y) Γh X) Γh X)))).
pose (xβ := Οβ (tm_var (((π Γh Y) Γh X) Γh X))).
pose (y := Οβ (Οβ (Οβ (tm_var (((π Γh Y) Γh X) Γh X))))).
fold xβ xβ y.
use (per_subobject_eq Ο).
- exact xβ.
- use (partial_setoid_mor_unique_im Ο).
+ exact y.
+ use weaken_right.
use weaken_left.
apply hyperdoctrine_hyp.
+ use weaken_left.
apply hyperdoctrine_hyp.
- do 2 use weaken_right.
apply hyperdoctrine_hyp.
Qed.
Proposition is_cartesian_per_subobject_subst_mor
: is_cartesian
(D := disp_cat_per_subobject)
per_subobject_subst_mor.
Proof.
intros W Ο' Ο' p ; cbn -[per_subobject_mor_law] in *.
use iscontraprop1.
- use isaproptotal2.
{
intro.
apply homsets_disp.
}
intros.
apply locally_prop_disp_cat_per_subobject.
- simple refine (_ ,, _) ; [ | apply locally_prop_disp_cat_per_subobject ].
do 2 use forall_intro.
use impl_intro.
use weaken_right.
use impl_intro.
cbn ; unfold ΞΆ.
pose (w := Οβ (Οβ (tm_var ((π Γh W) Γh Y)))).
pose (y := Οβ (tm_var ((π Γh W) Γh Y))).
fold w y.
simple refine (exists_elim (partial_setoid_mor_hom_exists Ο _) _).
+ exact y.
+ use weaken_left.
use (partial_setoid_mor_cod_defined Ο').
* exact w.
* apply hyperdoctrine_hyp.
+ unfold w, y ; clear w y.
hypersimplify.
pose (w := Οβ (Οβ (Οβ (tm_var (((π Γh W) Γh Y) Γh X))))).
pose (y := Οβ (Οβ (tm_var (((π Γh W) Γh Y) Γh X)))).
pose (x := Οβ (tm_var (((π Γh W) Γh Y) Γh X))).
fold w x y.
use exists_intro.
{
exact x.
}
hypersimplify.
fold y.
use conj_intro.
* use weaken_right.
apply hyperdoctrine_hyp.
* use (per_subobject_mor p).
** exact w.
** cbn.
simplify_form.
use exists_intro.
{
exact y.
}
hypersimplify.
use conj_intro.
*** do 2 use weaken_left.
apply hyperdoctrine_hyp.
*** use weaken_right.
apply hyperdoctrine_hyp.
** use weaken_left.
use weaken_right.
apply hyperdoctrine_hyp.
Qed.
End Substitution.
Arguments per_subobject_subst {X Y} Ο Ο /.
Definition disp_cat_per_subobject_cleaving
: cleaving disp_cat_per_subobject.
Proof.
intros X Y Ο Ο ; cbn in *.
simple refine (_ ,, _ ,, _).
- exact (per_subobject_subst Ο Ο).
- exact (per_subobject_subst_mor Ο Ο).
- exact (is_cartesian_per_subobject_subst_mor Ο Ο).
Defined.
End PartialEqRelDispCat.
Arguments disp_cat_per_subobject : clear implicits.
Arguments disp_cat_per_subobject_cleaving : clear implicits.
Arguments per_subobject_mor_law {H X Y} Ο Οβ Οβ /.
Arguments per_subobject_subst {H X Y} Ο Ο /.
Context {X Y : partial_setoid H}
(Ο : partial_setoid_morphism Y X)
(Ο : per_subobject X).
Let ΞΆ : form Y
:= let y := Οβ (tm_var (Y Γh X)) in
let x := Οβ (tm_var (Y Γh X)) in
(βh (Ο [ β¨ y , x β© ] β§ Ο [ x ])).
Proposition per_subobject_subst_laws
: per_subobject_laws ΞΆ.
Proof.
split.
- unfold ΞΆ.
use forall_intro.
use impl_intro.
use weaken_right.
rewrite exists_subst.
use (exists_elim (hyperdoctrine_hyp _)).
use weaken_right.
hypersimplify.
pose (x := Οβ (tm_var ((π Γh Y) Γh X))).
pose (y := Οβ (Οβ (tm_var ((π Γh Y) Γh X)))).
fold x y.
use weaken_left.
use (partial_setoid_mor_dom_defined Ο).
+ exact x.
+ apply hyperdoctrine_hyp.
- unfold ΞΆ.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
use impl_intro.
use hyp_sym.
rewrite !exists_subst.
use (exists_elim (weaken_left (hyperdoctrine_hyp _) _)).
rewrite !conj_subst.
use hyp_ltrans.
use weaken_right.
hypersimplify.
pose (yβ := Οβ (Οβ (Οβ (tm_var (((π Γh Y) Γh Y) Γh X))))).
pose (yβ := Οβ (Οβ (tm_var (((π Γh Y) Γh Y) Γh X)))).
pose (x := Οβ (tm_var (((π Γh Y) Γh Y) Γh X))).
fold yβ yβ x.
use exists_intro.
+ exact x.
+ hypersimplify.
fold yβ.
use conj_intro.
* use (partial_setoid_mor_eq_defined Ο).
** exact yβ.
** exact x.
** use weaken_left.
apply hyperdoctrine_hyp.
** use weaken_right.
use weaken_left.
use (partial_setoid_mor_cod_defined Ο).
*** exact yβ.
*** apply hyperdoctrine_hyp.
** use weaken_right.
use weaken_left.
apply hyperdoctrine_hyp.
* do 2 use weaken_right.
apply hyperdoctrine_hyp.
Qed.
Definition per_subobject_subst
: per_subobject Y.
Proof.
use make_per_subobject.
- exact ΞΆ.
- exact per_subobject_subst_laws.
Defined.
Arguments per_subobject_subst /.
Proposition per_subobject_subst_mor
: per_subobject_mor_law
Ο
per_subobject_subst
Ο.
Proof.
do 2 use forall_intro.
use impl_intro.
use weaken_right.
use impl_intro.
cbn.
unfold ΞΆ.
use hyp_sym.
rewrite !exists_subst.
use (exists_elim (weaken_left (hyperdoctrine_hyp _) _)).
rewrite !conj_subst.
use hyp_ltrans.
use weaken_right.
hypersimplify.
pose (xβ := Οβ (Οβ (tm_var (((π Γh Y) Γh X) Γh X)))).
pose (xβ := Οβ (tm_var (((π Γh Y) Γh X) Γh X))).
pose (y := Οβ (Οβ (Οβ (tm_var (((π Γh Y) Γh X) Γh X))))).
fold xβ xβ y.
use (per_subobject_eq Ο).
- exact xβ.
- use (partial_setoid_mor_unique_im Ο).
+ exact y.
+ use weaken_right.
use weaken_left.
apply hyperdoctrine_hyp.
+ use weaken_left.
apply hyperdoctrine_hyp.
- do 2 use weaken_right.
apply hyperdoctrine_hyp.
Qed.
Proposition is_cartesian_per_subobject_subst_mor
: is_cartesian
(D := disp_cat_per_subobject)
per_subobject_subst_mor.
Proof.
intros W Ο' Ο' p ; cbn -[per_subobject_mor_law] in *.
use iscontraprop1.
- use isaproptotal2.
{
intro.
apply homsets_disp.
}
intros.
apply locally_prop_disp_cat_per_subobject.
- simple refine (_ ,, _) ; [ | apply locally_prop_disp_cat_per_subobject ].
do 2 use forall_intro.
use impl_intro.
use weaken_right.
use impl_intro.
cbn ; unfold ΞΆ.
pose (w := Οβ (Οβ (tm_var ((π Γh W) Γh Y)))).
pose (y := Οβ (tm_var ((π Γh W) Γh Y))).
fold w y.
simple refine (exists_elim (partial_setoid_mor_hom_exists Ο _) _).
+ exact y.
+ use weaken_left.
use (partial_setoid_mor_cod_defined Ο').
* exact w.
* apply hyperdoctrine_hyp.
+ unfold w, y ; clear w y.
hypersimplify.
pose (w := Οβ (Οβ (Οβ (tm_var (((π Γh W) Γh Y) Γh X))))).
pose (y := Οβ (Οβ (tm_var (((π Γh W) Γh Y) Γh X)))).
pose (x := Οβ (tm_var (((π Γh W) Γh Y) Γh X))).
fold w x y.
use exists_intro.
{
exact x.
}
hypersimplify.
fold y.
use conj_intro.
* use weaken_right.
apply hyperdoctrine_hyp.
* use (per_subobject_mor p).
** exact w.
** cbn.
simplify_form.
use exists_intro.
{
exact y.
}
hypersimplify.
use conj_intro.
*** do 2 use weaken_left.
apply hyperdoctrine_hyp.
*** use weaken_right.
apply hyperdoctrine_hyp.
** use weaken_left.
use weaken_right.
apply hyperdoctrine_hyp.
Qed.
End Substitution.
Arguments per_subobject_subst {X Y} Ο Ο /.
Definition disp_cat_per_subobject_cleaving
: cleaving disp_cat_per_subobject.
Proof.
intros X Y Ο Ο ; cbn in *.
simple refine (_ ,, _ ,, _).
- exact (per_subobject_subst Ο Ο).
- exact (per_subobject_subst_mor Ο Ο).
- exact (is_cartesian_per_subobject_subst_mor Ο Ο).
Defined.
End PartialEqRelDispCat.
Arguments disp_cat_per_subobject : clear implicits.
Arguments disp_cat_per_subobject_cleaving : clear implicits.
Arguments per_subobject_mor_law {H X Y} Ο Οβ Οβ /.
Arguments per_subobject_subst {H X Y} Ο Ο /.