Library UniMath.Ktheory.QuotientSet


Require Import
        UniMath.Foundations.Sets
        UniMath.Ktheory.Utilities.
Definition iscomprelfun2 {X Y Z} (RX:hrel X) (RY:hrel Y)
           (f:XYZ) : Type
  := ( x x', RX x x' y, f x y = f x' y) ×
     ( y y', RY y y' x, f x y = f x y').
Definition iscomprelrelfun2 {X Y Z} (RX:hrel X) (RY:hrel Y) (RZ:eqrel Z)
           (f:XYZ) : Type
  := ( x x' y, RX x x' RZ (f x y) (f x' y)) ×
     ( x y y', RY y y' RZ (f x y) (f x y')).
Lemma setquotuniv_equal { X : UU } ( R : hrel X ) ( Y : hSet )
      ( f f' : X Y ) (p : f = f')
      ( is : iscomprelfun R f ) ( is' : iscomprelfun R f' )
: setquotuniv R Y f is = setquotuniv R Y f' is'.
Proof. intros. destruct p. apply funextsec; intro c.
       assert(ip : isaprop (iscomprelfun R f)). {
         apply impred; intro x; apply impred; intro x'.
         apply impred; intro p. apply setproperty. }
       assert( q : is = is' ). { apply ip. }
       destruct q. reflexivity. Qed.
Definition setquotuniv2 {X Y} (RX:hrel X) (RY:hrel Y)
           {Z:hSet} (f:XYZ) (is:iscomprelfun2 RX RY f) :
  setquot RX setquot RY Z.
Proof. intros x''.
       simple refine (setquotuniv RX (funset (setquot RY) Z) _ _ _).
       { simpl. intro x. apply (setquotuniv RY Z (f x)).
         intros y y' e. unfold iscomprelfun2 in is.
         apply (pr2 is). assumption. }
       { intros x x' e.
         assert( p : f x = f x' ).
         { apply funextsec; intro y. apply (pr1 is). assumption. }
       apply setquotuniv_equal. assumption. } assumption. Defined.
Definition setquotfun2 {X Y Z} {RX:hrel X} {RY:hrel Y} {RZ:eqrel Z}
           (f:XYZ) (is:iscomprelrelfun2 RX RY RZ f) :
  setquot RX setquot RY setquot RZ.
Proof. set (f' := λ x y, setquotpr RZ (f x y) : setquotinset RZ).
       apply (setquotuniv2 RX RY f'). split.
       { intros ? ? p ?. apply iscompsetquotpr. exact (pr1 is x x' y p). }
       { intros ? ? p ?. apply iscompsetquotpr. exact (pr2 is x y y' p). }
Defined.
Lemma setquotfun2_equal {X Y Z} (RX:eqrel X) (RY:eqrel Y) (RZ:eqrel Z)
           (f:XYZ) (is:iscomprelrelfun2 RX RY RZ f)
           (x:X) (y:Y) :
  setquotfun2 f is (setquotpr RX x) (setquotpr RY y) =
  setquotpr RZ (f x y).
Proof. reflexivity. Defined.