Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
(** The following is an alternative (0,-1)-projectivity predicate on [A]. Given a family of quotient equivalence classes [f : forall x : A, B x / R x], for [R : forall x : A, Relation (B x)], we merely have a choice function [g : forall x, B x], factoring [f] as [f x = class_of (g x)]. *)DefinitionHasQuotientChoice (A : Type) :=
forall (B : A -> Type), (forallx, IsHSet (B x)) ->
forall (R : forallx, Relation (B x))
(pR : forallx, is_mere_relation (B x) (R x)),
(forallx, Reflexive (R x)) ->
(forallx, Symmetric (R x)) ->
(forallx, Transitive (R x)) ->
forall (f : forallx : A, B x / R x),
hexists (fung : (forallx : A, B x) =>
forallx, class_of (R x) (g x) = f x).Sectionchoose_has_quotient_choice.Context `{Univalence}
{A : Type} {B : A -> Type} `{!forallx, IsHSet (B x)}
(P : forallx, B x -> Type) `{!forallx (a : B x), IsHProp (P x a)}.Local DefinitionRelClassEquiv (x : A) (a : B x) (b : B x) : Type
:= P x a <~> P x b.
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a)
forallx : A, Reflexive (RelClassEquiv x)
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a)
forallx : A, Reflexive (RelClassEquiv x)
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b: B a
RelClassEquiv a b b
exact equiv_idmap.Qed.
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a)
forallx : A, Symmetric (RelClassEquiv x)
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a)
forallx : A, Symmetric (RelClassEquiv x)
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1, b2: B a p: RelClassEquiv a b1 b2
RelClassEquiv a b2 b1
exact (equiv_inverse p).Qed.
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a)
forallx : A, Transitive (RelClassEquiv x)
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a)
forallx : A, Transitive (RelClassEquiv x)
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1, b2, b3: B a p: RelClassEquiv a b1 b2 q: RelClassEquiv a b2 b3
RelClassEquiv a b1 b3
exact (equiv_compose q p).Qed.
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A
IsHProp
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A
IsHProp
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A
forallxy : B a / RelClassEquiv a,
(forallb : B a,
in_class (RelClassEquiv a) x b <~> P a b) ->
(forallb : B a,
in_class (RelClassEquiv a) y b <~> P a b) -> x = y
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A
forall (a0 : B a) (y : B a / RelClassEquiv a),
(forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) a0) b <~> P a b) ->
(forallb : B a,
in_class (RelClassEquiv a) y b <~> P a b) ->
class_of (RelClassEquiv a) a0 = y
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a
forally : B a / RelClassEquiv a,
(forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b) ->
(forallb : B a,
in_class (RelClassEquiv a) y b <~> P a b) ->
class_of (RelClassEquiv a) b1 = y
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a
foralla0 : B a,
(forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b) ->
(forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) a0) b <~> P a b) ->
class_of (RelClassEquiv a) b1 =
class_of (RelClassEquiv a) a0
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1, b2: B a f: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b g: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b2) b <~> P a b
class_of (RelClassEquiv a) b1 =
class_of (RelClassEquiv a) b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1, b2: B a f: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b g: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b2) b <~> P a b
RelClassEquiv a b1 b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1, b2: B a f: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b g: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b2) b <~> P a b
P a b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1, b2: B a f: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b g: forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b2) b <~> P a b
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b2) b2
apply reflexive_relclass.Qed.
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) i: forallx : A, hexists (P x) a: A
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) i: forallx : A, hexists (P x) a: A
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A i: hexists (P a)
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A i: {x : _ & P a x}
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1
{c : B a / RelClassEquiv a &
forallb : B a,
in_class (RelClassEquiv a) c b <~> P a b}
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1
forallb : B a,
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b <~> P a b
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2 <~> P a b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2 -> P a b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a
P a b2 ->
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2 -> P a b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a f: in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2
P a b2
exact (f h).
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a
P a b2 ->
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2
H: Univalence A: Type B: A -> Type H0: forallx : A, IsHSet (B x) P: forallx : A, B x -> Type H1: forall (x : A) (a : B x), IsHProp (P x a) a: A b1: B a h: P a b1 b2: B a p: P a b2
in_class (RelClassEquiv a)
(class_of (RelClassEquiv a) b1) b2
byapply equiv_iff_hprop.Defined.Local Definitionchoose (i : forallx, hexists (P x)) (a : A)
: B a / RelClassEquiv a
:= (prechoose i a).1.Endchoose_has_quotient_choice.(** The following section derives [HasTrChoice 0 A] from [HasQuotientChoice A]. *)Sectionhas_tr0_choice_quotientchoice.Context `{Funext} (A : Type) (qch : HasQuotientChoice A).Local DefinitionRelUnit (B : A -> Type) (a : A) (b1b2 : B a) : HProp
:= Build_HProp Unit.
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
Reflexive (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
Reflexive (funb1b2 : B a => RelUnit B a b1 b2)
done.Qed.
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
Symmetric (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
Symmetric (funb1b2 : B a => RelUnit B a b1 b2)
done.Qed.
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
Transitive (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
Transitive (funb1b2 : B a => RelUnit B a b1 b2)
done.Qed.
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
IsHProp (B a / (funb1b2 : B a => RelUnit B a b1 b2))
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
IsHProp (B a / (funb1b2 : B a => RelUnit B a b1 b2))
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
forallxy : B a / (funb1b2 : B a => RelUnit B a b1 b2),
x = y
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A
forall (a0 : B a)
(y : B a / (funb1b2 : B a => RelUnit B a b1 b2)),
class_of (funb1b2 : B a => RelUnit B a b1 b2) a0 = y
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A r: B a
forally : B a / (funb1b2 : B a => RelUnit B a b1 b2),
class_of (funb1b2 : B a => RelUnit B a b1 b2) r = y
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A r: B a
foralla0 : B a,
class_of (funb1b2 : B a => RelUnit B a b1 b2) r =
class_of (funb1b2 : B a => RelUnit B a b1 b2) a0
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type a: A r, s: B a
class_of (funb1b2 : B a => RelUnit B a b1 b2) r =
class_of (funb1b2 : B a => RelUnit B a b1 b2) s
byapply qglue.Qed.
H: Funext A: Type qch: HasQuotientChoice A
HasTrChoice 0 A
H: Funext A: Type qch: HasQuotientChoice A
HasTrChoice 0 A
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) f: forallx : A, merely (B x)
merely (forallx : A, B x)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) f: forallx : A, merely (B x)
foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) f: forallx : A, merely (B x) g:= ?Goal: foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2)
merely (forallx : A, B x)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) f: forallx : A, merely (B x)
foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) f: forallx : A, merely (B x) a: A
B a / (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) a: A f: merely (B a)
B a / (funb1b2 : B a => RelUnit B a b1 b2)
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) a: A f: B a
B a / (funb1b2 : B a => RelUnit B a b1 b2)
exact (class_of _ f).
H: Funext A: Type qch: HasQuotientChoice A B: A -> Type sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) f: forallx : A, merely (B x) g:= funa : A =>
letf := f a in
Trunc_ind
(fun_ : Trunc (-1) (B a) =>
B a / (funb1b2 : B a => RelUnit B a b1 b2))
(funf0 : B a =>
class_of (funb1b2 : B a => RelUnit B a b1 b2)
f0) f: foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2)
merely (forallx : A, B x)
H: Funext A: Type B: A -> Type f: forallx : A, merely (B x) g:= funa : A =>
letf := f a in
Trunc_ind
(fun_ : Trunc (-1) (B a) =>
B a / (funb1b2 : B a => RelUnit B a b1 b2))
(funf0 : B a =>
class_of (funb1b2 : B a => RelUnit B a b1 b2)
f0) f: foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2) qch: hexists
(fung0 : forallx : A, B x =>
forallx : A,
class_of
((fun (a : A) (b1b2 : B a) => trunctype_type (RelUnit B a b1 b2)) x)
(g0 x) = g x) sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x)
merely (forallx : A, B x)
H: Funext A: Type B: A -> Type f: forallx : A, merely (B x) g:= funa : A =>
letf := f a in
Trunc_ind
(fun_ : Trunc (-1) (B a) =>
B a / (funb1b2 : B a => RelUnit B a b1 b2))
(funf0 : B a =>
class_of (funb1b2 : B a => RelUnit B a b1 b2)
f0) f: foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2) sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) qch: {g0 : forallx : A, B x &
forallx : A, class_of (funb1b2 : B x => RelUnit B x b1 b2) (g0 x) = g x}
merely (forallx : A, B x)
H: Funext A: Type B: A -> Type f: forallx : A, merely (B x) g:= funa : A =>
letf := f a in
Trunc_ind
(fun_ : Trunc (-1) (B a) =>
B a / (funb1b2 : B a => RelUnit B a b1 b2))
(funf0 : B a =>
class_of (funb1b2 : B a => RelUnit B a b1 b2)
f0) f: foralla : A,
B a / (funb1b2 : B a => RelUnit B a b1 b2) sB: forallx : A,
ReflectiveSubuniverse.In (Tr 0) (B x) qch: {g0 : forallx : A, B x &
forallx : A, class_of (funb1b2 : B x => RelUnit B x b1 b2) (g0 x) = g x}
forallx : A, B x
apply qch.Qed.Endhas_tr0_choice_quotientchoice.
A: Type
HasTrChoice 0 A -> HasQuotientChoice A
A: Type
HasTrChoice 0 A -> HasQuotientChoice A
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x
hexists
(fung : forallx : A, B x =>
forallx : A, class_of (R x) (g x) = f x)
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type
hexists
(fung : forallx : A, B x =>
forallx : A, class_of (R x) (g x) = f x)
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type
foralla : A, merely {b : B a & P a b}
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a)
hexists
(fung : forallx : A, B x =>
forallx : A, class_of (R x) (g x) = f x)
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type
foralla : A, merely {b : B a & P a b}
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type a: A
merely {b : B a & P a b}
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type a: A
foralla0 : B a,
merely
{b : B a & class_of (R a) b = class_of (R a) a0}
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type a: A b: B a
merely
{b0 : B a & class_of (R a) b0 = class_of (R a) b}
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type a: A b: B a
{b0 : B a & class_of (R a) b0 = class_of (R a) b}
byexistsb.
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a)
hexists
(fung : forallx : A, B x =>
forallx : A, class_of (R x) (g x) = f x)
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a) h: merely
(forallx : A,
(funa : A => {b : B a & P a b}) x)
hexists
(fung : forallx : A, B x =>
forallx : A, class_of (R x) (g x) = f x)
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a) h: forallx : A, {b : B x & P x b}
hexists
(fung : forallx : A, B x =>
forallx : A, class_of (R x) (g x) = f x)
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a) h: forallx : A, {b : B x & P x b}
{g : forallx : A, B x &
forallx : A, class_of (R x) (g x) = f x}
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a) h: forallx : A, {b : B x & P x b}
forallx : A, class_of (R x) (h x).1 = f x
A: Type ch: HasTrChoice 0 A B: A -> Type sB: forallx : A, IsHSet (B x) R: forallx : A, Relation (B x) pR: forall (x : A) (x0y : B x), IsHProp (R x x0 y) rR: forallx : A, Reflexive (R x) sR: forallx : A, Symmetric (R x) tR: forallx : A, Transitive (R x) f: forallx : A, B x / R x P:= fun (a : A) (b : B a) => class_of (R a) b = f a: foralla : A, B a -> Type g: foralla : A,
merely ((funx : A => {b : B x & P x b}) a) h: forallx : A, {b : B x & P x b} a: A
class_of (R a) (h a).1 = f a
apply h.Qed.
H: Funext A: Type
IsEquiv (has_quotient_choice_tr0choice A)
H: Funext A: Type
IsEquiv (has_quotient_choice_tr0choice A)
H: Funext A: Type
IsHProp (HasTrChoice 0 A)
H: Funext A: Type
HasQuotientChoice A -> HasTrChoice 0 A
H: Funext A: Type
IsHProp (HasTrChoice 0 A)
exact istrunc_forall.
H: Funext A: Type
HasQuotientChoice A -> HasTrChoice 0 A
apply has_tr0_choice_quotientchoice.Qed.Definitionequiv_has_tr0_choice_has_quotient_choice
`{Funext} (A : Type)
: HasTrChoice 0 A <~> HasQuotientChoice A
:= Build_Equiv _ _ (has_quotient_choice_tr0choice A) _.(** The next section uses [has_quotient_choice_tr0choice] to generalize [quotient_rec2], see [choose_quotient_ind] below. *)Sectionchoose_quotient_ind.Context `{Univalence}
{I : Type} `{!HasTrChoice 0 I}
{A : I -> Type} `{!foralli, IsHSet (A i)}
(R : foralli, Relation (A i))
`{!foralli, is_mere_relation (A i) (R i)}
{rR : foralli, Reflexive (R i)}
{sR : foralli, Symmetric (R i)}
{tR : foralli, Transitive (R i)}.(** First generalize the [qglue] constructor. *)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) f, g: foralli : I, A i r: foralli : I, R i (f i) (g i)
(funi : I => class_of (R i) (f i)) =
(funi : I => class_of (R i) (g i))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) f, g: foralli : I, A i r: foralli : I, R i (f i) (g i)
(funi : I => class_of (R i) (f i)) =
(funi : I => class_of (R i) (g i))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) f, g: foralli : I, A i r: foralli : I, R i (f i) (g i) s: I
class_of (R s) (f s) = class_of (R s) (g s)
byapply qglue.Defined.(** Given suitable preconditions, we will show that [ChooseProp P a g] is inhabited, rather than directly giving an inhabitant of [P g]. This turns out to be beneficial because [ChooseProp P a g] is a proposition. *)Local DefinitionChooseProp
(P : (foralli, A i / R i) -> Type) `{!forallg, IsHSet (P g)}
(a : forall (f : foralli, A i), P (funi => class_of (R i) (f i)))
(g : foralli, A i / R i)
: Type
:= {b : P g
| merely (exists (f : foralli, A i)
(q : g = funi => class_of (R i) (f i)),
forall (f' : foralli, A i)
(r : foralli, R i (f i) (f' i)),
qglue_forall f f' r # q # b = a f')}.
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i
IsHProp (ChooseProp P a g)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i
IsHProp (ChooseProp P a g)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i
forallxy : P g,
merely
{f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (transport P q x) =
a f'}} ->
merely
{f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (transport P q y) =
a f'}} -> x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g h1: merely
{f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q x) =
a f'}} h2: merely
{f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) =
a f'}}
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g h2: {f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) =
a f'}} h1: {f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q x) =
a f'}}
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g h2: {f : foralli : I, A i &
{q : g = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) =
a f'}} f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) p1: forall (f' : foralli : I, A i)
(r : foralli : I, R i (f1 i) (f' i)),
transport P (qglue_forall f1 f' r)
(transport P q1 x) =
a f'
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) p2: forall (f' : foralli : I, A i)
(r : foralli : I, R i (f2 i) (f' i)),
transport P (qglue_forall f2 f' r)
(transport P q2 y) =
a f' f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) p1: forall (f' : foralli : I, A i)
(r : foralli : I, R i (f1 i) (f' i)),
transport P (qglue_forall f1 f' r)
(transport P q1 x) =
a f'
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) p2: forall (f' : foralli : I, A i)
(r : foralli : I, R i (f2 i) (f' i)),
transport P (qglue_forall f2 f' r)
(transport P q2 y) =
a f' f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) p1: transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))
(transport P q1 x) =
a f1
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) p2: forall (f' : foralli : I, A i)
(r : foralli : I, R i (f2 i) (f' i)),
transport P (qglue_forall f2 f' r)
(transport P q2 y) =
a f' f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) p1: transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))
(transport P q1 x) =
a f1 pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i)
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: transport P (qglue_forall f2 f1 pR)
(transport P q2 y) =
a f1 p1: transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))
(transport P q1 x) =
a f1
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: transport P (qglue_forall f2 f1 pR)
(transport P q2 y) =
a f1 p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
x = y
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
transport P q1^
(transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))^
(a f1)) =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))^
(a f1) =
transport P (q1^)^
(transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))^
(a f1) =
transport P q1
(transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))^
(a f1) =
transport P (q2^ @ q1)
(transport P (qglue_forall f2 f1 pR)^ (a f1))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
a f1 =
transport P
((qglue_forall f1 f1 (funi : I => rR i (f1 i)))^)^
(transport P (q2^ @ q1)
(transport P (qglue_forall f2 f1 pR)^ (a f1)))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
a f1 =
transport P
(qglue_forall f1 f1 (funi : I => rR i (f1 i)))
(transport P (q2^ @ q1)
(transport P (qglue_forall f2 f1 pR)^ (a f1)))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1))
a f1 =
transport P
((qglue_forall f2 f1 pR)^ @
((q2^ @ q1) @
qglue_forall f1 f1 (funi : I => rR i (f1 i))))
(a f1)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i x, y: P g f2: foralli : I, A i q2: g = (funi : I => class_of (R i) (f2 i)) f1: foralli : I, A i q1: g = (funi : I => class_of (R i) (f1 i)) pR:= funi : I =>
related_quotient_paths
(R i) (f2 i) (f1 i)
(ap (funh : forallx0 : I, A x0 / R x0 => h i)
q2^ @
ap (funh : forallx0 : I, A x0 / R x0 => h i)
q1): foralli : I, R i (f2 i) (f1 i) p2: y =
transport P q2^
(transport P (qglue_forall f2 f1 pR)^ (a f1)) p1: x =
transport P q1^
(transport P
(qglue_forall f1 f1
(funi : I => rR i (f1 i)))^
(a f1)) pa:= (qglue_forall f2 f1 pR)^ @
((q2^ @ q1) @
qglue_forall f1 f1 (funi : I => rR i (f1 i))): (funi : I => class_of (R i) (f1 i)) =
(funi : I => class_of (R i) (f1 i))
a f1 = transport P pa (a f1)
byinduction (hset_path2 idpath pa).Qed.(* Since [ChooseProp P a g] is a proposition, we can apply [has_quotient_choice_tr0choice] and strip its truncation in order to derive [ChooseProp P a g]. *)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i
ChooseProp P a g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i
ChooseProp P a g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: hexists
(fung0 : forallx : I, A x =>
forallx : I, class_of (R x) (g0 x) = g x)
ChooseProp P a g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: {g0 : forallx : I, A x &
forallx : I, class_of (R x) (g0 x) = g x}
ChooseProp P a g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: forallx : I, class_of (R x) (h x) = g x
ChooseProp P a g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: (funx : I => class_of (R x) (h x)) = g
ChooseProp P a g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: (funx : I => class_of (R x) (h x)) = g
ChooseProp P a (funx : I => class_of (R x) (h x))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: (funx : I => class_of (R x) (h x)) = g
merely
{f : foralli : I, A i &
{q
: (funx : I => class_of (R x) (h x)) =
(funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q (a h)) = a f'}}
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: (funx : I => class_of (R x) (h x)) = g
{f : foralli : I, A i &
{q
: (funx : I => class_of (R x) (h x)) =
(funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q (a h)) = a f'}}
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: (funx : I => class_of (R x) (h x)) = g
{q
: (funx : I => class_of (R x) (h x)) =
(funi : I => class_of (R i) (h i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (h i) (f' i)),
transport P (qglue_forall h f' r)
(transport P q (a h)) = a f'}
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i h: forallx : I, A x p: (funx : I => class_of (R x) (h x)) = g
forall (f' : foralli : I, A i)
(r : foralli : I, R i (h i) (f' i)),
transport P (qglue_forall h f' r)
(transport P 1 (a h)) = a f'
apply E.Defined.(** By projecting out of [chooseprop_quotient_ind] we obtain a generalization of [quotient_rec2]. *)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i
P g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' g: foralli : I, A i / R i
P g
exact (chooseprop_quotient_ind P a E g).1.Defined.(** A specialization of [choose_quotient_ind] to the case where [P g] is a proposition. *)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHProp (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i
P g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHProp (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i
P g
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHProp (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i
forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f'
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHProp (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) g: foralli : I, A i / R i f, f': foralli : I, A i r: foralli : I, R i (f i) (f' i)
transport P (qglue_forall f f' r) (a f) = a f'
apply path_ishprop.Defined.(** The recursion principle derived from [choose_quotient_ind]. *)Definitionchoose_quotient_rec
{B : Type} `{!IsHSet B} (a : (foralli, A i) -> B)
(E : forall (ff' : foralli, A i),
(foralli, R i (f i) (f' i)) -> a f = a f')
(g : foralli, A i / R i)
: B
:= choose_quotient_ind (fun_ => B) a
(funff'r => transport_const _ _ @ E f f' r) g.(** The "beta-rule" of [choose_quotient_ind]. *)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f: foralli : I, A i
choose_quotient_ind P a E
(funi : I => class_of (R i) (f i)) = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f: foralli : I, A i
choose_quotient_ind P a E
(funi : I => class_of (R i) (f i)) = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f: foralli : I, A i
foralla0 : {g : forallx : I, A x &
forallx : I,
class_of (R x) (g x) = class_of (R x) (f x)},
(Trunc_ind
(fun_ : Trunc (-1)
{g : forallx : I, A x &
forallx : I,
class_of (R x) (g x) =
class_of (R x) (f x)} =>
ChooseProp P a (funi : I => class_of (R i) (f i)))
(funh : {g : forallx : I, A x &
forallx : I,
class_of (R x) (g x) = class_of (R x) (f x)}
=>
transport (ChooseProp P a)
(path_forall
(funx : I => class_of (R x) (h.1 x))
(funi : I => class_of (R i) (f i)) h.2)
(a h.1; tr (h.1; 1; E h.1))) (tr a0)).1 = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f: foralli : I, A i
foralla0 : {g : forallx : I, A x &
forallx : I,
class_of (R x) (g x) = class_of (R x) (f x)},
(transport (ChooseProp P a)
(path_forall (funx : I => class_of (R x) (a0.1 x))
(funi : I => class_of (R i) (f i)) a0.2)
(a a0.1; tr (a0.1; 1; E a0.1))).1 = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x)
(transport (ChooseProp P a)
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f'))).1 = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x)
(transport P
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1;
transportD P
(fun (x : forallx : I, A x / R x) (y : P x) =>
merely
{f : foralli : I, A i &
{q : x = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) = a f'}})
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1
(a f'; tr (f'; 1; E f')).2).1 = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x)
(transport P
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1;
transportD P
(fun (x : forallx : I, A x / R x) (y : P x) =>
merely
{f : foralli : I, A i &
{q : x = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) = a f'}})
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1
(a f'; tr (f'; 1; E f')).2).1 = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x)
p = (funi : I => qglue (p' i))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x) pE: p = (funi : I => qglue (p' i))
(transport P
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1;
transportD P
(fun (x : forallx : I, A x / R x) (y : P x) =>
merely
{f : foralli : I, A i &
{q : x = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) =
a f'}})
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1
(a f'; tr (f'; 1; E f')).2).1 =
a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x)
p = (funi : I => qglue (p' i))
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x) x: I
p x = qglue (p' x)
apply hset_path2.
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x) pE: p = (funi : I => qglue (p' i))
(transport P
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1;
transportD P
(fun (x : forallx : I, A x / R x) (y : P x) =>
merely
{f : foralli : I, A i &
{q : x = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) = a f'}})
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i)) p)
(a f'; tr (f'; 1; E f')).1
(a f'; tr (f'; 1; E f')).2).1 = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) P: (foralli : I, A i / R i) -> Type H2: forallg : foralli : I, A i / R i, IsHSet (P g) a: forallf : foralli : I, A i,
P (funi : I => class_of (R i) (f i)) E: forall (ff' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r) (a f) = a f' f, f': forallx : I, A x p: forallx : I,
class_of (R x) (f' x) = class_of (R x) (f x) p':= funx : I =>
related_quotient_paths (R x) (f' x) (f x) (p x): forallx : I, R x (f' x) (f x) pE: p = (funi : I => qglue (p' i))
(transport P
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i))
(funi : I => qglue (p' i)))
(a f'; tr (f'; 1; E f')).1;
transportD P
(fun (x : forallx : I, A x / R x) (y : P x) =>
merely
{f : foralli : I, A i &
{q : x = (funi : I => class_of (R i) (f i)) &
forall (f' : foralli : I, A i)
(r : foralli : I, R i (f i) (f' i)),
transport P (qglue_forall f f' r)
(transport P q y) = a f'}})
(path_forall (funx : I => class_of (R x) (f' x))
(funi : I => class_of (R i) (f i))
(funi : I => qglue (p' i)))
(a f'; tr (f'; 1; E f')).1
(a f'; tr (f'; 1; E f')).2).1 = a f
apply E.Qed.(** The "beta-rule" of [choose_quotient_rec]. *)
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) B: Type IsHSet0: IsHSet B a: (foralli : I, A i) -> B E: forallff' : foralli : I, A i,
(foralli : I, R i (f i) (f' i)) -> a f = a f' f: foralli : I, A i
choose_quotient_rec a E
(funi : I => class_of (R i) (f i)) = a f
H: Univalence I: Type HasTrChoice0: HasTrChoice 0 I A: I -> Type H0: foralli : I, IsHSet (A i) R: foralli : I, Relation (A i) H1: forall (i : I) (xy : A i), IsHProp (R i x y) rR: foralli : I, Reflexive (R i) sR: foralli : I, Symmetric (R i) tR: foralli : I, Transitive (R i) B: Type IsHSet0: IsHSet B a: (foralli : I, A i) -> B E: forallff' : foralli : I, A i,
(foralli : I, R i (f i) (f' i)) -> a f = a f' f: foralli : I, A i
choose_quotient_rec a E
(funi : I => class_of (R i) (f i)) = a f