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]
LocalOpen Scope nat_scope.LocalOpen Scope path_scope.Generalizable VariablesA B f.(** * Relational equivalences *)(** This definition is due to Peter LeFanu Lumsdaine on the HoTT mailing list. This definition gives more judgmental properties, though has the downside of jumping universe levels. *)RecordRelEquivAB :=
{ equiv_rel : A -> B -> Type;
relequiv_contr_f :: foralla, Contr { b : B & equiv_rel a b };
relequiv_contr_g :: forallb, Contr { a : A & equiv_rel a b } }.Arguments equiv_rel {A B} _ _ _.
A, B: Type
{equiv_rel : A -> B -> Type &
{_ : foralla : A, Contr {b : B & equiv_rel a b} &
forallb : B, Contr {a : A & equiv_rel a b}}} <~>
RelEquiv A B
A, B: Type
{equiv_rel : A -> B -> Type &
{_ : foralla : A, Contr {b : B & equiv_rel a b} &
forallb : B, Contr {a : A & equiv_rel a b}}} <~>
RelEquiv A B
issig.Defined.
A, B: Type e: A <~> B
RelEquiv A B
A, B: Type e: A <~> B
RelEquiv A B
exact {| equiv_rel a b := e a = b |}.(** The rest is found by typeclass inference! *)Defined.
A, B: Type e: RelEquiv A B
A <~> B
A, B: Type e: RelEquiv A B
A <~> B
A, B: Type e: RelEquiv A B x: B
(center
{b : B &
equiv_rel e (center {a : A & equiv_rel e a x}).1 b}).1 =
x
A, B: Type e: RelEquiv A B x: A
(center
{a : A &
equiv_rel e a (center {b : B & equiv_rel e x b}).1}).1 =
x
A, B: Type e: RelEquiv A B x: B
(center
{b : B &
equiv_rel e (center {a : A & equiv_rel e a x}).1 b}).1 =
x
A, B: Type e: RelEquiv A B x: B
equiv_rel e (center {a : A & equiv_rel e a x}).1 x
exact (center {a : A & equiv_rel e a x}).2.
A, B: Type e: RelEquiv A B x: A
(center
{a : A &
equiv_rel e a (center {b : B & equiv_rel e x b}).1}).1 =
x
A, B: Type e: RelEquiv A B x: A
(center
{a : A &
equiv_rel e a (center {b : B & equiv_rel e x b}).1}).1 =
x
A, B: Type e: RelEquiv A B x: A
equiv_rel e x (center {b : B & equiv_rel e x b}).1
exact (center {b : B & equiv_rel e x b}).2.}Defined.DefinitionRelIsEquiv {AB} (f : A -> B)
:= { r : RelEquiv A B | forallx, (center { b : B & equiv_rel r x b }).1 = f x }.(** TODO: Prove [ishprop_relisequiv `{Funext} {A B} f : IsHProp (@RelIsEquiv A B f)] *)(** * Judgmental property *)Definitioninverse_relequiv {AB} (e : RelEquiv A B) : RelEquiv B A
:= {| equiv_rel a b := equiv_rel e b a |}.Definitionreinv_V {AB} (e : RelEquiv A B)
: inverse_relequiv (inverse_relequiv e) = e
:= 1.(** TODO: Is there a definition of this that makes [inverse_relequiv (relequiv_idmap A)] be [relequiv_idmap A], judgmentally? *)Definitionrelequiv_idmapA : RelEquiv A A
:= {| equiv_rel a b := a = b |}.(** TODO: Define composition; we probably need truncation to do this? *)