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]
Require Import Types.Require Import HSet.Require Import TruncType.Require Import Colimits.GraphQuotient.Require Import Truncations.Core.Set Universe Minimization ToSet.LocalOpen Scope path_scope.(** * The set-quotient of a type by a relationWe aim to model:<<Inductive Quotient R : Type := | class_of R : A -> Quotient R | qglue : forall x y, (R x y) -> class_of R x = class_of R y | ishset_quotient : IsHSet (Quotient R)>>We do this by defining the quotient as a 0-truncated graph quotient. Some results require additional assumptions, for example, that the relation be hprop-valued, or that the relation be reflexive, transitive or symmetric.Throughout this file [a], [b] and [c] are elements of [A], [R] is a relation on [A], [x], [y] and [z] are elements of [Quotient R], [p] is a proof of [R a b].*)DefinitionQuotient@{i j k} {A : Type@{i}} (R : Relation@{i j} A) : Type@{k}
:= Trunc@{k} 0 (GraphQuotient@{i j k} R).Definitionclass_of@{i j k} {A : Type@{i}} (R : Relation@{i j} A)
: A -> Quotient@{i j k} R := tr o gq.Definitionqglue@{i j k} {A : Type@{i}} {R : Relation@{i j} A} {a b : A}
: R a b -> class_of@{i j k} R a = class_of R b
:= funp => ap tr (gqglue p).Instanceishset_quotient {A : Type} (R : Relation A)
: IsHSet (Quotient R) := _.
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b
forallx : Quotient R, P x
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b
forallx : Quotient R, P x
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b
foralla : A,
(funx : GraphQuotient R => P (tr x)) (gq a)
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b
forall (ab : A) (s : R a b),
transport (funx : GraphQuotient R => P (tr x))
(gqglue s) (?gq' a) =
?gq' b
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b
foralla : A,
(funx : GraphQuotient R => P (tr x)) (gq a)
exact pclass.
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b
forall (ab : A) (s : R a b),
transport (funx : GraphQuotient R => P (tr x))
(gqglue s) (pclass a) = pclass b
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
transport (funx : GraphQuotient R => P (tr x))
(gqglue p) (pclass a) = pclass b
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
transport P (ap tr (gqglue p)) (pclass a) = pclass b
exact (peq a b p).Defined.
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
apD (Quotient_ind R P pclass peq) (qglue p) =
peq a b p
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
apD (Quotient_ind R P pclass peq) (qglue p) =
peq a b p
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
(transport_compose P tr (gqglue p)
(Quotient_ind R P pclass peq (tr (gq a))))^ @
apD
(funx : GraphQuotient R =>
Quotient_ind R P pclass peq (tr x)) (gqglue p) =
peq a b p
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
(transport_compose P tr (gqglue p)
(Trunc_ind P
(GraphQuotient_ind
(funx : GraphQuotient R => P (tr x)) pclass
(fun (ab : A) (p : R a b) =>
transport_compose P tr (gqglue p) (pclass a) @
peq a b p)) (tr (gq a))))^ @
apD
(funx : GraphQuotient R =>
Trunc_ind P
(GraphQuotient_ind
(funx0 : GraphQuotient R => P (tr x0)) pclass
(fun (ab : A) (p : R a b) =>
transport_compose P tr (gqglue p) (pclass a) @
peq a b p)) (tr x)) (gqglue p) = peq a b p
A: Type R: Relation A P: Quotient R -> Type sP: forallx : Quotient R, IsHSet (P x) pclass: foralla : A, P (class_of R a) peq: forall (ab : A) (H : R a b),
transport P (qglue H) (pclass a) = pclass b a, b: A p: R a b
(transport_compose P tr (gqglue p)
(Trunc_ind P
(GraphQuotient_ind
(funx : GraphQuotient R => P (tr x)) pclass
(fun (ab : A) (p : R a b) =>
transport_compose P tr (gqglue p) (pclass a) @
peq a b p)) (tr (gq a))))^ @
(transport_compose P tr (gqglue p) (pclass a) @
peq a b p) = peq a b p
rapply concat_V_pp.Defined.
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b
Quotient R -> P
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b
Quotient R -> P
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b
A -> P
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b
forallab : A, R a b -> ?c a = ?c b
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b
A -> P
exact pclass.
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b
forallab : A, R a b -> pclass a = pclass b
exact peq.Defined.
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b a, b: A p: R a b
ap (Quotient_rec R P pclass peq) (qglue p) = peq a b p
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b a, b: A p: R a b
ap (Quotient_rec R P pclass peq) (qglue p) = peq a b p
A: Type R: Relation A P: Type IsHSet0: IsHSet P pclass: A -> P peq: forallab : A, R a b -> pclass a = pclass b a, b: A p: R a b
ap
(funx : GraphQuotient R =>
Quotient_rec R P pclass peq (tr x)) (gqglue p) =
peq a b p
A: Type R: Relation A P: A / R -> Type H: forallx : A / R, IsHProp (P x) dclass: foralla : A, P (class_of R a)
forallx : A / R, P x
A: Type R: Relation A P: A / R -> Type H: forallx : A / R, IsHProp (P x) dclass: foralla : A, P (class_of R a)
forallx : A / R, P x
A: Type R: Relation A P: A / R -> Type H: forallx : A / R, IsHProp (P x) dclass: foralla : A, P (class_of R a)
forall (ab : A) (H : R a b),
transport P (qglue H) (dclass a) = dclass b
intros x y p; apply path_ishprop.Defined.
A: Type R: Relation A P: A / R -> A / R -> Type H: is_mere_relation (A / R) P dclass: forallab : A,
P (class_of R a) (class_of R b)
forallxy : A / R, P x y
A: Type R: Relation A P: A / R -> A / R -> Type H: is_mere_relation (A / R) P dclass: forallab : A,
P (class_of R a) (class_of R b)
forallxy : A / R, P x y
A: Type R: Relation A P: A / R -> A / R -> Type H: is_mere_relation (A / R) P dclass: forallab : A,
P (class_of R a) (class_of R b) x: A / R b: A
P x (class_of R b)
A: Type R: Relation A P: A / R -> A / R -> Type H: is_mere_relation (A / R) P dclass: forallab : A,
P (class_of R a) (class_of R b) b, a: A
(funx : A / R => P x (class_of R b)) (class_of R a)
exact (dclass a b).Defined.
A: Type R: Relation A P: A / R -> A / R -> A / R -> Type H: forallxyz : A / R, IsHProp (P x y z) dclass: forallabc : A,
P (class_of R a) (class_of R b)
(class_of R c)
forallxyz : A / R, P x y z
A: Type R: Relation A P: A / R -> A / R -> A / R -> Type H: forallxyz : A / R, IsHProp (P x y z) dclass: forallabc : A,
P (class_of R a) (class_of R b)
(class_of R c)
forallxyz : A / R, P x y z
A: Type R: Relation A P: A / R -> A / R -> A / R -> Type H: forallxyz : A / R, IsHProp (P x y z) dclass: forallabc : A,
P (class_of R a) (class_of R b)
(class_of R c) x: A / R b, c: A
P x (class_of R b) (class_of R c)
A: Type R: Relation A P: A / R -> A / R -> A / R -> Type H: forallxyz : A / R, IsHProp (P x y z) dclass: forallabc : A,
P (class_of R a) (class_of R b)
(class_of R c) b, c, a: A
(funx : A / R => P x (class_of R b) (class_of R c))
(class_of R a)
exact (dclass a b c).Defined.
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b'
forallxy : A / R, P x y
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b'
forallxy : A / R, P x y
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R
forally : A / R, P x y
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R
foralla : A, P x (class_of R a)
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R
forall (ab : A) (H0 : R a b),
transport (P x) (qglue H0) (?pclass a) = ?pclass b
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R
foralla : A, P x (class_of R a)
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R b: A
P x (class_of R b)
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b: A
forallx : A / R, P x (class_of R b)
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b: A
foralla : A,
(funx : A / R => P x (class_of R b)) (class_of R a)
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b: A
forall (ab0 : A) (H0 : R a b0),
transport (funx : A / R => P x (class_of R b))
(qglue H0) (?pclass a) =
?pclass b0
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b: A
foralla : A,
(funx : A / R => P x (class_of R b)) (class_of R a)
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b, a: A
(funx : A / R => P x (class_of R b)) (class_of R a)
exact (dclass a b).
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b: A
forall (ab0 : A) (H : R a b0),
transport (funx : A / R => P x (class_of R b))
(qglue H) ((funa0 : A => dclass a0 b) a) =
(funa0 : A => dclass a0 b) b0
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b: A
forall (ab0 : A) (H : R a b0),
transport (funx : A / R => P x (class_of R b))
(qglue H) (dclass a b) = dclass b0 b
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b, a, a': A p: R a a'
transport (funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) = dclass a' b
byapply dequiv_l.
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R
forall (ab : A) (H0 : R a b),
transport (P x) (qglue H0)
((funb0 : A =>
Quotient_ind R
(funx : A / R => P x (class_of R b0))
(funa0 : A => dclass a0 b0)
((fun (a0a' : A) (p : R a0 a') =>
dequiv_l a0 a' b0 p)
:
forall (a0b1 : A) (H : R a0 b1),
transport
(funx : A / R => P x (class_of R b0))
(qglue H) ((funa1 : A => dclass a1 b0) a0) =
(funa1 : A => dclass a1 b0) b1) x) a) =
(funb0 : A =>
Quotient_ind R (funx : A / R => P x (class_of R b0))
(funa0 : A => dclass a0 b0)
((fun (a0a' : A) (p : R a0 a') =>
dequiv_l a0 a' b0 p)
:
forall (a0b1 : A) (H : R a0 b1),
transport (funx : A / R => P x (class_of R b0))
(qglue H) ((funa1 : A => dclass a1 b0) a0) =
(funa1 : A => dclass a1 b0) b1) x) b
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R
forall (ab : A) (H0 : R a b),
transport (P x) (qglue H0)
(Quotient_ind R
(funx : A / R => P x (class_of R a))
(funa0 : A => dclass a0 a)
(fun (a0a' : A) (p : R a0 a') =>
dequiv_l a0 a' a p) x) =
Quotient_ind R (funx : A / R => P x (class_of R b))
(funa0 : A => dclass a0 b)
(fun (a0a' : A) (p : R a0 a') => dequiv_l a0 a' b p)
x
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' x: A / R b, b': A p: R b b'
transport (P x) (qglue p)
(Quotient_ind R
(funx : A / R => P x (class_of R b))
(funa : A => dclass a b)
(fun (aa' : A) (p : R a a') => dequiv_l a a' b p)
x) =
Quotient_ind R (funx : A / R => P x (class_of R b'))
(funa : A => dclass a b')
(fun (aa' : A) (p : R a a') => dequiv_l a a' b' p)
x
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b, b': A p: R b b'
forallx : A / R,
transport (P x) (qglue p)
(Quotient_ind R
(funx0 : A / R => P x0 (class_of R b))
(funa : A => dclass a b)
(fun (aa' : A) (p : R a a') => dequiv_l a a' b p)
x) =
Quotient_ind R
(funx0 : A / R => P x0 (class_of R b'))
(funa : A => dclass a b')
(fun (aa' : A) (p : R a a') => dequiv_l a a' b' p)
x
A: Type R: Relation A P: A / R -> A / R -> Type H: forallxy : A / R, IsHSet (P x y) dclass: forallab : A,
P (class_of R a) (class_of R b) dequiv_l: forall (aa'b : A) (p : R a a'),
transport
(funx : A / R => P x (class_of R b))
(qglue p) (dclass a b) =
dclass a' b dequiv_r: forall (abb' : A) (p : R b b'),
transport (P (class_of R a))
(qglue p) (dclass a b) =
dclass a b' b, b': A p: R b b'
foralla : A,
transport (P (class_of R a)) (qglue p) (dclass a b) =
dclass a b'
intro a; byapply dequiv_r.Defined.
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
A / R -> A / R -> B
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
A / R -> A / R -> B
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
forallab : A,
(fun__ : A / R => B) (class_of R a) (class_of R b)
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
forall (aa'b : A) (p : R a a'),
transport
(funx : A / R =>
(fun__ : A / R => B) x (class_of R b))
(qglue p) (?dclass a b) =
?dclass a' b
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
forall (abb' : A) (p : R b b'),
transport ((fun__ : A / R => B) (class_of R a))
(qglue p) (?dclass a b) =
?dclass a b'
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
forallab : A,
(fun__ : A / R => B) (class_of R a) (class_of R b)
exact dclass.
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
forall (aa'b : A) (p : R a a'),
transport
(funx : A / R =>
(fun__ : A / R => B) x (class_of R b)) (qglue p)
(dclass a b) = dclass a' b
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b' a, a', b: A p: R a a'
dclass a b = dclass a' b
byapply dequiv_l.
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b'
forall (abb' : A) (p : R b b'),
transport ((fun__ : A / R => B) (class_of R a))
(qglue p) (dclass a b) = dclass a b'
A: Type R: Relation A B: Type IsHSet0: IsHSet B dclass: A -> A -> B dequiv_l: forallaa'b : A,
R a a' -> dclass a b = dclass a' b dequiv_r: forallabb' : A,
R b b' -> dclass a b = dclass a b' a, b, b': A p: R b b'
dclass a b = dclass a b'
byapply dequiv_r.Defined.SectionEquiv.Context `{Univalence} {A : Type} (R : Relation A) `{is_mere_relation _ R}
`{Transitive _ R} `{Symmetric _ R} `{Reflexive _ R}.(** The proposition of being in a given class in a quotient. This requires [Univalence] so that we know that [HProp] is a set. *)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
A / R -> A -> HProp
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
A / R -> A -> HProp
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b: A
A / R -> HProp
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b: A
A -> HProp
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b: A
forallab0 : A, R a b0 -> ?pclass a = ?pclass b0
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b: A
forallab0 : A,
R a b0 ->
(funa0 : A => Build_HProp (R a0 b)) a =
(funa0 : A => Build_HProp (R a0 b)) b0
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b, a, c: A p: R a c
Build_HProp (R a b) = Build_HProp (R c b)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b, a, c: A p: R a c
Build_HProp (R a b) <~> Build_HProp (R c b)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b, a, c: A p: R a c
R a b -> R c b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b, a, c: A p: R a c
R c b -> R a b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R b, a, c: A p: R a c
R c b -> R a b
exact (transitivity p).Defined.(** Being in a class is decidable if the relation is decidable. *)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R H3: forallab : A, Decidable (R a b)
forall (x : A / R) (a : A), Decidable (in_class x a)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R H3: forallab : A, Decidable (R a b)
forall (x : A / R) (a : A), Decidable (in_class x a)
by srapply Quotient_ind_hprop.Defined.(** If [a] is in a class [x], then the class of [a] is equal to [x]. *)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
forall (x : A / R) (a : A),
in_class x a -> x = class_of R a
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
forall (x : A / R) (a : A),
in_class x a -> x = class_of R a
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
foralla : A,
(funx : A / R =>
foralla0 : A, in_class x a0 -> x = class_of R a0)
(class_of R a)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
forall (ab : A) (H3 : R a b),
transport
(funx : A / R =>
foralla0 : A, in_class x a0 -> x = class_of R a0)
(qglue H3) (?pclass a) =
?pclass b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
foralla : A,
(funx : A / R =>
foralla0 : A, in_class x a0 -> x = class_of R a0)
(class_of R a)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A p: in_class (class_of R a) b
class_of R a = class_of R b
exact (qglue p).
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
forall (ab : A) (H : R a b),
transport
(funx : A / R =>
foralla0 : A, in_class x a0 -> x = class_of R a0)
(qglue H)
((funa0 : A =>
(fun (b0 : A) (p : in_class (class_of R a0) b0) =>
qglue p)
:
(funx : A / R =>
foralla1 : A, in_class x a1 -> x = class_of R a1)
(class_of R a0)) a) =
(funa0 : A =>
(fun (b0 : A) (p : in_class (class_of R a0) b0) =>
qglue p)
:
(funx : A / R =>
foralla1 : A, in_class x a1 -> x = class_of R a1)
(class_of R a0)) b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A p: R a b
transport
(funx : A / R =>
foralla : A, in_class x a -> x = class_of R a)
(qglue p)
((funa : A =>
(fun (b : A) (p : in_class (class_of R a) b) =>
qglue p)
:
(funx : A / R =>
foralla0 : A, in_class x a0 -> x = class_of R a0)
(class_of R a)) a) =
(funa : A =>
(fun (b : A) (p : in_class (class_of R a) b) =>
qglue p)
:
(funx : A / R =>
foralla0 : A, in_class x a0 -> x = class_of R a0)
(class_of R a)) b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A p: R a b x: A x0: in_class (class_of R b) x
transport
(funx : A / R =>
foralla : A, in_class x a -> x = class_of R a)
(qglue p)
(fun (b : A) (p : in_class (class_of R a) b) =>
qglue p) x x0 = qglue x0
apply hset_path2.Defined.
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
class_of R a = class_of R b -> R a b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
class_of R a = class_of R b -> R a b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A p: class_of R a = class_of R b
R a b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A p: class_of R a = class_of R b
in_class (class_of R a) b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A p: class_of R b = class_of R b
in_class (class_of R b) b
cbv; reflexivity.Defined.(** Theorem 10.1.8. *)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
R a b <~> class_of R a = class_of R b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
R a b <~> class_of R a = class_of R b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
R a b -> class_of R a = class_of R b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
class_of R a = class_of R b -> R a b
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
R a b -> class_of R a = class_of R b
exact qglue.
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a, b: A
class_of R a = class_of R b -> R a b
apply related_quotient_paths.Defined.(** The map [class_of : A -> A/R] is a surjection. *)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
forallb : A / R, merely (hfiber (class_of R) b)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R
foralla : A,
(funx : A / R =>
trunctype_type (merely (hfiber (class_of R) x)))
(class_of R a)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a: A
(funx : A / R =>
trunctype_type (merely (hfiber (class_of R) x)))
(class_of R a)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R a: A
hfiber (class_of R) (class_of R a)
byexistsa.Defined.(** The universal property of the quotient. This is Lemma 6.10.3. *)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
(A / R -> B) <~>
{f : A -> B & forallab : A, R a b -> f a = f b}
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
(A / R -> B) <~>
{f : A -> B & forallab : A, R a b -> f a = f b}
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
(A / R -> B) ->
{f : A -> B & forallab : A, R a b -> f a = f b}
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
{f : A -> B & forallab : A, R a b -> f a = f b} ->
A / R -> B
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
?f o ?g == idmap
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
?g o ?f == idmap
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
(A / R -> B) ->
{f : A -> B & forallab : A, R a b -> f a = f b}
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A / R -> B
{f : A -> B & forallab : A, R a b -> f a = f b}
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A / R -> B
forallab : A,
R a b -> f (class_of R a) = f (class_of R b)
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A / R -> B a, b: A X: R a b
class_of R a = class_of R b
byapply qglue.
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
{f : A -> B & forallab : A, R a b -> f a = f b} ->
A / R -> B
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A -> B H': forallab : A, R a b -> f a = f b
A / R -> B
exact (Quotient_rec _ _ _ H').
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
(funf : A / R -> B =>
(funx : A => f (class_of R x);
fun (ab : A) (H : R a b) => ap11 1 (qglue H)))
o (funX : {f : A -> B &
forallab : A, R a b -> f a = f b} =>
(fun (f : A -> B)
(H' : forallab : A, R a b -> f a = f b) =>
Quotient_rec R B f H') X.1 X.2) == idmap
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A -> B Hf: forallab : A, R a b -> f a = f b
(funx : A => Quotient_rec R B f Hf (class_of R x);
fun (ab : A) (H : R a b) => ap11 1 (qglue H)) =
(f; Hf)
byapply equiv_path_sigma_hprop.
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B
(funX : {f : A -> B &
forallab : A, R a b -> f a = f b} =>
(fun (f : A -> B)
(H' : forallab : A, R a b -> f a = f b) =>
Quotient_rec R B f H') X.1 X.2)
o (funf : A / R -> B =>
(funx : A => f (class_of R x);
fun (ab : A) (H : R a b) => ap11 1 (qglue H))) ==
idmap
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A / R -> B
Quotient_rec R B (funx : A => f (class_of R x))
(fun (ab : A) (H : R a b) => ap11 1 (qglue H)) = f
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A / R -> B
Quotient_rec R B (funx : A => f (class_of R x))
(fun (ab : A) (H : R a b) => ap11 1 (qglue H)) == f
H: Univalence A: Type R: Relation A is_mere_relation0: is_mere_relation A R H0: Transitive R H1: Symmetric R H2: Reflexive R B: Type IsHSet0: IsHSet B f: A / R -> B
foralla : A,
(funx : A / R =>
Quotient_rec R B (funx0 : A => f (class_of R x0))
(fun (a0b : A) (H : R a0 b) => ap11 1 (qglue H)) x =
f x) (class_of R a)
reflexivity.Defined.(** TODO: The equivalence with VVquotient [A//R]. 10.1.10. Equivalence Relations are effective and there is an equivalence [A/R<~>A//R]. This will need propositional resizing if we don't want to raise the universe level.*)(** The theory of canonical quotients is developed by C.Cohen: http://perso.crans.org/cohen/work/quotients/ *)EndEquiv.SectionFunctoriality.(* TODO: Develop a notion of set with Relation and use that instead of manually adding Relation preserving conditions. *)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b -> S (f a) (f b)
A / R -> B / S
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b -> S (f a) (f b)
A / R -> B / S
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b -> S (f a) (f b)
forallab : A,
R a b -> class_of S (f a) = class_of S (f b)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b -> S (f a) (f b) a, b: A p: R a b
class_of S (f a) = class_of S (f b)
apply qglue, fresp, p.Defined.
A: Type R: Relation A
Quotient_functor R R idmap (funxy : A => idmap) ==
idmap
A: Type R: Relation A
Quotient_functor R R idmap (funxy : A => idmap) ==
idmap
by srapply Quotient_ind_hprop.Defined.
A: Type R: Relation A B: Type S: Relation B C: Type T: Relation C f: A -> B fresp: forallab : A, R a b -> S (f a) (f b) g: B -> C gresp: forallab : B, S a b -> T (g a) (g b)
Quotient_functor R T (g o f)
(funab : A => gresp (f a) (f b) o fresp a b) ==
Quotient_functor S T g gresp
o Quotient_functor R S f fresp
A: Type R: Relation A B: Type S: Relation B C: Type T: Relation C f: A -> B fresp: forallab : A, R a b -> S (f a) (f b) g: B -> C gresp: forallab : B, S a b -> T (g a) (g b)
Quotient_functor R T (g o f)
(funab : A => gresp (f a) (f b) o fresp a b) ==
Quotient_functor S T g gresp
o Quotient_functor R S f fresp
by srapply Quotient_ind_hprop.Defined.Context {A : Type} (R : Relation A)
{B : Type} (S : Relation B).
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
IsEquiv
(Quotient_functor R S f
(funab : A => fst (fresp a b)))
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
IsEquiv
(Quotient_functor R S f
(funab : A => fst (fresp a b)))
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
forallab : B, S a b -> R (f^-1 a) (f^-1 b)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
Quotient_functor R S f
(funab : A => fst (fresp a b))
o Quotient_functor S R f^-1?fresp == idmap
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
Quotient_functor S R f^-1?fresp
o Quotient_functor R S f
(funab : A => fst (fresp a b)) == idmap
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
forallab : B, S a b -> R (f^-1 a) (f^-1 b)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f a, b: B s: S a b
R (f^-1 a) (f^-1 b)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f a, b: B s: S a b
S (f (f^-1 a)) (f (f^-1 b))
abstract (do2rewrite eisretr; exact s).
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
Quotient_functor R S f
(funab : A => fst (fresp a b))
o Quotient_functor S R f^-1
(fun (ab : B) (s : S a b) =>
snd (fresp (f^-1 a) (f^-1 b))
(isequiv_quotient_functor_subproof f H a b s)) ==
idmap
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
Quotient_functor S R f^-1
(fun (ab : B) (s : S a b) =>
snd (fresp (f^-1 a) (f^-1 b))
(isequiv_quotient_functor_subproof f H a b s))
o Quotient_functor R S f
(funab : A => fst (fresp a b)) == idmap
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
foralla : B,
(funx : B / S =>
(Quotient_functor R S f
(funa0b : A => fst (fresp a0 b))
o Quotient_functor S R f^-1
(fun (a0b : B) (s : S a0 b) =>
snd (fresp (f^-1 a0) (f^-1 b))
(isequiv_quotient_functor_subproof f H a0 b s)))
x = idmap x) (class_of S a)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
forall (ab : B) (H0 : S a b),
transport
(funx : B / S =>
(Quotient_functor R S f
(funa0b0 : A => fst (fresp a0 b0))
o Quotient_functor S R f^-1
(fun (a0b0 : B) (s : S a0 b0) =>
snd (fresp (f^-1 a0) (f^-1 b0))
(isequiv_quotient_functor_subproof f H a0
b0 s))) x =
idmap x) (qglue H0) (?pclass a) =
?pclass b
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
foralla : A,
(funx : A / R =>
(Quotient_functor S R f^-1
(fun (a0b : B) (s : S a0 b) =>
snd (fresp (f^-1 a0) (f^-1 b))
(isequiv_quotient_functor_subproof f H a0 b s))
o Quotient_functor R S f
(funa0b : A => fst (fresp a0 b))) x =
idmap x) (class_of R a)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
forall (ab : A) (H0 : R a b),
transport
(funx : A / R =>
(Quotient_functor S R f^-1
(fun (a0b0 : B) (s : S a0 b0) =>
snd (fresp (f^-1 a0) (f^-1 b0))
(isequiv_quotient_functor_subproof f H a0 b0
s))
o Quotient_functor R S f
(funa0b0 : A => fst (fresp a0 b0))) x =
idmap x) (qglue H0) (?pclass0 a) =
?pclass0 b
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
foralla : B,
(funx : B / S =>
(Quotient_functor R S f
(funa0b : A => fst (fresp a0 b))
o Quotient_functor S R f^-1
(fun (a0b : B) (s : S a0 b) =>
snd (fresp (f^-1 a0) (f^-1 b))
(isequiv_quotient_functor_subproof f H a0 b s)))
x = idmap x) (class_of S a)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f b: B
class_of S (f (f^-1 b)) = class_of S b
apply ap, eisretr.
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
forall (ab : B) (H0 : S a b),
transport
(funx : B / S =>
(Quotient_functor R S f
(funa0b0 : A => fst (fresp a0 b0))
o Quotient_functor S R f^-1
(fun (a0b0 : B) (s : S a0 b0) =>
snd (fresp (f^-1 a0) (f^-1 b0))
(isequiv_quotient_functor_subproof f H a0
b0 s))) x = idmap x) (qglue H0)
((funb0 : B =>
ap (class_of S) (eisretr f b0)
:
(funx : B / S =>
(Quotient_functor R S f
(funa0b1 : A => fst (fresp a0 b1))
o Quotient_functor S R f^-1
(fun (a0b1 : B) (s : S a0 b1) =>
snd (fresp (f^-1 a0) (f^-1 b1))
(isequiv_quotient_functor_subproof f H a0
b1 s))) x = idmap x) (class_of S b0))
a) =
(funb0 : B =>
ap (class_of S) (eisretr f b0)
:
(funx : B / S =>
(Quotient_functor R S f
(funa0b1 : A => fst (fresp a0 b1))
o Quotient_functor S R f^-1
(fun (a0b1 : B) (s : S a0 b1) =>
snd (fresp (f^-1 a0) (f^-1 b1))
(isequiv_quotient_functor_subproof f H a0 b1
s))) x = idmap x) (class_of S b0)) b
intros; apply path_ishprop.
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
foralla : A,
(funx : A / R =>
(Quotient_functor S R f^-1
(fun (a0b : B) (s : S a0 b) =>
snd (fresp (f^-1 a0) (f^-1 b))
(isequiv_quotient_functor_subproof f H a0 b s))
o Quotient_functor R S f
(funa0b : A => fst (fresp a0 b))) x = idmap x)
(class_of R a)
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f a: A
class_of R (f^-1 (f a)) = class_of R a
apply ap, eissect.
A: Type R: Relation A B: Type S: Relation B f: A -> B fresp: forallab : A, R a b <-> S (f a) (f b) H: IsEquiv f
forall (ab : A) (H0 : R a b),
transport
(funx : A / R =>
(Quotient_functor S R f^-1
(fun (a0b0 : B) (s : S a0 b0) =>
snd (fresp (f^-1 a0) (f^-1 b0))
(isequiv_quotient_functor_subproof f H a0 b0
s))
o Quotient_functor R S f
(funa0b0 : A => fst (fresp a0 b0))) x =
idmap x) (qglue H0)
((funa0 : A =>
ap (class_of R) (eissect f a0)
:
(funx : A / R =>
(Quotient_functor S R f^-1
(fun (a1b0 : B) (s : S a1 b0) =>
snd (fresp (f^-1 a1) (f^-1 b0))
(isequiv_quotient_functor_subproof f H a1
b0 s))
o Quotient_functor R S f
(funa1b0 : A => fst (fresp a1 b0))) x =
idmap x) (class_of R a0)) a) =
(funa0 : A =>
ap (class_of R) (eissect f a0)
:
(funx : A / R =>
(Quotient_functor S R f^-1
(fun (a1b0 : B) (s : S a1 b0) =>
snd (fresp (f^-1 a1) (f^-1 b0))
(isequiv_quotient_functor_subproof f H a1 b0 s))
o Quotient_functor R S f
(funa1b0 : A => fst (fresp a1 b0))) x =
idmap x) (class_of R a0)) b
intros; apply path_ishprop.Defined.Definitionequiv_quotient_functor (f : A -> B) `{IsEquiv _ _ f}
(fresp : forallab, R a b <-> S (f a) (f b))
: Quotient R <~> Quotient S
:= Build_Equiv _ _ (Quotient_functor R S f (funab => fst (fresp a b))) _.Definitionequiv_quotient_functor' (f : A <~> B)
(fresp : forallab, R a b <-> S (f a) (f b))
: Quotient R <~> Quotient S
:= equiv_quotient_functor f fresp.EndFunctoriality.SectionKernel.(** ** Quotients of kernels of maps to sets give a surjection/mono factorization. *)(** Because the statement uses nested Sigma types, we need several variables to serve as [max] and [u+1]. We write [ar] for [max(a,r)], [ar'] for [ar+1], etc. *)Universes a r ar ar' b ab abr.Constrainta <= ar, r <= ar, ar < ar', a <= ab, b <= ab, ab <= abr, ar <= abr.Context `{Funext}.(** A function we want to factor. *)Context {A : Type@{a}} {B : Type@{b}} `{IsHSet B} (f : A -> B).(** A mere Relation equivalent to its kernel. *)Context (R : Relation@{a r} A)
(is_ker : forallxy, f x = f y <~> R x y).(** The factorization theorem. An advantage of stating it as one bundled result is that it is easier to state variations as we do below. Disadvantages are that it requires more universe variables and that each piece of the answer depends on [Funext] and all of the universe variables, even when these aren't needed for that piece. Below we will clean up the universe variables slightly, so we make this version [Local]. *)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
{C : Type &
{e : A -> C &
{m : C -> B &
IsHSet C * ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = m o e)}}}
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
{C : Type &
{e : A -> C &
{m : C -> B &
IsHSet C * ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = m o e)}}}
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
{e : A -> A / R &
{m : A / R -> B &
IsHSet (A / R) *
ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = (funx : A => m (e x)))}}
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
{m : A / R -> B &
IsHSet (A / R) *
ReflectiveSubuniverse.IsConnMap (Tr (-1)) (class_of R) *
IsEmbedding m * (f = (funx : A => m (class_of R x)))}
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
A / R -> B
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
(funm : A / R -> B =>
IsHSet (A / R) *
ReflectiveSubuniverse.IsConnMap
(Tr (-1)) (class_of R) *
IsEmbedding m * (f = (funx : A => m (class_of R x))))
?proj1
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
A / R -> B
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
forall (ab : A) (H : R a b),
transport (fun_ : A / R => B) (qglue H) (f a) = f b
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y x, y: A p: R x y
transport (fun_ : A / R => B) (qglue p) (f x) = f y
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y x, y: A p: R x y
f x = f y
exact ((is_ker x y)^-1 p).
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
(funm : A / R -> B =>
IsHSet (A / R) *
ReflectiveSubuniverse.IsConnMap (Tr (-1))
(class_of R) * IsEmbedding m *
(f = (funx : A => m (class_of R x))))
(Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p))
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y
IsEmbedding
(Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p))
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B
IsHProp
(hfiber
(Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p)) u)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B
forall
(x : hfiber
(Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p)) u)
(y : hfiber
(Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p)) u), x = y
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B x: A / R q: Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) x = u y: A / R p': Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) y = u
(x; q) = (y; p')
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B x: A / R q: Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) x = u y: A / R p': Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) y = u
x = y
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B
forallxy : A / R,
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) x = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) y = u -> x = y
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B
foralla : A,
(funx : A / R =>
forally : A / R,
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) x = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) y = u -> x = y)
(class_of R a)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B
forall (ab : A) (H0 : R a b),
transport
(funx : A / R =>
forally : A / R,
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) x = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) y = u ->
x = y) (qglue H0) (?pclass a) =
?pclass b
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B
foralla : A,
(funx : A / R =>
forally : A / R,
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) x = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) y = u -> x = y)
(class_of R a)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B a: A
(funx : A / R =>
forally : A / R,
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) x = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y0 : A) (p : R x0 y0) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y0)^-1 p) y = u -> x = y)
(class_of R a)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B a: A
foralla0 : A,
(funx : A / R =>
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p) (class_of R a) = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p) x = u -> class_of R a = x)
(class_of R a0)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B a: A
forall (a0b : A) (H0 : R a0 b),
transport
(funx : A / R =>
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p)
(class_of R a) = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p) x = u ->
class_of R a = x) (qglue H0)
(?pclass a0) = ?pclass b
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B a: A
foralla0 : A,
(funx : A / R =>
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p) (class_of R a) = u ->
Quotient_ind R (fun_ : A / R => B) f
(fun (x0y : A) (p : R x0 y) =>
transport_const (qglue p) (f x0) @
(is_ker x0 y)^-1 p) x = u -> class_of R a = x)
(class_of R a0)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B a, a': A p: Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) (class_of R a) = u p': Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) (class_of R a') = u
class_of R a = class_of R a'
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B R: Relation A is_ker: forallxy : A, f x = f y <~> R x y u: B a, a': A p: Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) (class_of R a) = u p': Quotient_ind R (fun_ : A / R => B) f
(fun (xy : A) (p : R x y) =>
transport_const (qglue p) (f x) @
(is_ker x y)^-1 p) (class_of R a') = u
f a = f a'
exact (p @ p'^).Defined.(** We clean up the universe variables here, using only those declared in this Section. *)Definitionquotient_kernel_factor_general@{|}
:= Evalunfold quotient_kernel_factor_internal in
quotient_kernel_factor_internal@{ar' ar abr abr ab abr abr}.EndKernel.(** A common special case of [quotient_kernel_factor] is when we define [R] to be [f x = f y]. Then universes [r] and [b] are unified. *)
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B
{C : Type &
{e : A -> C &
{m : C -> B &
IsHSet C * ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = m o e)}}}
H: Funext A, B: Type IsHSet0: IsHSet B f: A -> B
{C : Type &
{e : A -> C &
{m : C -> B &
IsHSet C * ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = m o e)}}}
exact (quotient_kernel_factor_general@{a b ab ab' b ab ab}
f (funab => f a = f b) (funxy => equiv_idmap)).Defined.(** If we use propositional resizing, we can replace [f x = f y] with a proposition [R x y] in universe [a], so that the universe of [C] is the same as the universe of [A]. *)
H: Funext H0: PropResizing A, B: Type IsHSet0: IsHSet B f: A -> B
{C : Type &
{e : A -> C &
{m : C -> B &
IsHSet C * ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = m o e)}}}
H: Funext H0: PropResizing A, B: Type IsHSet0: IsHSet B f: A -> B
{C : Type &
{e : A -> C &
{m : C -> B &
IsHSet C * ReflectiveSubuniverse.IsConnMap (Tr (-1)) e *
IsEmbedding m * (f = m o e)}}}
exact (quotient_kernel_factor_general@{a a a a' b ab ab}
f (funab => smalltype@{a b} (f a = f b))
(funxy => (equiv_smalltype _)^-1%equiv)).Defined.