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.
(** * The cumulative hierarchy [V]. *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import HSet TruncType.Require Import Colimits.SpanPushout.Require Import HoTT.Truncations.Core Colimits.Quotient.LocalOpen Scope nat_scope.LocalOpen Scope path_scope.(** Bitotal relation *)Definitionbitotal {AB : Type} (R : A -> B -> HProp) :=
(foralla : A, hexists (fun (b : B) => R a b))
* (forallb : B, hexists (fun (a : A) => R a b)).(** ** The cumulative hierarchy V *)ModuleExport CumulativeHierarchy.Private InductiveV@{U' U | U < U'} : Type@{U'} :=
| set {A : Type@{U}} (f : A -> V) : V.Axiomsetext : forall {AB : Type} (R : A -> B -> HProp)
(bitot_R : bitotal R) (h : SPushout R -> V),
set (h o (spushl R)) = set (h o (spushr R)).Axiomishset_V : IsHSet V.Existing Instanceishset_V.(** The induction principle. Annotating the universes here greatly reduces the number of universe variables later in the file. For example, [function] below went from 279 to 3. If [V_ind] needs to be generalized in the future, check [function] to make sure things haven't exploded again. *)FixpointV_ind@{U' U u | U < U'} (P : V@{U' U} -> Type@{u})
(H_0trunc : forallv : V@{U' U}, IsTrunc 0 (P v))
(H_set : forall (A : Type@{U}) (f : A -> V) (H_f : foralla : A, P (f a)), P (set f))
(H_setext : forall (AB : Type@{U}) (R : A -> B -> HProp@{U}) (bitot_R : bitotal R)
(h : SPushout R -> V) (H_h : forallx : SPushout R, P (h x)),
transport@{U' u} _ (setext R bitot_R h) (H_set A (h o spushl R) (H_h oD spushl R))
= H_set B (h o spushr R) (H_h oD spushr R) )
(v : V)
: P v
:= (match v with
| set A f => fun__ => H_set A f (funa => V_ind P H_0trunc H_set H_setext (f a))
end) H_setext H_0trunc.(** We don't need to axiomatize the computation rule because we get it for free thanks to 0-truncation *)EndCumulativeHierarchy.
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext: forall (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : forallx : SPushout
(fun (x : A) (x0 : B) =>
R x x0),
P (h x)),
transport P (setext R bitot_R h)
(H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
oD spushl
(fun (x : A) (x0 : B) => R x x0))) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
oD spushr
(fun (x : A) (x0 : B) => R x x0)) A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V
apD (V_ind P H_0trunc H_set H_setext)
(setext R bitot_R h) =
H_setext A B R bitot_R h
(V_ind P H_0trunc H_set H_setext oD h)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext: forall (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : forallx : SPushout
(fun (x : A) (x0 : B) =>
R x x0),
P (h x)),
transport P (setext R bitot_R h)
(H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
oD spushl
(fun (x : A) (x0 : B) => R x x0))) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
oD spushr
(fun (x : A) (x0 : B) => R x x0)) A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V
apD (V_ind P H_0trunc H_set H_setext)
(setext R bitot_R h) =
H_setext A B R bitot_R h
(V_ind P H_0trunc H_set H_setext oD h)
apply path_ishprop.Defined.(** The non-dependent eliminator *)
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext: forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
P),
H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushl
(fun (x : A) (x0 : B) => R x x0)) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushr
(fun (x : A) (x0 : B) => R x x0))
V -> P
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext: forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
P),
H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushl
(fun (x : A) (x0 : B) => R x x0)) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushr
(fun (x : A) (x0 : B) => R x x0))
V -> P
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext: forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
P),
H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushl
(fun (x : A) (x0 : B) => R x x0)) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushr
(fun (x : A) (x0 : B) => R x x0))
forall (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) -> V)
(H_h : SPushout (fun (x : A) (x0 : B) => R x x0) -> P),
transport (fun_ : V => P) (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext: forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
P),
H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushl
(fun (x : A) (x0 : B) => R x x0)) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushr
(fun (x : A) (x0 : B) => R x x0)) A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
transport (fun_ : V => P) (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
exact (transport_const _ _ @ H_setext A B R bitot_R h H_h).Defined.
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext: forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
P),
H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushl
(fun (x : A) (x0 : B) => R x x0)) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushr
(fun (x : A) (x0 : B) => R x x0)) A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V
ap (V_rec P H_0trunc H_set H_setext)
(setext R bitot_R h) =
H_setext A B R bitot_R h
(V_rec P H_0trunc H_set H_setext o h)
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext: forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
P),
H_set A
(h
o spushl
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushl
(fun (x : A) (x0 : B) => R x x0)) =
H_set B
(h
o spushr
(fun (x : A) (x0 : B) => R x x0))
(H_h
o spushr
(fun (x : A) (x0 : B) => R x x0)) A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V
ap (V_rec P H_0trunc H_set H_setext)
(setext R bitot_R h) =
H_setext A B R bitot_R h
(V_rec P H_0trunc H_set H_setext o h)
apply path_ishprop.Defined.(** ** Alternative induction principle (This is close to the one from the book) *)Definitionequal_img {ABC : Type} (f : A -> C) (g : B -> C) :=
(foralla : A, hexists (fun (b : B) => f a = g b))
* (forallb : B, hexists (fun (a : A) => f a = g b)).
A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
set f = set g
A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
set f = set g
A, B: Type f: A -> V g: B -> V eq_img: equal_img f g R:= fun (a : A) (b : B) => Build_HProp (f a = g b): A -> B -> HProp
set f = set g
A, B: Type f: A -> V g: B -> V eq_img: equal_img f g R:= fun (a : A) (b : B) => Build_HProp (f a = g b): A -> B -> HProp h:= spushout_rec (fun (a : A) (b : B) => R a b) V f g
(fun (x : A) (y : B) => idmap): SPushout (fun (a : A) (b : B) => R a b) -> V
set f = set g
exact (setext R eq_img h).Defined.
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g
V -> P
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g
V -> P
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g
forall (AB : Type) (R : A -> B -> HProp),
bitotal R ->
forall
(h : SPushout (fun (x : A) (x0 : B) => R x x0) -> V)
(H_h : SPushout (fun (x : A) (x0 : B) => R x x0) -> P),
H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x)) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x)) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
equal_img
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
equal_img
(funx : A =>
H_h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
equal_img
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
foralla : A,
hexists
(funb : B =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
forallb : B,
hexists
(funa : A =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
foralla : A,
hexists
(funb : B =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A
hexists
(funb : B =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A
hexists (funb : B => R a b) ->
hexists
(funb : B =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A
{b : B & R a b} ->
{b : B &
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A b: B r: R a b
{b : B &
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A b: B r: R a b
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b)
exact (ap h (spglue R r)).
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
forallb : B,
hexists
(funa : A =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B
hexists
(funa : A =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B
hexists (funa : A => R a b) ->
hexists
(funa : A =>
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B
{a : A & R a b} ->
{a : A &
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B a: A r: R a b
{a : A &
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B a: A r: R a b
h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
h (spushr (fun (x : A) (x0 : B) => R x x0) b)
exact (ap h (spglue R r)).
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
equal_img
(funx : A =>
H_h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
foralla : A,
hexists
(funb : B =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
forallb : B,
hexists
(funa : A =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
foralla : A,
hexists
(funb : B =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A
hexists
(funb : B =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A
hexists (funb : B => R a b) ->
hexists
(funb : B =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A
{b : B & R a b} ->
{b : B &
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A b: B r: R a b
{b : B &
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P a: A b: B r: R a b
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b)
exact (ap H_h (spglue R r)).
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P
forallb : B,
hexists
(funa : A =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B
hexists
(funa : A =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B
hexists (funa : A => R a b) ->
hexists
(funa : A =>
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b))
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B
{a : A & R a b} ->
{a : A &
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B a: A r: R a b
{a : A &
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b)}
P: Type H_0trunc: IsHSet P H_set: forallA : Type, (A -> V) -> (A -> P) -> P H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V),
equal_img f g ->
forall (H_f : A -> P) (H_g : B -> P),
equal_img H_f H_g ->
H_set A f H_f = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: SPushout (fun (x : A) (x0 : B) => R x x0) -> P b: B a: A r: R a b
H_h (spushl (fun (x : A) (x0 : B) => R x x0) a) =
H_h (spushr (fun (x : A) (x0 : B) => R x x0) b)
exact (ap H_h (spglue R r)).Defined.(** Note that the hypothesis H_setext' differs from the one given in section 10.5 of the HoTT book. *)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g
forallv : V, P v
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g
forallv : V, P v
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g
forall (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) -> V)
(H_h : forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x)),
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x)
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a)
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
equal_img f g
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
equal_img f g
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
foralla : A, hexists (funb : B => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
forallb : B, hexists (funa : A => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
foralla : A, hexists (funb : B => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) a: A
hexists (funb : B => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) a: A
hexists (funb : B => R a b) ->
hexists (funb : B => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) a: A
{b : B & R a b} -> {b : B & f a = g b}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) a: A b: B r: R a b
{b : B & f a = g b}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) a: A b: B r: R a b
f a = g b
exact (ap h (spglue R r)).
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b)
forallb : B, hexists (funa : A => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) b: B
hexists (funa : A => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) b: B
hexists (funa : A => R a b) ->
hexists (funa : A => f a = g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) b: B
{a : A & R a b} -> {a : A & f a = g b}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) b: B a: A r: R a b
{a : A & f a = g b}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) b: B a: A r: R a b
f a = g b
exact (ap h (spglue R r)).
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
transport P
(setext'
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(h o spushr (fun (x : A) (x0 : B) => R x x0))
eq_img)
(H_set A
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0)))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
transport P
(setext'
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(h o spushr (fun (x : A) (x0 : B) => R x x0))
eq_img)
(H_set A
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
transport P
(setext'
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(h o spushr (fun (x : A) (x0 : B) => R x x0))
eq_img)
(H_set A
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0)))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
setext R bitot_R h =
setext'
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
eq_img
apply path_ishprop.
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
transport P
(setext'
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(h o spushr (fun (x : A) (x0 : B) => R x x0))
eq_img)
(H_set A
(h o spushl (fun (x : A) (x0 : B) => R x x0))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b)))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b)
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b)
hexists (funb : B => R a b) ->
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b)
{b : B & R a b} ->
{b : B &
hexists
(funp : f a = g b => transport P p (H_f a) = H_g b)}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
{b : B &
hexists
(funp : f a = g b => transport P p (H_f a) = H_g b)}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
hexists
(funp : f a = g b => transport P p (H_f a) = H_g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
{p : f a = g b & transport P p (H_f a) = H_g b}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a) = H_g b
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a) =
transport
(funx : SPushout (fun (x : A) (x0 : B) => R x x0)
=> P (h x))
(spglue (fun (x : A) (x0 : B) => R x x0) Rab)
(H_h (spushl (fun (x : A) (x0 : B) => R x x0) a))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
transport
(funx : SPushout (fun (x : A) (x0 : B) => R x x0)
=> P (h x))
(spglue (fun (x : A) (x0 : B) => R x x0) Rab)
(H_h (spushl (fun (x : A) (x0 : B) => R x x0) a)) =
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g a: A truncb:= fst bitot_R a: hexists (funb : B => R a b) b: B Rab: R a b
transport
(funx : SPushout (fun (x : A) (x0 : B) => R x x0)
=> P (h x))
(spglue (fun (x : A) (x0 : B) => R x x0) Rab)
(H_h (spushl (fun (x : A) (x0 : B) => R x x0) a)) =
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a)
apply transport_compose.
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g
forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b)
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b)
hexists (funa : A => R a b) ->
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b)
{a : A & R a b} ->
{a : A &
hexists
(funp : f a = g b => transport P p (H_f a) = H_g b)}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
{a : A &
hexists
(funp : f a = g b => transport P p (H_f a) = H_g b)}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
hexists
(funp : f a = g b => transport P p (H_f a) = H_g b)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
{p : f a = g b & transport P p (H_f a) = H_g b}
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a) = H_g b
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a) =
transport
(funx : SPushout (fun (x : A) (x0 : B) => R x x0)
=> P (h x))
(spglue (fun (x : A) (x0 : B) => R x x0) Rab)
(H_h (spushl (fun (x : A) (x0 : B) => R x x0) a))
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
transport
(funx : SPushout (fun (x : A) (x0 : B) => R x x0)
=> P (h x))
(spglue (fun (x : A) (x0 : B) => R x x0) Rab)
(H_h (spushl (fun (x : A) (x0 : B) => R x x0) a)) =
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a)
P: V -> Type H_0trunc: forallv : V, IsHSet (P v) H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) H_setext': forall (AB : Type) (f : A -> V)
(g : B -> V) (eq_img : equal_img f g)
(H_f : foralla : A, P (f a))
(H_g : forallb : B, P (g b)),
(foralla : A,
hexists
(funb : B =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) *
(forallb : B,
hexists
(funa : A =>
hexists
(funp : f a = g b =>
transport P p (H_f a) = H_g b))) ->
transport P (setext' f g eq_img)
(H_set A f H_f) = H_set B g H_g A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x) f:= h o spushl (fun (x : A) (x0 : B) => R x x0)
:
A -> V: A -> V g:= h o spushr (fun (x : A) (x0 : B) => R x x0)
:
B -> V: B -> V H_f:= H_h oD spushl (fun (x : A) (x0 : B) => R x x0)
:
foralla : A, P (f a): foralla : A, P (f a) H_g:= H_h oD spushr (fun (x : A) (x0 : B) => R x x0)
:
forallb : B, P (g b): forallb : B, P (g b) eq_img: equal_img f g b: B trunca:= snd bitot_R b: hexists (funa : A => R a b) a: A Rab: R a b
transport
(funx : SPushout (fun (x : A) (x0 : B) => R x x0)
=> P (h x))
(spglue (fun (x : A) (x0 : B) => R x x0) Rab)
(H_h (spushl (fun (x : A) (x0 : B) => R x x0) a)) =
transport P
(ap h (spglue (fun (x : A) (x0 : B) => R x x0) Rab))
(H_f a)
apply transport_compose.Defined.(** Simpler induction principle when the goal is an hprop *)
P: V -> Type H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) isHProp_P: forallv : V, IsHProp (P v)
forallv : V, P v
P: V -> Type H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) isHProp_P: forallv : V, IsHProp (P v)
forallv : V, P v
P: V -> Type H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) isHProp_P: forallv : V, IsHProp (P v)
forall (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) -> V)
(H_h : forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x)),
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
P: V -> Type H_set: forall (A : Type) (f : A -> V),
(foralla : A, P (f a)) -> P (set f) isHProp_P: forallv : V, IsHProp (P v) A, B: Type R: A -> B -> HProp bitot_R: bitotal R h: SPushout (fun (x : A) (x0 : B) => R x x0) -> V H_h: forallx : SPushout (fun (x : A) (x0 : B) => R x x0),
P (h x)
transport P (setext R bitot_R h)
(H_set A
(funx : A =>
h (spushl (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushl (fun (x : A) (x0 : B) => R x x0))) =
H_set B
(funx : B =>
h (spushr (fun (x0 : A) (x1 : B) => R x0 x1) x))
(H_h oD spushr (fun (x : A) (x0 : B) => R x x0))
forall (AB : Type) (f : A -> V) (g : B -> V),
equal_img f g ->
forall (H_f : A -> HProp) (H_g : B -> HProp),
equal_img H_f H_g -> ?H_set A f H_f = ?H_set B g H_g
ua: Univalence x: V
forallA : Type, (A -> V) -> (A -> HProp) -> HProp
ua: Univalence x: V A: Type f: A -> V
HProp
exact (hexists (funa : A => f a = x)).
ua: Univalence x: V
forall (AB : Type) (f : A -> V) (g : B -> V),
equal_img f g ->
forall (H_f : A -> HProp) (H_g : B -> HProp),
equal_img H_f H_g ->
(fun (A0 : Type) (f0 : A0 -> V) (_ : A0 -> HProp) =>
hexists (funa : A0 => f0 a = x)) A f H_f =
(fun (A0 : Type) (f0 : A0 -> V) (_ : A0 -> HProp) =>
hexists (funa : A0 => f0 a = x)) B g H_g
ua: Univalence x: V
forall (AB : Type) (f : A -> V) (g : B -> V),
equal_img f g ->
forall (H_f : A -> HProp) (H_g : B -> HProp),
equal_img H_f H_g ->
hexists (funa : A => f a = x) =
hexists (funa : B => g a = x)
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g
hexists (funa : A => f a = x) =
hexists (funa : B => g a = x)
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g
Tr (-1) {a : A & f a = x} -> Tr (-1) {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g
Tr (-1) {a : B & g a = x} -> Tr (-1) {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g
Tr (-1) {a : A & f a = x} -> Tr (-1) {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x}
Tr (-1) {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x}
{a : A & f a = x} -> Tr (-1) {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x} a: A p: f a = x
Tr (-1) {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x} a: A p: f a = x
hexists (funb : B => f a = g b) ->
Tr (-1) {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x} a: A p: f a = x
{b : B & f a = g b} -> {a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x} a: A p: f a = x b: B p': f a = g b
{a : B & g a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : A & f a = x} a: A p: f a = x b: B p': f a = g b
g b = x
transitivity (f a); auto with path_hints.
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g
Tr (-1) {a : B & g a = x} -> Tr (-1) {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x}
Tr (-1) {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x}
{a : B & g a = x} -> Tr (-1) {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x} b: B p: g b = x
Tr (-1) {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x} b: B p: g b = x
hexists (funa : A => f a = g b) ->
Tr (-1) {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x} b: B p: g b = x
{a : A & f a = g b} -> {a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x} b: B p: g b = x a: A p': f a = g b
{a : A & f a = x}
ua: Univalence x: V A, B: Type f: A -> V g: B -> V eqimg: equal_img f g H: Tr (-1) {a : B & g a = x} b: B p: g b = x a: A p': f a = g b
f a = x
transitivity (g b); auto with path_hints.Defined.Declare Scope set_scope.Notation"x ∈ v" := (mem x v) : set_scope.Open Scope set_scope.(** ** Subset relation *)Definitionsubset (x : V) (y : V) : HProp
:= Build_HProp (forallz : V, z ∈ x -> z ∈ y).Notation"x ⊆ y" := (subset x y) : set_scope.(** ** Bisimulation relation *)(** The equality in [V] lives in [Type@{U'}]. We define the bisimulation relation which is a [U]-small resizing of the equality in [V]: it must live in [HProp_U : Type{U'}], hence the codomain is [HProp@{U}]. We then prove that bisimulation is equality ([bisim_equals_id]), then use it to prove the key lemma [monic_set_present]. *)(* We define [bisimulation] by double induction on [V]. We first fix the first argument as set(A,f) and define [bisim_aux : V -> HProp], by induction. This is the inner of the two inductions. *)
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp
V -> HProp
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp
V -> HProp
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp
IsHSet HProp
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp
forall (A0B : Type) (f : A0 -> V) (g : B -> V),
equal_img f g ->
forall (H_f0 : A0 -> HProp) (H_g : B -> HProp),
equal_img H_f0 H_g ->
Build_HProp
((foralla : A, hexists (funb : A0 => H_f a (f b))) *
(forallb : A0, hexists (funa : A => H_f a (f b)))) =
Build_HProp
((foralla : A, hexists (funb : B => H_f a (g b))) *
(forallb : B, hexists (funa : A => H_f a (g b))))
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp
IsHSet HProp
exact _.
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp
forall (A0B : Type) (f : A0 -> V) (g : B -> V),
equal_img f g ->
forall (H_f0 : A0 -> HProp) (H_g : B -> HProp),
equal_img H_f0 H_g ->
Build_HProp
((foralla : A, hexists (funb : A0 => H_f a (f b))) *
(forallb : A0, hexists (funa : A => H_f a (f b)))) =
Build_HProp
((foralla : A, hexists (funb : B => H_f a (g b))) *
(forallb : B, hexists (funa : A => H_f a (g b))))
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g'
Build_HProp
((foralla : A, Tr (-1) {b : B & H_f a (g b)}) *
(forallb : B, Tr (-1) {a : A & H_f a (g b)})) =
Build_HProp
((foralla : A, Tr (-1) {b : B' & H_f a (g' b)}) *
(forallb : B', Tr (-1) {a : A & H_f a (g' b)}))
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g'
(foralla : A, Tr (-1) {b : B & H_f a (g b)}) *
(forallb : B, Tr (-1) {a : A & H_f a (g b)}) ->
(foralla : A, Tr (-1) {b : B' & H_f a (g' b)}) *
(forallb : B', Tr (-1) {a : A & H_f a (g' b)})
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g'
(foralla : A, Tr (-1) {b : B' & H_f a (g' b)}) *
(forallb : B', Tr (-1) {a : A & H_f a (g' b)}) ->
(foralla : A, Tr (-1) {b : B & H_f a (g b)}) *
(forallb : B, Tr (-1) {a : A & H_f a (g b)})
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g'
(foralla : A, Tr (-1) {b : B & H_f a (g b)}) *
(forallb : B, Tr (-1) {a : A & H_f a (g b)}) ->
(foralla : A, Tr (-1) {b : B' & H_f a (g' b)}) *
(forallb : B', Tr (-1) {a : A & H_f a (g' b)})
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)}
foralla : A, Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)}
forallb : B', Tr (-1) {a : A & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)}
foralla : A, Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A
Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A
{b : B & H_f a (g b)} ->
Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A b: B H3: H_f a (g b)
Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A b: B H3: H_f a (g b)
hexists (funb0 : B' => g b = g' b0) ->
Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A b: B H3: H_f a (g b)
merely {b0 : B' & g b = g' b0} ->
Tr (-1) {b : B' & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A b: B H3: H_f a (g b)
{b0 : B' & g b = g' b0} -> {b0 : B' & H_f a (g' b0)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A b: B H3: H_f a (g b) b': B' p: g b = g' b'
{b0 : B' & H_f a (g' b0)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} a: A b: B H3: H_f a (g b) b': B' p: g b = g' b'
H_f a (g' b')
exact (transport (funx => H_f a x) p H3).
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)}
forallb : B', Tr (-1) {a : A & H_f a (g' b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B'
Tr (-1) {a : A & H_f a (g' b')}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B'
{a : B & g a = g' b'} ->
Tr (-1) {a : A & H_f a (g' b')}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B' b: B p: g b = g' b'
Tr (-1) {a : A & H_f a (g' b')}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B' b: B p: g b = g' b'
Tr (-1) {a : A & H_f a (g b)} ->
Tr (-1) {a : A & H_f a (g' b')}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B' b: B p: g b = g' b'
{a : A & H_f a (g b)} -> {a : A & H_f a (g' b')}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B' b: B p: g b = g' b' a: A H3: H_f a (g b)
{a : A & H_f a (g' b')}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B & H_f a (g b)} H2: forallb : B, Tr (-1) {a : A & H_f a (g b)} b': B' b: B p: g b = g' b' a: A H3: H_f a (g b)
H_f a (g' b')
exact (transport (funx => H_f a x) p H3).
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g'
(foralla : A, Tr (-1) {b : B' & H_f a (g' b)}) *
(forallb : B', Tr (-1) {a : A & H_f a (g' b)}) ->
(foralla : A, Tr (-1) {b : B & H_f a (g b)}) *
(forallb : B, Tr (-1) {a : A & H_f a (g b)})
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)}
foralla : A, Tr (-1) {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)}
forallb : B, Tr (-1) {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)}
foralla : A, Tr (-1) {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A
Tr (-1) {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A
{b : B' & H_f a (g' b)} ->
Tr (-1) {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A b': B' H3: H_f a (g' b')
Tr (-1) {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A b': B' H3: H_f a (g' b')
hexists (funa : B => g a = g' b') ->
Tr (-1) {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A b': B' H3: H_f a (g' b')
{a : B & g a = g' b'} -> {b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A b': B' H3: H_f a (g' b') b: B p: g b = g' b'
{b : B & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} a: A b': B' H3: H_f a (g' b') b: B p: g b = g' b'
H_f a (g b)
exact (transport (funx => H_f a x) p^ H3).
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)}
forallb : B, Tr (-1) {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B
Tr (-1) {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B
{b0 : B' & g b = g' b0} ->
Tr (-1) {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B b': B' p: g b = g' b'
Tr (-1) {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B b': B' p: g b = g' b'
Tr (-1) {a : A & H_f a (g' b')} ->
Tr (-1) {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B b': B' p: g b = g' b'
{a : A & H_f a (g' b')} -> {a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B b': B' p: g b = g' b' a: A H3: H_f a (g' b')
{a : A & H_f a (g b)}
ua: Univalence A: Type f: A -> V H_f: A -> V -> HProp B, B': Type g: B -> V g': B' -> V eq_img: equal_img g g' H_g: B -> HProp H_g': B' -> HProp H_img: equal_img H_g H_g' H1: foralla : A, Tr (-1) {b : B' & H_f a (g' b)} H2: forallb : B', Tr (-1) {a : A & H_f a (g' b)} b: B b': B' p: g b = g' b' a: A H3: H_f a (g' b')
H_f a (g b)
exact (transport (funx => H_f a x) p^ H3).Defined.(* Then we define [bisimulation : V -> (V -> HProp)] by induction again *)
ua: Univalence
V -> V -> HProp
ua: Univalence
V -> V -> HProp
ua: Univalence
forall (AB : Type) (f : A -> V) (g : B -> V),
equal_img f g ->
forall (H_f : A -> V -> HProp)
(H_g : B -> V -> HProp),
equal_img H_f H_g ->
bisim_aux A f H_f = bisim_aux B g H_g
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g
bisim_aux A f H_f = bisim_aux B g H_g
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g
bisim_aux A f H_f == bisim_aux B g H_g
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g
forall (A0 : Type) (f0 : A0 -> V),
(foralla : A0,
bisim_aux A f H_f (f0 a) = bisim_aux B g H_g (f0 a)) ->
bisim_aux A f H_f (set f0) =
bisim_aux B g H_g (set f0)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V
bisim_aux A f H_f (set h) = bisim_aux B g H_g (set h)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V
(foralla : A, Tr (-1) {b : C & H_f a (h b)}) *
(forallb : C, Tr (-1) {a : A & H_f a (h b)}) ->
(foralla : B, Tr (-1) {b : C & H_g a (h b)}) *
(forallb : C, Tr (-1) {a : B & H_g a (h b)})
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V
(foralla : B, Tr (-1) {b : C & H_g a (h b)}) *
(forallb : C, Tr (-1) {a : B & H_g a (h b)}) ->
(foralla : A, Tr (-1) {b : C & H_f a (h b)}) *
(forallb : C, Tr (-1) {a : A & H_f a (h b)})
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V
(foralla : A, Tr (-1) {b : C & H_f a (h b)}) *
(forallb : C, Tr (-1) {a : A & H_f a (h b)}) ->
(foralla : B, Tr (-1) {b : C & H_g a (h b)}) *
(forallb : C, Tr (-1) {a : B & H_g a (h b)})
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)}
foralla : B, Tr (-1) {b : C & H_g a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)}
forallb : C, Tr (-1) {a : B & H_g a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)}
foralla : B, Tr (-1) {b : C & H_g a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B
Tr (-1) {b0 : C & H_g b (h b0)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B
{a : A & H_f a = H_g b} ->
Tr (-1) {b0 : C & H_g b (h b0)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B a: A p: H_f a = H_g b
Tr (-1) {b0 : C & H_g b (h b0)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B a: A p: H_f a = H_g b
Tr (-1) {b : C & H_f a (h b)} ->
Tr (-1) {b0 : C & H_g b (h b0)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B a: A p: H_f a = H_g b
{b : C & H_f a (h b)} -> {b0 : C & H_g b (h b0)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B a: A p: H_f a = H_g b c: C H3: H_f a (h c)
{b0 : C & H_g b (h b0)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} b: B a: A p: H_f a = H_g b c: C H3: H_f a (h c)
H_g b (h c)
exact ((ap10 p (h c)) # H3).
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)}
forallb : C, Tr (-1) {a : B & H_g a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C
Tr (-1) {a : B & H_g a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C
{a : A & H_f a (h c)} -> Tr (-1) {a : B & H_g a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C a: A H3: H_f a (h c)
Tr (-1) {a : B & H_g a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C a: A H3: H_f a (h c)
hexists (funb : B => H_f a = H_g b) ->
Tr (-1) {a : B & H_g a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C a: A H3: H_f a (h c)
{b : B & H_f a = H_g b} -> {a : B & H_g a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C a: A H3: H_f a (h c) b: B p: H_f a = H_g b
{a : B & H_g a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : A, Tr (-1) {b : C & H_f a (h b)} H2: forallb : C, Tr (-1) {a : A & H_f a (h b)} c: C a: A H3: H_f a (h c) b: B p: H_f a = H_g b
H_g b (h c)
exact ((ap10 p (h c)) # H3).
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V
(foralla : B, Tr (-1) {b : C & H_g a (h b)}) *
(forallb : C, Tr (-1) {a : B & H_g a (h b)}) ->
(foralla : A, Tr (-1) {b : C & H_f a (h b)}) *
(forallb : C, Tr (-1) {a : A & H_f a (h b)})
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)}
foralla : A, Tr (-1) {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)}
forallb : C, Tr (-1) {a : A & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)}
foralla : A, Tr (-1) {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A
Tr (-1) {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A
{b : B & H_f a = H_g b} ->
Tr (-1) {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A b: B p: H_f a = H_g b
Tr (-1) {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A b: B p: H_f a = H_g b
Tr (-1) {b0 : C & H_g b (h b0)} ->
Tr (-1) {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A b: B p: H_f a = H_g b
{b0 : C & H_g b (h b0)} -> {b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A b: B p: H_f a = H_g b c: C H3: H_g b (h c)
{b : C & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} a: A b: B p: H_f a = H_g b c: C H3: H_g b (h c)
H_f a (h c)
exact ((ap10 p^ (h c)) # H3).
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)}
forallb : C, Tr (-1) {a : A & H_f a (h b)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C
Tr (-1) {a : A & H_f a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C
{a : B & H_g a (h c)} -> Tr (-1) {a : A & H_f a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C b: B H3: H_g b (h c)
Tr (-1) {a : A & H_f a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C b: B H3: H_g b (h c)
hexists (funa : A => H_f a = H_g b) ->
Tr (-1) {a : A & H_f a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C b: B H3: H_g b (h c)
{a : A & H_f a = H_g b} -> {a : A & H_f a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C b: B H3: H_g b (h c) a: A p: H_f a = H_g b
{a : A & H_f a (h c)}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g H_f: A -> V -> HProp H_g: B -> V -> HProp H_img: equal_img H_f H_g C: Type h: C -> V H1: foralla : B, Tr (-1) {b : C & H_g a (h b)} H2: forallb : C, Tr (-1) {a : B & H_g a (h b)} c: C b: B H3: H_g b (h c) a: A p: H_f a = H_g b
forall (A : Type) (f : A -> V),
(foralla : A, f a ~~ f a) -> set f ~~ set f
ua: Univalence A: Type f: A -> V H_f: foralla : A, f a ~~ f a
set f ~~ set f
ua: Univalence A: Type f: A -> V H_f: foralla : A, f a ~~ f a
foralla : A,
hexists
(funb : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0) (h0 b0)})
=>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0) (h0 b0)})
=>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a) (f b))
ua: Univalence A: Type f: A -> V H_f: foralla : A, f a ~~ f a
forallb : A,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0) (h0 b0)})
=>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0) (h0 b0)})
=>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a) (f b))
ua: Univalence A: Type f: A -> V H_f: foralla : A, f a ~~ f a
foralla : A,
hexists
(funb : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0) (h0 b0)})
=>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0) (h0 b0)})
=>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a) (f b))
intro a; apply tr; existsa; auto.
ua: Univalence A: Type f: A -> V H_f: foralla : A, f a ~~ f a
forallb : A,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0) (h0 b0)})
=>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0) (h0 b0)})
=>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a) (f b))
intro a; apply tr; existsa; auto.Defined.
ua: Univalence
foralluv : V, u = v <~> u ~~ v
ua: Univalence
foralluv : V, u = v <~> u ~~ v
ua: Univalence u, v: V
u = v <~> u ~~ v
ua: Univalence u, v: V
u = v -> u ~~ v
ua: Univalence u, v: V
u ~~ v -> u = v
ua: Univalence u, v: V
u = v -> u ~~ v
intro p; exact (transport (funx => u ~~ x) p (reflexive_bisimulation u)).
ua: Univalence u, v: V
u ~~ v -> u = v
ua: Univalence u, v: V
foralluv : V, u ~~ v -> u = v
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v
forallv : V, set f ~~ v -> set f = v
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V
set f ~~ set g -> set f = set g
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b))
set f = set g
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b))
equal_img f g
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b))
foralla : A, hexists (funb : B => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b))
forallb : B, hexists (funa : A => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b))
foralla : A, hexists (funb : B => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) a: A
hexists (funb : B => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) a: A
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a)) =>
path_iff_hprop
(funX : (foralla : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a : A &
H_h (spushl (...) a) (h0 b0)})
=>
(funb0 : B =>
Trunc_rec
(funX0 : {a : A &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(snd
(funa : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a : A &
H_h (spushl ... a) (h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c)))
(funX : (foralla : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a : B &
H_h (spushr (...) a) (h0 b0)})
=>
(funa : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(fst
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a),
func : C =>
Trunc_rec
(funX0 : {a : B &
H_h (spushr ... a) (h0 c)} =>
Trunc_functor (-1)
(funX1 : {a : A & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a) (g b)) ->
hexists (funb : B => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) a: A
{b : B &
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x)))
(bisim_aux B
(funx : B =>
h
(spushr (fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr (fun (x0 : A) (x1 : B) => R x0 x1)
x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a)) =>
path_iff_hprop
(funX : (foralla : A,
Tr (-1)
{b0 : C &
H_h
(spushl (fun ... ... => R x x0)
a) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a : A &
H_h
(spushl (fun ... ... => R x x0)
a) (h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a : A &
H_h (spushl (...) a) =
H_h (spushr (...) b0)} =>
Trunc_functor (-1)
(funX1 : {b1 : C & H_h (...) (...)}
=>
(X1.1;
transport trunctype_type
(ap10 X0.2 (...)) X1.2))
(fst X X0.1))
(snd
(funa : A =>
Trunc_functor (-1)
(funX0 : {b1 : B & ...} =>
(X0.1; ap H_h (...)))
(fst bitot_R a),
funb1 : B =>
Trunc_functor (-1)
(funX0 : {a : A & ...} =>
(X0.1; ap H_h (...)))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a : A &
H_h (spushl (... => ...) a)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & H_h ... = H_h ...}
=>
(X1.1;
transport trunctype_type
(ap10 X1.2 (...)) X0.2))
(fst
(funa : A =>
Trunc_functor (-1) (... => ...)
(fst bitot_R a),
funb0 : B =>
Trunc_functor (-1) (... => ...)
(snd bitot_R b0)) X0.1))
(snd X c)))
(funX : (foralla : B,
Tr (-1)
{b0 : C &
H_h
(spushr (fun ... ... => R x x0)
a) (h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a : B &
H_h
(spushr (fun ... ... => R x x0)
a) (h0 b0)}) =>
(funa : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (spushl (...) a) =
H_h (spushr (...) b0)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & H_h (...) (...)}
=>
(X1.1;
transport trunctype_type
(ap10 (X0.2)^ (...)) X1.2))
(fst X X0.1))
(fst
(funa0 : A =>
Trunc_functor (-1)
(funX0 : {b0 : B & ...} =>
(X0.1; ap H_h (...)))
(fst bitot_R a0),
funb0 : B =>
Trunc_functor (-1)
(funX0 : {a0 : A & ...} =>
(X0.1; ap H_h (...)))
(snd bitot_R b0)) a),
func : C =>
Trunc_rec
(funX0 : {a : B &
H_h (spushr (... => ...) a)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a : A & H_h ... = H_h ...}
=>
(X1.1;
transport trunctype_type
(ap10 (X1.2)^ (...)) X0.2))
(snd
(funa : A =>
Trunc_functor (-1) (... => ...)
(fst bitot_R a),
funb0 : B =>
Trunc_functor (-1) (... => ...)
(snd bitot_R b0)) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)))) (f a) (g b)} ->
{b : B & f a = g b}
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) a: A b: B h: V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) -> V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a)) =>
path_iff_hprop
(funX : (foralla : A,
Tr (-1)
{b : C &
H_h
(spushl
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) *
(forallb : C,
Tr (-1)
{a : A &
H_h
(spushl
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) =>
(funb : B =>
Trunc_rec
(funX0 : {a : A &
H_h
(spushl
(fun ... ... => R x x0)
a) =
H_h
(spushr
(fun ... ... => R x x0)
b)} =>
Trunc_functor (-1)
(funX1 : {b0 : C &
H_h (spushl (...) X0.1)
(h0 b0)} =>
(X1.1;
transport trunctype_type
(ap10 X0.2 (h0 X1.1)) X1.2))
(fst X X0.1))
(snd
(funa : A =>
Trunc_functor (-1)
(funX0 : {b0 : B & R a b0}
=>
(X0.1;
ap H_h (spglue (...) X0.2)))
(fst bitot_R a),
funb0 : B =>
Trunc_functor (-1)
(funX0 : {a : A & R a b0} =>
(X0.1;
ap H_h (spglue (...) X0.2)))
(snd bitot_R b0)) b),
func : C =>
Trunc_rec
(funX0 : {a : A &
H_h
(spushl
(fun (x : A) (x0 : B)
=> R x x0) a) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b : B &
H_h (spushl ... X0.1) =
H_h (spushr ... b)} =>
(X1.1;
transport trunctype_type
(ap10 X1.2 (h0 c)) X0.2))
(fst
(funa : A =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(fst bitot_R a),
funb : B =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(snd bitot_R b)) X0.1))
(snd X c)))
(funX : (foralla : B,
Tr (-1)
{b : C &
H_h
(spushr
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) *
(forallb : C,
Tr (-1)
{a : B &
H_h
(spushr
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) =>
(funa : A =>
Trunc_rec
(funX0 : {b : B &
H_h
(spushl
(fun ... ... => R x x0)
a) =
H_h
(spushr
(fun ... ... => R x x0)
b)} =>
Trunc_functor (-1)
(funX1 : {b : C &
H_h (spushr (...) X0.1)
(h0 b)} =>
(X1.1;
transport trunctype_type
(ap10 (X0.2)^ (h0 X1.1)) X1.2))
(fst X X0.1))
(fst
(funa0 : A =>
Trunc_functor (-1)
(funX0 : {b : B & R a0 b} =>
(X0.1;
ap H_h (spglue (...) X0.2)))
(fst bitot_R a0),
funb : B =>
Trunc_functor (-1)
(funX0 : {a0 : A & R a0 b} =>
(X0.1;
ap H_h (spglue (...) X0.2)))
(snd bitot_R b)) a),
func : C =>
Trunc_rec
(funX0 : {a : B &
H_h
(spushr
(fun (x : A) (x0 : B)
=> R x x0) a) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a : A &
H_h (spushl ... a) =
H_h (spushr ... X0.1)} =>
(X1.1;
transport trunctype_type
(ap10 (X1.2)^ (h0 c)) X0.2))
(snd
(funa : A =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(fst bitot_R a),
funb : B =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(snd bitot_R b)) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)
{b : B & f a = g b}
existsb; exact (H_f a (g b) h).
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b))
forallb : B, hexists (funa : A => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) b: B
hexists (funa : A => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) b: B
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b : C &
H_h (spushl (...) a0) (h0 b)}) *
(forallb : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0) (h0 b)})
=>
(funb : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) b),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b : B & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b : C &
H_h (spushr (...) a0) (h0 b)}) *
(forallb : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0) (h0 b)})
=>
(funa0 : A =>
Trunc_rec
(funX0 : {b : B &
H_h (...) = H_h (...)} =>
Trunc_functor (-1)
(funX1 : {b : C & ...} =>
(X1.1;
transport trunctype_type (...)
X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type (...)
X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a) (g b)) ->
hexists (funa : A => f a = g b)
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) b: B
{a : A &
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout (fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl (fun (x0 : A) (x1 : B) => R x0 x1)
x)))
(bisim_aux B
(funx : B =>
h
(spushr (fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr (fun (x0 : A) (x1 : B) => R x0 x1)
x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b : C &
H_h
(spushl (fun ... ... => R x x0)
a0) (h0 b)}) *
(forallb : C,
Tr (-1)
{a0 : A &
H_h
(spushl (fun ... ... => R x x0)
a0) (h0 b)}) =>
(funb : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl (...) a0) =
H_h (spushr (...) b)} =>
Trunc_functor (-1)
(funX1 : {b0 : C & H_h (...) (...)}
=>
(X1.1;
transport trunctype_type
(ap10 X0.2 (...)) X1.2))
(fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(funX0 : {b0 : B & ...} =>
(X0.1; ap H_h (...)))
(fst bitot_R a0),
funb0 : B =>
Trunc_functor (-1)
(funX0 : {a0 : A & ...} =>
(X0.1; ap H_h (...)))
(snd bitot_R b0)) b),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl (... => ...) a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b : B & H_h ... = H_h ...}
=>
(X1.1;
transport trunctype_type
(ap10 X1.2 (...)) X0.2))
(fst
(funa0 : A =>
Trunc_functor (-1) (... => ...)
(fst bitot_R a0),
funb : B =>
Trunc_functor (-1) (... => ...)
(snd bitot_R b)) X0.1))
(snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b : C &
H_h
(spushr (fun ... ... => R x x0)
a0) (h0 b)}) *
(forallb : C,
Tr (-1)
{a0 : B &
H_h
(spushr (fun ... ... => R x x0)
a0) (h0 b)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b : B &
H_h (spushl (...) a0) =
H_h (spushr (...) b)} =>
Trunc_functor (-1)
(funX1 : {b : C & H_h (...) (...)}
=>
(X1.1;
transport trunctype_type
(ap10 (X0.2)^ (...)) X1.2))
(fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(funX0 : {b : B & ...} =>
(X0.1; ap H_h (...)))
(fst bitot_R a1),
funb : B =>
Trunc_functor (-1)
(funX0 : {a1 : A & ...} =>
(X0.1; ap H_h (...)))
(snd bitot_R b)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr (... => ...) a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & H_h ... = H_h ...}
=>
(X1.1;
transport trunctype_type
(ap10 (X1.2)^ (...)) X0.2))
(snd
(funa0 : A =>
Trunc_functor (-1) (... => ...)
(fst bitot_R a0),
funb : B =>
Trunc_functor (-1) (... => ...)
(snd bitot_R b)) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)))) (f a) (g b)} ->
{a : A & f a = g b}
ua: Univalence u, v: V A: Type f: A -> V H_f: forall (a : A) (v : V), f a ~~ v -> f a = v B: Type g: B -> V H1: foralla : A,
hexists
(funb : B =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) H2: forallb : B,
hexists
(funa : A =>
V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla0 : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B)
=> R x0 x1) x))
(h0 a0)) =>
path_iff_hprop
(funX : (foralla0 : A,
Tr (-1)
{b0 : C &
H_h (spushl (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : A &
H_h (spushl (...) a0)
(h0 b0)}) =>
(funb0 : B =>
Trunc_rec
(funX0 : {a0 : A &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b1 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(snd
(funa0 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a0),
funb1 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b1)) b0),
func : C =>
Trunc_rec
(funX0 : {a0 : A &
H_h (spushl ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {b0 : B & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(fst
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c)))
(funX : (foralla0 : B,
Tr (-1)
{b0 : C &
H_h (spushr (...) a0)
(h0 b0)}) *
(forallb0 : C,
Tr (-1)
{a0 : B &
H_h (spushr (...) a0)
(h0 b0)}) =>
(funa0 : A =>
Trunc_rec
(funX0 : {b0 : B &
H_h (...) = H_h (...)}
=>
Trunc_functor (-1)
(funX1 : {b0 : C & ...} =>
(X1.1;
transport trunctype_type
(...) X1.2)) (fst X X0.1))
(fst
(funa1 : A =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(fst bitot_R a1),
funb0 : B =>
Trunc_functor (-1)
(fun ... => (X0.1; ...))
(snd bitot_R b0)) a0),
func : C =>
Trunc_rec
(funX0 : {a0 : B &
H_h (spushr ... a0)
(h0 c)} =>
Trunc_functor (-1)
(funX1 : {a0 : A & ...} =>
(X1.1;
transport trunctype_type
(...) X0.2))
(snd
(fun ... =>
Trunc_functor ... ... ...,
fun ... =>
Trunc_functor ... ... ...)
X0.1)) (snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)) b: B a: A h: V_ind (fun_ : V => V -> HProp)
(fun_ : V => istrunc_arrow) bisim_aux
(fun (AB : Type) (R : A -> B -> HProp)
(bitot_R : bitotal R)
(h : SPushout
(fun (x : A) (x0 : B) => R x x0) -> V)
(H_h : SPushout
(fun (x : A) (x0 : B) => R x x0) ->
V -> HProp) =>
transport_const (setext R bitot_R h)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))) @
path_forall
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1) x)))
(V_ind_hprop
(funv : V =>
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) => R x0 x1)
x)) v)
(fun (C : Type) (h0 : C -> V)
(_ : foralla : C,
bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a) =
bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) (h0 a)) =>
path_iff_hprop
(funX : (foralla : A,
Tr (-1)
{b : C &
H_h
(spushl
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) *
(forallb : C,
Tr (-1)
{a : A &
H_h
(spushl
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) =>
(funb : B =>
Trunc_rec
(funX0 : {a : A &
H_h
(spushl
(fun ... ... => R x x0)
a) =
H_h
(spushr
(fun ... ... => R x x0)
b)} =>
Trunc_functor (-1)
(funX1 : {b0 : C &
H_h (spushl (...) X0.1)
(h0 b0)} =>
(X1.1;
transport trunctype_type
(ap10 X0.2 (h0 X1.1)) X1.2))
(fst X X0.1))
(snd
(funa : A =>
Trunc_functor (-1)
(funX0 : {b0 : B & R a b0}
=>
(X0.1;
ap H_h (spglue (...) X0.2)))
(fst bitot_R a),
funb0 : B =>
Trunc_functor (-1)
(funX0 : {a : A & R a b0} =>
(X0.1;
ap H_h (spglue (...) X0.2)))
(snd bitot_R b0)) b),
func : C =>
Trunc_rec
(funX0 : {a : A &
H_h
(spushl
(fun (x : A) (x0 : B)
=> R x x0) a) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {b : B &
H_h (spushl ... X0.1) =
H_h (spushr ... b)} =>
(X1.1;
transport trunctype_type
(ap10 X1.2 (h0 c)) X0.2))
(fst
(funa : A =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(fst bitot_R a),
funb : B =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(snd bitot_R b)) X0.1))
(snd X c)))
(funX : (foralla : B,
Tr (-1)
{b : C &
H_h
(spushr
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) *
(forallb : C,
Tr (-1)
{a : B &
H_h
(spushr
(fun (x : A) (x0 : B) =>
R x x0) a) (h0 b)}) =>
(funa : A =>
Trunc_rec
(funX0 : {b : B &
H_h
(spushl
(fun ... ... => R x x0)
a) =
H_h
(spushr
(fun ... ... => R x x0)
b)} =>
Trunc_functor (-1)
(funX1 : {b : C &
H_h (spushr (...) X0.1)
(h0 b)} =>
(X1.1;
transport trunctype_type
(ap10 (X0.2)^ (h0 X1.1)) X1.2))
(fst X X0.1))
(fst
(funa0 : A =>
Trunc_functor (-1)
(funX0 : {b : B & R a0 b} =>
(X0.1;
ap H_h (spglue (...) X0.2)))
(fst bitot_R a0),
funb : B =>
Trunc_functor (-1)
(funX0 : {a0 : A & R a0 b} =>
(X0.1;
ap H_h (spglue (...) X0.2)))
(snd bitot_R b)) a),
func : C =>
Trunc_rec
(funX0 : {a : B &
H_h
(spushr
(fun (x : A) (x0 : B)
=> R x x0) a) (h0 c)}
=>
Trunc_functor (-1)
(funX1 : {a : A &
H_h (spushl ... a) =
H_h (spushr ... X0.1)} =>
(X1.1;
transport trunctype_type
(ap10 (X1.2)^ (h0 c)) X0.2))
(snd
(funa : A =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(fst bitot_R a),
funb : B =>
Trunc_functor (-1)
(funX1 : ... =>
(X1.1; ap H_h ...))
(snd bitot_R b)) X0.1))
(snd X c))))
(funv : V =>
istrunc_paths HProp (-1)
(bisim_aux A
(funx : A =>
h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : A =>
H_h
(spushl
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)
(bisim_aux B
(funx : B =>
h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x))
(funx : B =>
H_h
(spushr
(fun (x0 : A) (x1 : B) =>
R x0 x1) x)) v)))) (f a)
(g b)
{a : A & f a = g b}
existsa; exact (H_f a (g b) h).Defined.(** ** Canonical presentation of V-sets (Lemma 10.5.6) *)(** Using the regular kernel would lead to a universe inconsistency in the [monic_set_present] lemma later. *)Definitionker_bisim {A} (f : A -> V) (xy : A) := (f x ~~ f y).
ua: Univalence A: Type f: A -> V
forallxy : A, f x = f y <~> ker_bisim f x y
ua: Univalence A: Type f: A -> V
forallxy : A, f x = f y <~> ker_bisim f x y
intros; apply bisimulation_equiv_id.Defined.SectionMonicSetPresent_Uniqueness.(** Given [u : V], we want to show that the representation [u = @set Au mu], where [Au] is an hSet and [mu] is monic, is unique. *)Context {u : V} {AuAu': Type} {h : IsHSet Au} {h' : IsHSet Au'} {mu : Au -> V} {mono : IsEmbedding mu}
{mu' : Au' -> V} {mono' : IsEmbedding mu'} {p : u = set mu} {p' : u = set mu'}.
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu'
(foralla : Au, {a' : Au' & mu' a' = mu a}) *
(foralla' : Au', {a : Au & mu a = mu' a'})
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu'
(foralla : Au, {a' : Au' & mu' a' = mu a}) *
(foralla' : Au', {a : Au & mu a = mu' a'})
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu'
foralla : Au, {a' : Au' & mu' a' = mu a}
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu'
foralla' : Au', {a : Au & mu a = mu' a'}
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu'
foralla : Au, {a' : Au' & mu' a' = mu a}
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' a: Au
{a' : Au' & mu' a' = mu a}
exact (@untrunc_istrunc (-1) _ (mono' (mu a)) (transport (funx => mu a ∈ x) (p^ @ p') (tr (a; 1)))).
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu'
foralla' : Au', {a : Au & mu a = mu' a'}
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' a': Au'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au
e o inv_e == idmap
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au
e o inv_e == idmap
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au a': Au'
e (inv_e a') = a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au a': Au'
mu' (e (inv_e a')) = mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au a': Au'
mu' (e (inv_e a')) = mu (inv_e a')
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au a': Au'
mu (inv_e a') = mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au a': Au'
mu' (e (inv_e a')) = mu (inv_e a')
exact (pr2 (fst eq_img_untrunc (inv_e a'))).
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au a': Au'
mu (inv_e a') = mu' a'
exact (pr2 (snd eq_img_untrunc a')).Defined.
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap
inv_e o e == idmap
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap
inv_e o e == idmap
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap a: Au
inv_e (e a) = a
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap a: Au
mu (inv_e (e a)) = mu a
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap a: Au
mu (inv_e (e a)) = mu' (e a)
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap a: Au
mu' (e a) = mu a
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap a: Au
mu (inv_e (e a)) = mu' (e a)
exact (pr2 (snd eq_img_untrunc (e a))).
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap a: Au
mu' (e a) = mu a
exact (pr2 (fst eq_img_untrunc a)).Defined.
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap
Au' = Au
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap
Au' = Au
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap
Au' <~> Au
exact (equiv_adjointify inv_e e hom2 hom1).Defined.
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport (funA : Type => A -> V) path^ mu = mu'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport (funA : Type => A -> V) path^ mu = mu'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport (funA : Type => A -> V) path^ mu == mu'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (funA : Type => A -> V) path^ mu a' =
mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (funA : Type => A -> V) path^ mu a' =
transport (fun_ : Type => V) path^
(mu (transport idmap (path^)^ a'))
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (fun_ : Type => V) path^
(mu (transport idmap (path^)^ a')) =
mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (funA : Type => A -> V) path^ mu a' =
transport (fun_ : Type => V) path^
(mu (transport idmap (path^)^ a'))
exact (@transport_arrow Type (funX : Type => X) (funX => V) Au Au' path^ mu a').
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (fun_ : Type => V) path^
(mu (transport idmap (path^)^ a')) = mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (fun_ : Type => V) path^
(mu (transport idmap (path^)^ a')) =
mu (transport idmap (path^)^ a')
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
mu (transport idmap (path^)^ a') = mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport (fun_ : Type => V) path^
(mu (transport idmap (path^)^ a')) =
mu (transport idmap (path^)^ a')
apply transport_const.
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
mu (transport idmap (path^)^ a') = mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
mu (transport idmap (path^)^ a') = mu (inv_e a')
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
mu (inv_e a') = mu' a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
mu (transport idmap (path^)^ a') = mu (inv_e a')
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport idmap (path^)^ a' = inv_e a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport idmap (path^)^ a' = transport idmap path a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport idmap path a' = inv_e a'
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport idmap (path^)^ a' = transport idmap path a'
exact (ap (funx => transport idmap x a') (inv_V path)).
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au a': Au'
transport idmap path a' = inv_e a'
apply transport_path_universe.Defined.
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
{p0 : Au = Au' &
transport
(funA : Type =>
{m : A -> V &
IsHSet A * IsEmbedding m * (u = set m)}) p0
(mu; (h, mono, p)) = (mu'; (h', mono', p'))}
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport
(funA : Type =>
{m : A -> V &
IsHSet A * IsEmbedding m * (u = set m)}) path^
(mu; (h, mono, p)) = (mu'; (h', mono', p'))
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport
(funA : Type =>
{m : A -> V &
IsHSet A * IsEmbedding m * (u = set m)}) path^
(mu; (h, mono, p)) =
(transport (funA : Type => A -> V) path^ mu;
transportD (funA : Type => A -> V)
(fun (A : Type) (m : (funA0 : Type => A0 -> V) A)
=> IsHSet A * IsEmbedding m * (u = set m)) path^ mu
(h, mono, p))
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
(transport (funA : Type => A -> V) path^ mu;
transportD (funA : Type => A -> V)
(fun (A : Type) (m : (funA0 : Type => A0 -> V) A)
=> IsHSet A * IsEmbedding m * (u = set m)) path^ mu
(h, mono, p)) = (mu'; (h', mono', p'))
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport
(funA : Type =>
{m : A -> V &
IsHSet A * IsEmbedding m * (u = set m)}) path^
(mu; (h, mono, p)) =
(transport (funA : Type => A -> V) path^ mu;
transportD (funA : Type => A -> V)
(fun (A : Type) (m : (funA0 : Type => A0 -> V) A)
=> IsHSet A * IsEmbedding m * (u = set m)) path^ mu
(h, mono, p))
exact (@transport_sigma Type (funA => A -> V) (funAm => IsHSet A * IsEmbedding m * (u = set m)) Au Au' path^ (mu; (h, mono, p))).
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
(transport (funA : Type => A -> V) path^ mu;
transportD (funA : Type => A -> V)
(fun (A : Type) (m : (funA0 : Type => A0 -> V) A)
=> IsHSet A * IsEmbedding m * (u = set m)) path^ mu
(h, mono, p)) = (mu'; (h', mono', p'))
ua: Univalence u: V Au, Au': Type h: IsHSet Au h': IsHSet Au' mu: Au -> V mono: IsEmbedding mu mu': Au' -> V mono': IsEmbedding mu' p: u = set mu p': u = set mu' e:= funa : Au => (fst eq_img_untrunc a).1: Au -> Au' inv_e:= funa' : Au' => (snd eq_img_untrunc a').1: Au' -> Au hom1:= (funa' : Au' =>
isinj_embedding mu' mono'
(e (inv_e a')) a'
((fst eq_img_untrunc (inv_e a')).2 @
(snd eq_img_untrunc a').2))
:
e o inv_e == idmap: e o inv_e == idmap hom2:= (funa : Au =>
isinj_embedding mu mono
(inv_e (e a)) a
((snd eq_img_untrunc (e a)).2 @
(fst eq_img_untrunc a).2))
:
inv_e o e == idmap: inv_e o e == idmap path:= path_universe_uncurried
(equiv_adjointify inv_e e hom2 hom1): Au' = Au
transport (funA : Type => A -> V) path^ mu = mu'
exact mu_eq_mu'.Defined.EndMonicSetPresent_Uniqueness.(** This lemma actually says a little more than 10.5.6, i.e., that Au is a hSet *)
ua: Univalence
forallu : V,
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (u = set m)}}
ua: Univalence
forallu : V,
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (u = set m)}}
ua: Univalence
forall (A : Type) (f : A -> V),
(foralla : A,
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (f a = set m)}}) ->
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (set f = set m)}}
ua: Univalence
forallv : V,
IsHProp
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (v = set m)}}
ua: Univalence
forall (A : Type) (f : A -> V),
(foralla : A,
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (f a = set m)}}) ->
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (set f = set m)}}
ua: Univalence A: Type f: A -> V
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (set f = set m)}}
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (set f = set m)}}
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
IsHSet Au * IsEmbedding mu * (set f = set mu)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
set f = set mu
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
foralla : A, hexists (funb : Au => f a = mu b)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
forallb : Au, hexists (funa : A => f a = mu b)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
foralla : A, hexists (funb : Au => f a = mu b)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a: A
hexists (funb : Au => f a = mu b)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a: A
f a = mu (eu a)
exact (ap10 factor a).
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x))
forallb : Au, hexists (funa : A => f a = mu b)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au
hexists (funa : A => f a = mu a')
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au
ReflectiveSubuniverse.IsConnected (Tr (-1))
(hfiber eu a') -> hexists (funa : A => f a = mu a')
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a')
hfiber eu a' -> {a : A & f a = mu a'}
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a') a: A p: eu a = a'
{a : A & f a = mu a'}
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a') a: A p: eu a = a'
f a = mu a'
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a') a: A p: eu a = a'
f a = mu (eu a)
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a') a: A p: eu a = a'
mu (eu a) = mu a'
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a') a: A p: eu a = a'
f a = mu (eu a)
exact (ap10 factor a).
ua: Univalence A: Type f: A -> V Au: Type eu: A -> Au mu: Au -> V hset_Au: IsHSet Au epi_eu: ReflectiveSubuniverse.IsConnMap (Tr (-1)) eu mono_mu: IsEmbedding mu factor: f = (funx : A => mu (eu x)) a': Au IC: ReflectiveSubuniverse.IsConnected
(Tr (-1)) (hfiber eu a') a: A p: eu a = a'
mu (eu a) = mu a'
exact (ap mu p).
ua: Univalence
forallv : V,
IsHProp
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (v = set m)}}
ua: Univalence v: V
IsHProp
{Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (v = set m)}}
ua: Univalence v: V
forallxy : {Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (v = set m)}}, x = y
ua: Univalence v: V Au: Type mu: Au -> V hset: IsHSet Au mono: IsEmbedding mu p: v = set mu
forally : {Au : Type &
{m : Au -> V &
IsHSet Au * IsEmbedding m * (v = set m)}},
(Au; mu; (hset, mono, p)) = y
ua: Univalence v: V Au: Type mu: Au -> V hset: IsHSet Au mono: IsEmbedding mu p: v = set mu Au': Type mu': Au' -> V hset': IsHSet Au' mono': IsEmbedding mu' p': v = set mu'
exact monic_set_present_uniqueness.Defined.Definitiontype_of_members (u : V) : Type := pr1 (monic_set_present u).Notation"[ u ]" := (type_of_members u) : set_scope.Definitionfunc_of_members {u : V} : [u] -> V := pr1 (pr2 (monic_set_present u)) : [u] -> V.Definitionis_hset_typeofmembers {u : V} : IsHSet ([u]) := fst (fst (pr2 (pr2 (monic_set_present u)))).DefinitionIsEmbedding_funcofmembers {u : V} : IsEmbedding func_of_members := snd (fst (pr2 (pr2 (monic_set_present u)))).Definitionis_valid_presentation (u : V) : u = set func_of_members := snd (pr2 (pr2 (monic_set_present u))).(** ** Lemmas 10.5.8 (i) & (vii), we put them here because they are useful later *)
ua: Univalence
forallxy : V, x ⊆ y * y ⊆ x <-> x = y
ua: Univalence
forallxy : V, x ⊆ y * y ⊆ x <-> x = y
ua: Univalence
forall (A : Type) (f : A -> V),
(forall (a : A) (y : V), f a ⊆ y * y ⊆ f a <-> f a = y) ->
forally : V, set f ⊆ y * y ⊆ set f <-> set f = y
ua: Univalence A: Type f: A -> V
forally : V, set f ⊆ y * y ⊆ set f <-> set f = y
ua: Univalence A: Type f: A -> V
forall (A0 : Type) (f0 : A0 -> V),
(foralla : A0,
set f ⊆ f0 a * f0 a ⊆ set f <-> set f = f0 a) ->
set f ⊆ set f0 * set f0 ⊆ set f <-> set f = set f0
ua: Univalence A: Type f: A -> V B: Type g: B -> V
set f ⊆ set g * set g ⊆ set f <-> set f = set g
ua: Univalence A: Type f: A -> V B: Type g: B -> V
set f ⊆ set g * set g ⊆ set f -> set f = set g
ua: Univalence A: Type f: A -> V B: Type g: B -> V
set f = set g -> set f ⊆ set g * set g ⊆ set f
ua: Univalence A: Type f: A -> V B: Type g: B -> V
set f ⊆ set g * set g ⊆ set f -> set f = set g
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f
set f = set g
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f
equal_img f g
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f
foralla : A, hexists (funb : B => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f
forallb : B, hexists (funa : A => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f
foralla : A, hexists (funb : B => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f a: A
hexists (funb : B => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f a: A
{a0 : B & g a0 = f a} ->
hexists (funb : B => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f a: A b: B p: g b = f a
hexists (funb : B => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f a: A b: B p: g b = f a
{b : B & f a = g b}
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f a: A b: B p: g b = f a
f a = g b
exact p^.
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f
forallb : B, hexists (funa : A => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f b: B
hexists (funa : A => f a = g b)
ua: Univalence A: Type f: A -> V B: Type g: B -> V H1: set f ⊆ set g H2: set g ⊆ set f b: B
g b ∈ set g
apply tr; existsb; reflexivity.
ua: Univalence A: Type f: A -> V B: Type g: B -> V
set f = set g -> set f ⊆ set g * set g ⊆ set f
ua: Univalence A: Type f: A -> V B: Type g: B -> V p: set f = set g
set f ⊆ set g
ua: Univalence A: Type f: A -> V B: Type g: B -> V p: set f = set g
set g ⊆ set f
ua: Univalence A: Type f: A -> V B: Type g: B -> V p: set f = set g
set f ⊆ set g
ua: Univalence A: Type f: A -> V B: Type g: B -> V p: set f = set g z: V Hz: z ∈ set f
z ∈ set g
exact (transport (funx => z ∈ x) p Hz).
ua: Univalence A: Type f: A -> V B: Type g: B -> V p: set f = set g
set g ⊆ set f
ua: Univalence A: Type f: A -> V B: Type g: B -> V p: set f = set g z: V Hz: z ∈ set g
z ∈ set f
exact (transport (funx => z ∈ x) p^ Hz).Qed.
ua: Univalence C: V -> HProp
(forallv : V, (forallx : V, x ∈ v -> C x) -> C v) ->
forallv : V, C v
ua: Univalence C: V -> HProp
(forallv : V, (forallx : V, x ∈ v -> C x) -> C v) ->
forallv : V, C v
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v
forallv : V, C v
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v
forall (A : Type) (f : A -> V),
(foralla : A, C (f a)) -> C (set f)
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v A: Type f: A -> V H_f: foralla : A, C (f a)
C (set f)
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v A: Type f: A -> V H_f: foralla : A, C (f a)
forallx : V, x ∈ set f -> C x
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v A: Type f: A -> V H_f: foralla : A, C (f a) x: V Hx: x ∈ set f
C x
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v A: Type f: A -> V H_f: foralla : A, C (f a) x: V Hx: x ∈ set f
{a : A & f a = x} -> C x
ua: Univalence C: V -> HProp H: forallv : V, (forallx : V, x ∈ v -> C x) -> C v A: Type f: A -> V H_f: foralla : A, C (f a) x: V Hx: x ∈ set f a: A p: f a = x
C x
exact (transport C p (H_f a)).Defined.(** ** Two useful lemmas *)
ua: Univalence
Irreflexive (funxx0 : V => x ∈ x0)
ua: Univalence
Irreflexive (funxx0 : V => x ∈ x0)
ua: Univalence
forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v)
ua: Univalence X: forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v)
Irreflexive (funxx0 : V => x ∈ x0)
ua: Univalence
forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v)
ua: Univalence v: V
IsHProp (complement (funxx0 : V => x ∈ x0) v v)
ua: Univalence v: V
IsHProp (~ v ∈ v)
exact _.
ua: Univalence X: forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v)
Irreflexive (funxx0 : V => x ∈ x0)
ua: Univalence X: forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v)
forallv : V,
(forallx : V, x ∈ v -> ~ x ∈ x) -> ~ v ∈ v
ua: Univalence X: forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v) v: V H: forallx : V, x ∈ v -> ~ x ∈ x
~ v ∈ v
ua: Univalence X: forallv : V,
IsHProp (complement (funxx0 : V => x ∈ x0) v v) v: V H: forallx : V, x ∈ v -> ~ x ∈ x Hv: v ∈ v
Empty
exact (H v Hv Hv).Defined.
ua: Univalence A, B: Type f: A -> V g: B -> V
set f = set g -> equal_img f g
ua: Univalence A, B: Type f: A -> V g: B -> V
set f = set g -> equal_img f g
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g
equal_img f g
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g
foralla : A, hexists (funb : B => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g
forallb : B, hexists (funa : A => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g
foralla : A, hexists (funb : B => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A
hexists (funb : B => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A
f a ∈ set g
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A H: f a ∈ set g
hexists (funb : B => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A
f a ∈ set g
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A
f a ∈ set f
apply tr; existsa; reflexivity.
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A H: f a ∈ set g
hexists (funb : B => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A H: f a ∈ set g
{a0 : B & g a0 = f a} -> {b : B & f a = g b}
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g a: A H: f a ∈ set g b: B p': g b = f a
{b : B & f a = g b}
existsb; exact p'^.
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g
forallb : B, hexists (funa : A => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B
hexists (funa : A => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B
g b ∈ set f
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B H: g b ∈ set f
hexists (funa : A => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B
g b ∈ set f
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B
g b ∈ set g
apply tr; existsb; reflexivity.
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B H: g b ∈ set f
hexists (funa : A => f a = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B H: g b ∈ set f
{a : A & f a = g b} -> {a : A & f a = g b}
ua: Univalence A, B: Type f: A -> V g: B -> V p: set f = set g b: B H: g b ∈ set f a: A p': f a = g b
{a : A & f a = g b}
existsa; exact p'.Defined.(** ** Definitions of particular sets in V *)(** The empty set *)DefinitionV_empty : V := set (Empty_ind (fun_ => V)).(** The singleton {u} *)DefinitionV_singleton (u : V) : V@{U' U} := set (Unit_ind u).
ua: Univalence u, v: V
IsEquiv (ap V_singleton)
ua: Univalence u, v: V
IsEquiv (ap V_singleton)
ua: Univalence u, v: V
V_singleton u = V_singleton v -> u = v
ua: Univalence u, v: V
V_singleton u = V_singleton v -> u = v
ua: Univalence u, v: V H: V_singleton u = V_singleton v
u = v
ua: Univalence u, v: V H: V_singleton u = V_singleton v
equal_img (Unit_ind u) (Unit_ind v) -> u = v
ua: Univalence u, v: V H: V_singleton u = V_singleton v H1: foralla : Unit,
hexists
(funb : Unit => Unit_ind u a = Unit_ind v b) H2: forallb : Unit,
hexists
(funa : Unit => Unit_ind u a = Unit_ind v b)
u = v
ua: Univalence u, v: V H: V_singleton u = V_singleton v H1: foralla : Unit,
hexists
(funb : Unit => Unit_ind u a = Unit_ind v b) H2: forallb : Unit,
hexists
(funa : Unit => Unit_ind u a = Unit_ind v b)
{b : Unit & Unit_ind u tt = Unit_ind v b} -> u = v
ua: Univalence u, v: V H: V_singleton u = V_singleton v H1: foralla : Unit,
hexists
(funb : Unit => Unit_ind u a = Unit_ind v b) H2: forallb : Unit,
hexists
(funa : Unit => Unit_ind u a = Unit_ind v b) t: Unit p: Unit_ind u tt = Unit_ind v t
u = v
destruct t; exact p.}Defined.(** The pair {u,v} *)DefinitionV_pair (u : V) (v : V) : V@{U' U} := set (funb : Bool => if b then u else v).
ua: Univalence u, v, u', v': V
(u = u') * (v = v') -> V_pair u v = V_pair u' v'
ua: Univalence u, v, u', v': V
(u = u') * (v = v') -> V_pair u v = V_pair u' v'
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
V_pair u v = V_pair u' v'
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
equal_img (funb : Bool => if b then u else v)
(funb : Bool => if b then u' else v')
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
foralla : Bool,
hexists
(funb : Bool =>
(if a then u else v) = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
forallb : Bool,
hexists
(funa : Bool =>
(if a then u else v) = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
foralla : Bool,
hexists
(funb : Bool =>
(if a then u else v) = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funb : Bool => u = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funb : Bool => v = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funb : Bool => u = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
u = u'
assumption.
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funb : Bool => v = (if b then u' else v'))
apply tr; existsfalse; assumption.
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
forallb : Bool,
hexists
(funa : Bool =>
(if a then u else v) = (if b then u' else v'))
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funa : Bool => (if a then u else v) = u')
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funa : Bool => (if a then u else v) = v')
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funa : Bool => (if a then u else v) = u')
apply tr; existstrue; assumption.
ua: Univalence u, v, u', v': V H1: u = u' H2: v = v'
hexists (funa : Bool => (if a then u else v) = v')
apply tr; existsfalse; assumption.Defined.
ua: Univalence u, v, w: V
V_pair u v = V_singleton w <-> (u = w) * (v = w)
ua: Univalence u, v, w: V
V_pair u v = V_singleton w <-> (u = w) * (v = w)
ua: Univalence u, v, w: V
V_pair u v = V_singleton w -> (u = w) * (v = w)
ua: Univalence u, v, w: V
(u = w) * (v = w) -> V_pair u v = V_singleton w
ua: Univalence u, v, w: V
V_pair u v = V_singleton w -> (u = w) * (v = w)
ua: Univalence u, v, w: V H: V_pair u v = V_singleton w
(u = w) * (v = w)
ua: Univalence u, v, w: V H: V_pair u v = V_singleton w H1: foralla : Bool,
hexists
(funb : Unit =>
(if a then u else v) = Unit_ind w b) H2: forallb : Unit,
hexists
(funa : Bool =>
(if a then u else v) = Unit_ind w b)
(u = w) * (v = w)
ua: Univalence u, v, w: V H: V_pair u v = V_singleton w H1: foralla : Bool,
hexists
(funb : Unit =>
(if a then u else v) = Unit_ind w b) H2: forallb : Unit,
hexists
(funa : Bool =>
(if a then u else v) = Unit_ind w b)
{b : Unit & u = Unit_ind w b} -> (u = w) * (v = w)
ua: Univalence u, v, w: V H: V_pair u v = V_singleton w H1: foralla : Bool,
hexists
(funb : Unit =>
(if a then u else v) = Unit_ind w b) H2: forallb : Unit,
hexists
(funa : Bool =>
(if a then u else v) = Unit_ind w b) p: u = Unit_ind w tt
(u = w) * (v = w)
ua: Univalence u, v, w: V H: V_pair u v = V_singleton w H1: foralla : Bool,
hexists
(funb : Unit =>
(if a then u else v) = Unit_ind w b) H2: forallb : Unit,
hexists
(funa : Bool =>
(if a then u else v) = Unit_ind w b) p: u = Unit_ind w tt
{b : Unit & v = Unit_ind w b} -> (u = w) * (v = w)
ua: Univalence u, v, w: V H: V_pair u v = V_singleton w H1: foralla : Bool,
hexists
(funb : Unit =>
(if a then u else v) = Unit_ind w b) H2: forallb : Unit,
hexists
(funa : Bool =>
(if a then u else v) = Unit_ind w b) p: u = Unit_ind w tt p': v = Unit_ind w tt
(u = w) * (v = w)
split; [exact p| exact p'].
ua: Univalence u, v, w: V
(u = w) * (v = w) -> V_pair u v = V_singleton w
ua: Univalence u, v, w: V p1: u = w p2: v = w
V_pair u v = V_singleton w
ua: Univalence u, v, w: V p1: u = w p2: v = w
foralla : Bool,
hexists
(funb : Unit => (if a then u else v) = Unit_ind w b)
ua: Univalence u, v, w: V p1: u = w p2: v = w
forallb : Unit,
hexists
(funa : Bool => (if a then u else v) = Unit_ind w b)
ua: Univalence u, v, w: V p1: u = w p2: v = w
foralla : Bool,
hexists
(funb : Unit => (if a then u else v) = Unit_ind w b)
ua: Univalence u, v, w: V p1: u = w p2: v = w a: Bool
(if a then u else v) = Unit_ind w tt
destruct a; [exact p1 | exact p2].
ua: Univalence u, v, w: V p1: u = w p2: v = w
forallb : Unit,
hexists
(funa : Bool => (if a then u else v) = Unit_ind w b)
ua: Univalence u, v, w: V p1: u = w p2: v = w t: Unit
u = Unit_ind w t
destruct t; exact p1.Defined.(** The ordered pair (u,v) *)DefinitionV_pair_ord (u : V) (v : V) : V := V_pair (V_singleton u) (V_pair u v).Notation" [ u , v ] " := (V_pair_ord u v) : set_scope.
ua: Univalence a, b, c, d: V
[a, b] = [c, d] <-> (a = c) * (b = d)
ua: Univalence a, b, c, d: V
[a, b] = [c, d] <-> (a = c) * (b = d)
ua: Univalence a, b, c, d: V
[a, b] = [c, d] -> (a = c) * (b = d)
ua: Univalence a, b, c, d: V
(a = c) * (b = d) -> [a, b] = [c, d]
ua: Univalence a, b, c, d: V
[a, b] = [c, d] -> (a = c) * (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
(a = c) * (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
(a = c) * (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
V_singleton a ∈ [c, d]
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d]
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
V_singleton a ∈ [c, d]
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
V_singleton a ∈ [a, b]
ua: Univalence a, b, c, d: V p: [a, b] = [c, d]
Tr (-1)
{a0 : Bool &
(if a0 then V_singleton a else V_pair a b) =
V_singleton a}
apply tr; existstrue; reflexivity.
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d]
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d]
{a0 : Bool &
(if a0 then V_singleton c else V_pair c d) =
V_singleton a} -> a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d] p': V_singleton c = V_singleton a
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d] p': V_pair c d = V_singleton a
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d] p': V_singleton c = V_singleton a
a = c
exact ((ap V_singleton)^-1 p'^).
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] H: V_singleton a ∈ [c, d] p': V_pair c d = V_singleton a
a = c
symmetry; apply (fst pair_eq_singleton p').
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
(a = c) * (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
a = c
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
a = c
exact p1.
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d)
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
V_pair a b ∈ [c, d]
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d]
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
V_pair a b ∈ [c, d]
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c
V_pair a b ∈ [a, b]
apply tr; existsfalse; reflexivity.
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d]
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d]
{a0 : Bool &
(if a0 then V_singleton c else V_pair c d) =
V_pair a b} -> hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_singleton c = V_pair a b
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_singleton c = V_pair a b
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_singleton c = V_pair a b
b = c
apply (fst pair_eq_singleton p'^).
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b H1: foralla0 : Bool,
hexists
(funb0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) H2: forallb0 : Bool,
hexists
(funa0 : Bool =>
(if a0 then c else d) = (if b0 then a else b))
hor (b = c) (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b H1: foralla0 : Bool,
hexists
(funb0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) H2: forallb0 : Bool,
hexists
(funa0 : Bool =>
(if a0 then c else d) = (if b0 then a else b))
{a : Bool & (if a then c else d) = b} ->
(b = c) + (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b H1: foralla0 : Bool,
hexists
(funb0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) H2: forallb0 : Bool,
hexists
(funa0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) p'': c = b
(b = c) + (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b H1: foralla0 : Bool,
hexists
(funb0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) H2: forallb0 : Bool,
hexists
(funa0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) p'': d = b
(b = c) + (b = d)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b H1: foralla0 : Bool,
hexists
(funb0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) H2: forallb0 : Bool,
hexists
(funa0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) p'': c = b
(b = c) + (b = d)
left; exact p''^.
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H': V_pair a b ∈ [c, d] p': V_pair c d = V_pair a b H1: foralla0 : Bool,
hexists
(funb0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) H2: forallb0 : Bool,
hexists
(funa0 : Bool =>
(if a0 then c else d) = (if b0 then a else b)) p'': d = b
(b = c) + (b = d)
right; exact p''^.
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d)
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d)
(b = c) + (b = d) -> b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = d
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
[a, b] = V_singleton (V_singleton b)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c H': [a, b] = V_singleton (V_singleton b)
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
[a, b] = V_singleton (V_singleton b)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
(V_singleton a = V_singleton b) *
(V_pair a b = V_singleton b)
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
V_singleton a = V_singleton b
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
V_pair a b = V_singleton b
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
V_singleton a = V_singleton b
apply ap; exact (p1 @ p'^).
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
V_pair a b = V_singleton b
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c
(a = b) * (b = b)
split; [exact (p1 @ p'^) | reflexivity].
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c H': [a, b] = V_singleton (V_singleton b)
b = d
ua: Univalence a, b, c, d: V p: [a, b] = [c, d] p1: a = c H: hor (b = c) (b = d) p': b = c H': [a, b] = V_singleton (V_singleton b) H'': V_pair c d = V_singleton b
b = d
symmetry; apply (fst pair_eq_singleton H'').
ua: Univalence a, b, c, d: V
(a = c) * (b = d) -> [a, b] = [c, d]
ua: Univalence a, b, c, d: V p: a = c p': b = d
[a, b] = [c, d]
ua: Univalence a, b, c, d: V p: a = c p': b = d
(V_singleton a = V_singleton c) *
(V_pair a b = V_pair c d)
ua: Univalence a, b, c, d: V p: a = c p': b = d
V_singleton a = V_singleton c
ua: Univalence a, b, c, d: V p: a = c p': b = d
V_pair a b = V_pair c d
ua: Univalence a, b, c, d: V p: a = c p': b = d
V_singleton a = V_singleton c
apply ap; exact p.
ua: Univalence a, b, c, d: V p: a = c p': b = d
V_pair a b = V_pair c d
ua: Univalence a, b, c, d: V p: a = c p': b = d
(a = c) * (b = d)
split; assumption; assumption.Defined.(** The cartesian product a × b *)DefinitionV_cart_prod (a : V) (b : V) : V
:= set (funx : [a] * [b] => [func_of_members (fst x), func_of_members (snd x)]).Notation" a × b " := (V_cart_prod a b) : set_scope.(** f is a function with domain a and codomain b *)DefinitionV_is_func (a : V) (b : V) (f : V) := f ⊆ (a × b)
* (forallx, x ∈ a -> hexists (funy => y ∈ b * [x,y] ∈ f))
* (forallxyy', [x,y] ∈ f * [x,y'] ∈ f -> y = y').(** The set of functions from a to b *)DefinitionV_func (a : V) (b : V) : V
:= @set ([a] -> [b]) (funf => set (funx => [func_of_members x, func_of_members (f x)] )).(** The union of a set Uv *)DefinitionV_union (v : V) :=
@set ({x : [v] & [func_of_members x]}) (funz => func_of_members (pr2 z)).(** The ordinal successor x ∪ {x} *)
ua: Univalence
V -> V
ua: Univalence
V -> V
ua: Univalence
forallA : Type, (A -> V) -> (A -> V) -> V
ua: Univalence
forall (AB : Type) (f : A -> V) (g : B -> V),
equal_img f g ->
forall (H_f : A -> V) (H_g : B -> V),
equal_img H_f H_g -> ?H_set A f H_f = ?H_set B g H_g
ua: Univalence
forallA : Type, (A -> V) -> (A -> V) -> V
ua: Univalence A: Type f: A -> V
V
exact (set (fun (x : A + Unit) => match x with inl a => f a
| inr tt => set f end)).
ua: Univalence
forall (AB : Type) (f : A -> V) (g : B -> V),
equal_img f g ->
forall (H_f : A -> V) (H_g : B -> V),
equal_img H_f H_g ->
(fun (A0 : Type) (f0_ : A0 -> V) =>
set
(funx : A0 + Unit =>
match x with
| inl a => f0 a
| inr tt => set f0
end)) A f H_f =
(fun (A0 : Type) (f0_ : A0 -> V) =>
set
(funx : A0 + Unit =>
match x with
| inl a => f0 a
| inr tt => set f0
end)) B g H_g
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
set
(funx : A + Unit =>
match x with
| inl a => f a
| inr tt => set f
end) =
set
(funx : B + Unit =>
match x with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
equal_img
(funx : A + Unit =>
match x with
| inl a => f a
| inr tt => set f
end)
(funx : B + Unit =>
match x with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
foralla : A + Unit,
hexists
(funb : B + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end =
match b with
| inl a0 => g a0
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
forallb : B + Unit,
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end =
match b with
| inl a0 => g a0
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
foralla : A + Unit,
hexists
(funb : B + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end =
match b with
| inl a0 => g a0
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g a: A + Unit
hexists
(funb : B + Unit =>
match a with
| inl a => f a
| inr tt => set f
end =
match b with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g a: A
hexists
(funb : B + Unit =>
f a =
match b with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g u: Unit
hexists
(funb : B + Unit =>
match u with
| tt => set f
end =
match b with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g a: A
hexists
(funb : B + Unit =>
f a =
match b with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g a: A
hexists (funb : B => f a = g b) ->
hexists
(funb : B + Unit =>
f a =
match b with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g a: A
{b : B & f a = g b} ->
{b : B + Unit &
f a =
match b with
| inl a => g a
| inr tt => set g
end}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g a: A b: B p: f a = g b
{b : B + Unit &
f a =
match b with
| inl a => g a
| inr tt => set g
end}
exists (inlb); exact p.
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g u: Unit
hexists
(funb : B + Unit =>
match u with
| tt => set f
end =
match b with
| inl a => g a
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g u: Unit
match u with
| tt => set f
end = set g
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
set f = set g
apply setext'; auto.
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
forallb : B + Unit,
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end =
match b with
| inl a0 => g a0
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g b: B + Unit
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end =
match b with
| inl a0 => g a0
| inr tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g b: B
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g u: Unit
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end = match u with
| tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g b: B
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g b: B
hexists (funa : A => f a = g b) ->
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end = g b)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g b: B
{a : A & f a = g b} ->
{a : A + Unit &
match a with
| inl a0 => f a0
| inr tt => set f
end = g b}
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g b: B a: A p: f a = g b
{a : A + Unit &
match a with
| inl a0 => f a0
| inr tt => set f
end = g b}
exists (inla); exact p.
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g u: Unit
hexists
(funa : A + Unit =>
match a with
| inl a0 => f a0
| inr tt => set f
end = match u with
| tt => set g
end)
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g u: Unit
set f = match u with
| tt => set g
end
ua: Univalence A, B: Type f: A -> V g: B -> V eq_img: equal_img f g
set f = set g
apply setext'; auto.Defined.(** The set of finite ordinals *)DefinitionV_omega : V
:= set (fix I n := match n with0 => V_empty
| S n => V_succ (I n) end).(** ** Axioms of set theory (theorem 10.5.8) *)
V_empty ∈ V_omega *
(forallx : V, x ∈ V_omega -> V_succ x ∈ V_omega)
ua: Univalence
V_empty ∈ V_omega *
(forallx : V, x ∈ V_omega -> V_succ x ∈ V_omega)
ua: Univalence
V_empty ∈ V_omega
ua: Univalence
forallx : V, x ∈ V_omega -> V_succ x ∈ V_omega
ua: Univalence
V_empty ∈ V_omega
apply tr; exists0; auto.
ua: Univalence
forallx : V, x ∈ V_omega -> V_succ x ∈ V_omega
ua: Univalence x: V
x ∈ V_omega -> V_succ x ∈ V_omega
ua: Univalence x: V
{a : nat &
(fix I (n : nat) : V :=
match n with
| 0 => V_empty
| n0.+1 => V_succ (I n0)
end) a = x} ->
{a : nat &
(fix I (n : nat) : V :=
match n with
| 0 => V_empty
| n0.+1 => V_succ (I n0)
end) a = V_succ x}
ua: Univalence x: V n: nat p: (fix I (n : nat) : V :=
match n with
| 0 => V_empty
| n0.+1 => V_succ (I n0)
end) n = x
{a : nat &
(fix I (n : nat) : V :=
match n with
| 0 => V_empty
| n0.+1 => V_succ (I n0)
end) a = V_succ x}
ua: Univalence x: V n: nat p: (fix I (n : nat) : V :=
match n with
| 0 => V_empty
| n0.+1 => V_succ (I n0)
end) n = x
V_succ
((fix I (n : nat) : V :=
match n with
| 0 => V_empty
| n0.+1 => V_succ (I n0)
end) n) = V_succ x
rewrite p; auto.Qed.
ua: Univalence
forallv : V,
hexists
(funw : V =>
forallx : V,
x ∈ w <-> hexists (funu : V => x ∈ u * u ∈ v))
ua: Univalence
forallv : V,
hexists
(funw : V =>
forallx : V,
x ∈ w <-> hexists (funu : V => x ∈ u * u ∈ v))
ua: Univalence v: V
hexists
(funw : V =>
forallx : V,
x ∈ w <-> hexists (funu : V => x ∈ u * u ∈ v))
ua: Univalence v: V
forallx : V,
x ∈ V_union v <-> hexists (funu : V => x ∈ u * u ∈ v)
ua: Univalence v, x: V
x ∈ V_union v -> hexists (funu : V => x ∈ u * u ∈ v)
ua: Univalence v, x: V
hexists (funu : V => x ∈ u * u ∈ v) -> x ∈ V_union v
ua: Univalence v, x: V
x ∈ V_union v -> hexists (funu : V => x ∈ u * u ∈ v)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v
phi ⊆ (u × v)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v z: V Hz: z ∈ phi
z ∈ (u × v)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) =
phi} z: V Hz: z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) =
phi} z: V Hz: z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) =
phi} z: V Hz: z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) =
phi} z: V Hz: z ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] = z
[func_of_members (fst (a, h a)),
func_of_members (snd (a, h a))] = z
assumption.
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v
forallx : V,
x ∈ u -> hexists (funy : V => y ∈ v * [x, y] ∈ phi)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u
hexists (funy : V => y ∈ v * [x, y] ∈ phi)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u
x ∈ set func_of_members ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u
{a : [u] & func_of_members a = x} ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x
hexists (funy : V => y ∈ v * [x, y] ∈ phi)
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) = phi} ->
{y : V & y ∈ v * [x, y] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
{y : V & y ∈ v * [x, y] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
func_of_members (h a) ∈ v *
[x, func_of_members (h a)] ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
func_of_members (h a) ∈ v
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
[x, func_of_members (h a)] ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
[x, func_of_members (h a)] ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x: V Hx: x ∈ u a: [u] p: func_of_members a = x h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
[func_of_members a, func_of_members (h a)] =
[x, func_of_members (h a)]
rewrite p; reflexivity.
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) = phi} ->
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
[x, y]
∈ set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) ->
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi
{a : [u] &
[func_of_members a, func_of_members (h a)] = [x, y]} ->
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y]
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y]
[x, y']
∈ set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) ->
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y]
{a : [u] &
[func_of_members a, func_of_members (h a)] = [x, y']} ->
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y']
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y'] px: func_of_members a = x py: func_of_members (h a) = y
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y'] px: func_of_members a = x py: func_of_members (h a) = y px': func_of_members a' = x py': func_of_members (h a') = y'
y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y'] px: func_of_members a = x py: func_of_members (h a) = y px': func_of_members a' = x py': func_of_members (h a') = y'
func_of_members (h a) = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y'] px: func_of_members a = x py: func_of_members (h a) = y px': func_of_members a' = x py': func_of_members (h a') = y'
func_of_members (h a) = func_of_members (h a')
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y'] px: func_of_members a = x py: func_of_members (h a) = y px': func_of_members a' = x py': func_of_members (h a') = y'
h a = h a'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H: phi ∈ V_func u v x, y, y': V Hy: [x, y] ∈ phi Hy': [x, y'] ∈ phi h: [u] -> [v] p_phi: set
(funx : [u] =>
[func_of_members x, func_of_members (h x)]) =
phi a: [u] p: [func_of_members a, func_of_members (h a)] =
[x, y] a': [u] p': [func_of_members a', func_of_members (h a')] =
[x, y'] px: func_of_members a = x py: func_of_members (h a) = y px': func_of_members a' = x py': func_of_members (h a') = y'
a = a'
exact (isinj_embedding func_of_members IsEmbedding_funcofmembers a a' (px @ px'^)).
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V
V_is_func u v phi -> phi ∈ V_func u v
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y'
phi ∈ V_func u v
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y'
Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) = phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) = phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y'
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u]
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V
{y : V & y ∈ v * [x, y] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V H:= ?Goal0: {y : V & y ∈ v * [x, y] ∈ phi}
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V
{y : V & y ∈ v * [x, y] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V
IsHProp {y : V & y ∈ v * [x, y] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V
forallx0y : {y : V & y ∈ v * [x, y] ∈ phi}, x0 = y
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V y: V H1_y: y ∈ v H2_y: [x, y] ∈ phi y': V H1_y': y' ∈ v H2_y': [x, y'] ∈ phi
(y; (H1_y, H2_y)) = (y'; (H1_y', H2_y'))
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V y: V H1_y: y ∈ v H2_y: [x, y] ∈ phi y': V H1_y': y' ∈ v H2_y': [x, y'] ∈ phi
{p : y = y' &
transport (funy : V => y ∈ v * [x, y] ∈ phi) p
(H1_y, H2_y) = (H1_y', H2_y')}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V y: V H1_y: y ∈ v H2_y: [x, y] ∈ phi y': V H1_y': y' ∈ v H2_y': [x, y'] ∈ phi
transport (funy : V => y ∈ v * [x, y] ∈ phi)
(H3 x y y' (H2_y, H2_y')) (H1_y, H2_y) =
(H1_y', H2_y')
apply path_ishprop.
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V H:= untrunc_istrunc (-1)
(H2 x
(transport (funz : V => x ∈ z) memb_u^
(tr (a; 1)))): {y : V & y ∈ v * [x, y] ∈ phi}
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V y: V H1_y: y ∈ v H2_y: [x, y] ∈ phi
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V y: V H1_y: y ∈ v H2_y: [x, y] ∈ phi b: [v] Hb: func_of_members b = y
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' a: [u] x:= func_of_members a: V y: V H1_y: y ∈ v H2_y: [x, y] ∈ phi b: [v] Hb: func_of_members b = y
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
Tr (-1)
{a : [u] -> [v] &
set
(funx : [u] =>
[func_of_members x, func_of_members (a x)]) = phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z
∈ set
(funx : [u] =>
[func_of_members x, func_of_members (h x).1])
z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z
∈ set
(funx : [u] =>
[func_of_members x, func_of_members (h x).1])
{a : [u] &
[func_of_members a, func_of_members (h a).1] = z} ->
z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z
∈ set
(funx : [u] =>
[func_of_members x, func_of_members (h x).1]) a: [u] Ha: [func_of_members a, func_of_members (h a).1] = z
z ∈ phi
exact (transport (funw => w ∈ phi) Ha (pr2 (h a))).
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi
z
∈ set
(funx : [u] =>
[func_of_members x, func_of_members (h x).1])
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi
z ∈ (u × v) ->
Tr (-1)
{a : [u] &
[func_of_members a, func_of_members (h a).1] = z}
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members (h a).1] = z
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members (h a).1] =
[func_of_members a, func_of_members b]
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
func_of_members (h a).1 = func_of_members b
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members (h a).1] ∈ phi *
[func_of_members a, func_of_members b] ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members (h a).1] ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members b] ∈ phi
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members (h a).1] ∈ phi
exact (pr2 (h a)).
ua: Univalence u, v: V memb_u: u = set func_of_members memb_v: v = set func_of_members phi: V H1: phi ⊆ (u × v) H2: forallx : V,
x ∈ u ->
hexists (funy : V => y ∈ v * [x, y] ∈ phi) H3: forallxyy' : V,
[x, y] ∈ phi * [x, y'] ∈ phi -> y = y' h: foralla : [u],
{b : [v] &
[func_of_members a, func_of_members b] ∈ phi} z: V Hz: z ∈ phi a: [u] b: [v] p: [func_of_members a, func_of_members b] = z
[func_of_members a, func_of_members b] ∈ phi
exact (transport (funw => w ∈ phi) p^ Hz).Qed.
ua: Univalence
forall (r : V -> V) (x : V),
hexists
(funw : V =>
forally : V,
y ∈ w <-> hexists (funz : V => z ∈ x * (r z = y)))
ua: Univalence
forall (r : V -> V) (x : V),
hexists
(funw : V =>
forally : V,
y ∈ w <-> hexists (funz : V => z ∈ x * (r z = y)))
ua: Univalence r: V -> V
forallx : V,
hexists
(funw : V =>
forally : V,
y ∈ w <-> hexists (funz : V => z ∈ x * (r z = y)))
ua: Univalence r: V -> V
forall (A : Type) (f : A -> V),
(foralla : A,
hexists
(funw : V =>
forally : V,
y ∈ w <->
hexists (funz : V => z ∈ f a * (r z = y)))) ->
hexists
(funw : V =>
forally : V,
y ∈ w <->
hexists (funz : V => z ∈ set f * (r z = y)))
ua: Univalence r: V -> V A: Type f: A -> V
hexists
(funw : V =>
forally : V,
y ∈ w <->
hexists (funz : V => z ∈ set f * (r z = y)))
ua: Univalence r: V -> V A: Type f: A -> V
{w : V &
forally : V,
y ∈ w <-> hexists (funz : V => z ∈ set f * (r z = y))}
ua: Univalence r: V -> V A: Type f: A -> V
forally : V,
y ∈ set (funx : A => r (f x)) <->
hexists (funz : V => z ∈ set f * (r z = y))
ua: Univalence r: V -> V A: Type f: A -> V y: V
y ∈ set (funx : A => r (f x)) ->
hexists (funz : V => z ∈ set f * (r z = y))
ua: Univalence r: V -> V A: Type f: A -> V y: V
hexists (funz : V => z ∈ set f * (r z = y)) ->
y ∈ set (funx : A => r (f x))
ua: Univalence r: V -> V A: Type f: A -> V y: V
y ∈ set (funx : A => r (f x)) ->
hexists (funz : V => z ∈ set f * (r z = y))
ua: Univalence r: V -> V A: Type f: A -> V y: V
{a : A & r (f a) = y} ->
{z : V & z ∈ set f * (r z = y)}
ua: Univalence r: V -> V A: Type f: A -> V y: V a: A p: r (f a) = y
{z : V & z ∈ set f * (r z = y)}
ua: Univalence r: V -> V A: Type f: A -> V y: V a: A p: r (f a) = y
f a ∈ set f * (r (f a) = y)
ua: Univalence r: V -> V A: Type f: A -> V y: V a: A p: r (f a) = y
f a ∈ set f
ua: Univalence r: V -> V A: Type f: A -> V y: V a: A p: r (f a) = y
r (f a) = y
ua: Univalence r: V -> V A: Type f: A -> V y: V a: A p: r (f a) = y
f a ∈ set f
apply tr; existsa; auto.
ua: Univalence r: V -> V A: Type f: A -> V y: V a: A p: r (f a) = y
r (f a) = y
assumption.
ua: Univalence r: V -> V A: Type f: A -> V y: V
hexists (funz : V => z ∈ set f * (r z = y)) ->
y ∈ set (funx : A => r (f x))
ua: Univalence r: V -> V A: Type f: A -> V y: V
{z : V & z ∈ set f * (r z = y)} ->
y ∈ set (funx : A => r (f x))
ua: Univalence r: V -> V A: Type f: A -> V y, z: V h: z ∈ set f p: r z = y
y ∈ set (funx : A => r (f x))
ua: Univalence r: V -> V A: Type f: A -> V y, z: V h: z ∈ set f p: r z = y
z ∈ set f -> y ∈ set (funx : A => r (f x))
ua: Univalence r: V -> V A: Type f: A -> V y, z: V h: z ∈ set f p: r z = y
{a : A & f a = z} -> {a : A & r (f a) = y}
ua: Univalence r: V -> V A: Type f: A -> V y, z: V h: z ∈ set f p: r z = y a: A p': f a = z
{a : A & r (f a) = y}
ua: Univalence r: V -> V A: Type f: A -> V y, z: V h: z ∈ set f p: r z = y a: A p': f a = z
r (f a) = y
ua: Univalence r: V -> V A: Type f: A -> V y, z: V h: z ∈ set f p: r z = y a: A p': f a = z
r (f a) = r z
exact (ap r p').Qed.
ua: Univalence C: V -> HProp
foralla : V,
hexists
(funw : V => forallx : V, x ∈ w <-> x ∈ a * C x)
ua: Univalence C: V -> HProp
foralla : V,
hexists
(funw : V => forallx : V, x ∈ w <-> x ∈ a * C x)
ua: Univalence C: V -> HProp
forall (A : Type) (f : A -> V),
(foralla : A,
hexists
(funw : V => forallx : V, x ∈ w <-> x ∈ f a * C x)) ->
hexists
(funw : V =>
forallx : V, x ∈ w <-> x ∈ set f * C x)
ua: Univalence C: V -> HProp A: Type f: A -> V
hexists
(funw : V =>
forallx : V, x ∈ w <-> x ∈ set f * C x)
ua: Univalence C: V -> HProp A: Type f: A -> V
{w : V & forallx : V, x ∈ w <-> x ∈ set f * C x}
ua: Univalence C: V -> HProp A: Type f: A -> V
forallx : V,
x ∈ set (funz : {a : A & C (f a)} => f z.1) <->
x ∈ set f * C x
ua: Univalence C: V -> HProp A: Type f: A -> V x: V
x ∈ set (funz : {a : A & C (f a)} => f z.1) ->
x ∈ set f * C x
ua: Univalence C: V -> HProp A: Type f: A -> V x: V
x ∈ set f * C x ->
x ∈ set (funz : {a : A & C (f a)} => f z.1)
ua: Univalence C: V -> HProp A: Type f: A -> V x: V
x ∈ set (funz : {a : A & C (f a)} => f z.1) ->
x ∈ set f * C x
ua: Univalence C: V -> HProp A: Type f: A -> V x: V
{a : {a : A & C (f a)} & f a.1 = x} -> x ∈ set f * C x
ua: Univalence C: V -> HProp A: Type f: A -> V x: V a: A h: C (f a) p: f (a; h).1 = x
x ∈ set f * C x
ua: Univalence C: V -> HProp A: Type f: A -> V x: V a: A h: C (f a) p: f (a; h).1 = x
x ∈ set f
ua: Univalence C: V -> HProp A: Type f: A -> V x: V a: A h: C (f a) p: f (a; h).1 = x
C x
ua: Univalence C: V -> HProp A: Type f: A -> V x: V a: A h: C (f a) p: f (a; h).1 = x
x ∈ set f
apply tr; existsa; assumption.
ua: Univalence C: V -> HProp A: Type f: A -> V x: V a: A h: C (f a) p: f (a; h).1 = x
C x
exact (transport C p h).
ua: Univalence C: V -> HProp A: Type f: A -> V x: V
x ∈ set f * C x ->
x ∈ set (funz : {a : A & C (f a)} => f z.1)
ua: Univalence C: V -> HProp A: Type f: A -> V x: V H1: x ∈ set f H2: C x
x ∈ set (funz : {a : A & C (f a)} => f z.1)
ua: Univalence C: V -> HProp A: Type f: A -> V x: V H1: x ∈ set f H2: C x
x ∈ set f ->
x ∈ set (funz : {a : A & C (f a)} => f z.1)
ua: Univalence C: V -> HProp A: Type f: A -> V x: V H1: x ∈ set f H2: C x
{a : A & f a = x} ->
{a : {a : A & C (f a)} & f a.1 = x}
ua: Univalence C: V -> HProp A: Type f: A -> V x: V H1: x ∈ set f H2: C x a: A p: f a = x
{a : {a : A & C (f a)} & f a.1 = x}
ua: Univalence C: V -> HProp A: Type f: A -> V x: V H1: x ∈ set f H2: C x a: A p: f a = x