Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Colimits.Pushout. Require Import Colimits.SpanPushout. Require Import Homotopy.Join.Core. Require Import Truncations. (** * The Generalized Blakers-Massey Theorem *) (** ** Path algebra helper lemma *) (** Here is a strange-looking path algebra helper lemma that is easier to prove by lifting to a general case and doing a path-induction blast. It says something about what happens when we transport from the center of a based path-space to some other point, assuming we know a particular way to "compute" the action of the type family in question. *)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
y: A
p: x = y
u: B x 1
f: forall q : x = x, B x q <~> B y (q @ p)
ev: ap10 (apD B p) p = transport_arrow_toconst p (B x) p @ path_universe_uncurried (equiv_transport (B y) (concat_pV_p p p) oE f (p @ p^) oE equiv_transport (B x) (transport_paths_r p^ p))

transport (fun yp : {y : A & x = y} => B yp.1 yp.2) (path_contr (x; 1) (y; p)) u = transport (B y) (concat_1p p) (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
y: A
p: x = y
u: B x 1
f: forall q : x = x, B x q <~> B y (q @ p)
ev: ap10 (apD B p) p = transport_arrow_toconst p (B x) p @ path_universe_uncurried (equiv_transport (B y) (concat_pV_p p p) oE f (p @ p^) oE equiv_transport (B x) (transport_paths_r p^ p))

transport (fun yp : {y : A & x = y} => B yp.1 yp.2) (path_contr (x; 1) (y; p)) u = transport (B y) (concat_1p p) (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: 1 = 1 @ path_universe_uncurried (equiv_transport (B x) 1 oE f 1%path oE equiv_transport (B x) 1)

u = transport (B x) 1 (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: 1 = path_universe_uncurried (equiv_transport (B x) 1 oE f 1%path oE equiv_transport (B x) 1)

u = transport (B x) 1 (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: ((equiv_path (B x 1) (B x 1))^-1 o idmap)^-1 1 = equiv_transport (B x) 1 oE f 1%path oE equiv_transport (B x) 1

u = transport (B x) 1 (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: ((equiv_path (B x 1) (B x 1))^-1 o idmap)^-1 1 = equiv_transport (B x) 1 oE f 1%path oE equiv_transport (B x) 1

u = transport (B x) 1 (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: ((equiv_path (B x 1) (B x 1))^-1 o idmap)^-1 1 == equiv_transport (B x) 1 oE f 1%path oE equiv_transport (B x) 1

u = transport (B x) 1 (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: ((equiv_path (B x 1) (B x 1))^-1 o idmap)^-1 1 u = (equiv_transport (B x) 1 oE f 1%path oE equiv_transport (B x) 1) u

u = transport (B x) 1 (f 1 u)
H: Univalence
A: Type
x: A
B: forall y : A, x = y -> Type
u: B x 1
f: forall q : x = x, B x q <~> B x (q @ 1)
ev: u = transport (B x) 1 (f 1 u)

u = transport (B x) 1 (f 1 u)
exact ev. Defined. (** ** Setup *) Section GBM. Context {X Y : Type} (Q : X -> Y -> Type). (** Here's the hypothesis of ABFJ generalized Blakers-Massey. It works for any reflective subuniverse, not only modalities! *) Context (O : ReflectiveSubuniverse). Context (isconnected_cogap : forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1;q12) = (x3;q32) :> {x:X & Q x y2}) ((y2;q32) = (y4;q34) :> {y:Y & Q x3 y}))). Let P := SPushout Q. Local Notation left := (spushl Q). Local Notation right := (spushr Q). Local Notation glue := (spglue Q). (** Here's a lemma that's a sort of "singleton contractibility" equivalence, but expressed in a particularly strange way. As we'll see, this form of the lemma comes up naturally *twice* in the proof, and proving it once here to use in both places is crucial so that the two uses can be identified later on. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

{q0 : Q x0 y & {_ : transport (fun x : X => Q x y) s q0 = q1 & glue q0 @ (glue q1)^ = r}} <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

{q0 : Q x0 y & {_ : transport (fun x : X => Q x y) s q0 = q1 & glue q0 @ (glue q1)^ = r}} <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

{ap : {a : Q x0 y & transport (fun x : X => Q x y) s a = q1} & glue ap.1 @ (glue q1)^ = r} <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

{qt : {q0 : Q x0 y & q0 = transport (fun x : X => Q x y) s^ q1} & glue qt.1 @ (glue q1)^ = r} <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

glue (transport (fun x : X => Q x y) s^ q1) @ (glue q1)^ = r <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

transport (fun x : X => left x = right y) s^ (glue q1) @ (glue q1)^ = r <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

(((ap left s^)^ @ glue q1) @ ap (fun _ : X => right y) s^) @ (glue q1)^ = r <~> ap left s = r
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y: Y
q1: Q x1 y

(ap left s @ glue q1) @ (glue q1)^ = r <~> ap left s = r
exact (equiv_concat_l (concat_pp_V _ _)^ _). (** Although we proved this lemma with [rewrite], we make it transparent, not so that *we* can reason about it, but so that Coq can evaluate it. *) Defined. (* But except in one place, we don't want it to try (otherwise things get really slow). *) Opaque frobnicate. (** ** Codes *) (** *** Right-hand codes *) (** The right-hand codes family is easy. *) Definition coderight {x0 : X} {y : Y} (r : left x0 = right y) : Type := O (hfiber glue r). (** *** Left-hand codes *) (** We enhance the HFLL and ABFJ theorems by defining a version of code-left that doesn't depend on one map being surjective. *) Section CodeLeft. Context {x0 x1 : X} (r : left x0 = left x1). (** The left codes are themselves a pushout, of what is morally also a dependent span, but we formulate it as an ordinary pushout of projections between iterated Sigma-types, most of which we express as records for performance reasons. The span is [codeleft1] <- [codeleft0] -> [codeleft2]. *) Definition codeleft1 : Type := { s : x0 = x1 & (* v : *) ap left s = r}. Record codeleft2 := { codeleft2_y0 : Y ; codeleft2_q00 : Q x0 codeleft2_y0 ; codeleft2_q10 : Q x1 codeleft2_y0 ; codeleft2_u : glue codeleft2_q00 @ (glue codeleft2_q10)^ = r }. Record codeleft0 := { codeleft0_s : x0 = x1 ; codeleft0_y0 : Y ; codeleft0_v : ap left codeleft0_s = r ; codeleft0_q00 : Q x0 codeleft0_y0 ; codeleft0_q10 : Q x1 codeleft0_y0 ; codeleft0_w : transport (fun x => Q x codeleft0_y0) codeleft0_s codeleft0_q00 = codeleft0_q10 ; codeleft0_u : glue codeleft0_q00 @ (glue codeleft0_q10)^ = r ; (** Note the first use of frobnicate here. *) codeleft0_d : frobnicate r codeleft0_s codeleft0_y0 codeleft0_q10 (codeleft0_q00 ; codeleft0_w ; codeleft0_u) = codeleft0_v }.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1

codeleft0 -> codeleft1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1

codeleft0 -> codeleft1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y0: Y
v: ap left s = r
q00: Q x0 y0
q10: Q x1 y0
w: transport (fun x : X => Q x y0) s q00 = q10
u: glue q00 @ (glue q10)^ = r
d: frobnicate r s y0 q10 (q00; w; u) = v

codeleft1
exact (s;v). Defined.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1

codeleft0 -> codeleft2
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1

codeleft0 -> codeleft2
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
s: x0 = x1
y0: Y
v: ap left s = r
q00: Q x0 y0
q10: Q x1 y0
w: transport (fun x : X => Q x y0) s q00 = q10
u: glue q00 @ (glue q10)^ = r
d: frobnicate r s y0 q10 (q00; w; u) = v

codeleft2
exact (Build_codeleft2 y0 q00 q10 u). Defined. Definition codeleft : Type := O (Pushout codeleft01 codeleft02). (** *** Codes for glue *) Section CodeGlue. Context {y1 : Y} (q11 : Q x1 y1). (** We prove that codes respect glue as a chain of equivalences between types built from pushouts and double-pushouts. The first step is to add the data of our hypothesized-to-be-connected type inside [codeleft2]. *) Definition codeleft2plus := {yqqu : codeleft2 & Join ((x0; codeleft2_q00 yqqu) = (x1; codeleft2_q10 yqqu) :> {x:X & Q x (codeleft2_y0 yqqu)}) ((codeleft2_y0 yqqu; codeleft2_q10 yqqu) = (y1; q11) :> {y:Y & Q x1 y})}. (** Since this connected type is itself a join, hence a pushout, the second step is to distribute this and reexpress the whole thing as another pushout of iterated Sigma-types (again mostly expressed as records for performance reasons). *) Record Ocodeleft2b := { Ocodeleft2b_s : x0 = x1 ; Ocodeleft2b_y0 : Y ; Ocodeleft2b_q00 : Q x0 Ocodeleft2b_y0 ; Ocodeleft2b_q10 : Q x1 Ocodeleft2b_y0 ; Ocodeleft2b_w : transport (fun x => Q x Ocodeleft2b_y0) Ocodeleft2b_s Ocodeleft2b_q00 = Ocodeleft2b_q10 ; Ocodeleft2b_u : glue Ocodeleft2b_q00 @ (glue Ocodeleft2b_q10)^ = r }. Definition Ocodeleft2c := { q01 : Q x0 y1 & (* u: *) glue q01 @ (glue q11)^ = r }. Record Ocodeleft2a := { Ocodeleft2a_s : x0 = x1 ; Ocodeleft2a_q01 : Q x0 y1 ; Ocodeleft2a_w : transport (fun x => Q x y1) Ocodeleft2a_s Ocodeleft2a_q01 = q11 ; Ocodeleft2a_u : glue Ocodeleft2a_q01 @ (glue q11)^ = r }.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a -> Ocodeleft2b
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a -> Ocodeleft2b
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
s: x0 = x1
q01: Q x0 y1
w: transport (fun x : X => Q x y1) s q01 = q11
u: glue q01 @ (glue q11)^ = r

Ocodeleft2b
exact (Build_Ocodeleft2b s y1 q01 q11 w u). Defined.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a -> Ocodeleft2c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a -> Ocodeleft2c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
s: x0 = x1
q01: Q x0 y1
w: transport (fun x : X => Q x y1) s q01 = q11
u: glue q01 @ (glue q11)^ = r

Ocodeleft2c
exact (q01;u). Defined. (** This proof is basically just rearranging Sigma-types/records and paths in Sigma-types and contracting based path spaces. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Pushout Ocodeleft2ab Ocodeleft2ac <~> codeleft2plus
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Pushout Ocodeleft2ab Ocodeleft2ac <~> codeleft2plus
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Pushout Ocodeleft2ab Ocodeleft2ac <~> Pushout (functor_sigma idmap (fun x : codeleft2 => fst)) (functor_sigma idmap (fun x : codeleft2 => snd))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> {x : codeleft2 & ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) * ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
Ocodeleft2b <~> {x : codeleft2 & (x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
Ocodeleft2c <~> {x : codeleft2 & (codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
?eB o Ocodeleft2ab == functor_sigma idmap (fun x : codeleft2 => fst) o ?eA
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
?eC o Ocodeleft2ac == functor_sigma idmap (fun x : codeleft2 => snd) o ?eA
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> {x : codeleft2 & ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) * ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft2 -> Type
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
forall a : codeleft2, ?P a <~> (fun x : codeleft2 => ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) * ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))) a
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
Ocodeleft2a <~> {x : _ & ?P x}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}
make_equiv_contr_basedpaths.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2b <~> {x : codeleft2 & (x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft2 -> Type
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
forall a : codeleft2, ?P a <~> (fun x : codeleft2 => (x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) a
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
Ocodeleft2b <~> {x : _ & ?P x}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2b <~> {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}}
make_equiv.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2c <~> {x : codeleft2 & (codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft2 -> Type
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
forall a : codeleft2, ?P a <~> (fun x : codeleft2 => (codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)) a
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
Ocodeleft2c <~> {x : _ & ?P x}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2c <~> {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}
make_equiv_contr_basedpaths.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

equiv_functor_sigma_id (fun a : codeleft2 => equiv_path_sigma (fun x : X => Q x (codeleft2_y0 a)) (x0; codeleft2_q00 a) (x1; codeleft2_q10 a)) oE equiv_adjointify (fun H : Ocodeleft2b => (fun (H0 : x0 = x1) (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : transport (fun x : X => Q x H1) H0 H2 = H3) (H5 : glue H2 @ (glue H3)^ = r) => ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (H1 : Y); codeleft2_q10 := H3 : Q x1 (H1 : Y); codeleft2_u := H5 : glue (H2 : Q x0 (H1 : Y)) @ (glue (H3 : Q x1 (H1 : Y)))^ = r |} : codeleft2; (H0 : x0 = x1; H4 : transport (fun x : X => Q x (codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |})) (H0 : x0 = x1) (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 ...; codeleft2_q10 := H3 : Q x1 ...; codeleft2_u := H5 : ... = r |} : codeleft2))) p (codeleft2_q00 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (H1 : Y); codeleft2_q10 := H3 : Q x1 (H1 : Y); codeleft2_u := H5 : glue (...) @ (glue ...)^ = r |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (H1 : Y); codeleft2_q10 := H3 : Q x1 (H1 : Y); codeleft2_u := H5 : glue (H2 : Q x0 ...) @ (glue (H3 : ...))^ = r |} : codeleft2)}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}}) (Ocodeleft2b_s H) (Ocodeleft2b_y0 H) (Ocodeleft2b_q00 H) (Ocodeleft2b_q10 H) (Ocodeleft2b_w H) (Ocodeleft2b_u H)) (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 & transport (fun x : X => Q x (codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |})) p (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2}) => (fun (H6 : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1) (H7 : transport (fun x : X => Q x (codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |})) H6 (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2) => {| Ocodeleft2b_s := H6 : x0 = x1; Ocodeleft2b_y0 := H1 : Y; Ocodeleft2b_q00 := H2 : Q x0 (H1 : Y); Ocodeleft2b_q10 := H3 : Q x1 (H1 : Y); Ocodeleft2b_w := H7 : transport (fun x : X => Q x (H1 : Y)) (H6 : x0 = x1) (H2 : Q x0 (H1 : Y)) = (H3 : Q x1 (H1 : Y)); Ocodeleft2b_u := H4 : glue (H2 : Q x0 (...)) @ (glue (H3 : Q x1 ...))^ = r |} : Ocodeleft2b) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) ((fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 & transport (fun x : X => Q x (codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |})) p (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2}) => (fun (H6 : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1) (H7 : transport (fun x : X => Q x (codeleft2_y0 {| ... |})) H6 (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2) => 1%path) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) : (fun H : Ocodeleft2b => (fun (H0 : x0 = x1) (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : transport (fun x : X => Q x H1) H0 H2 = H3) (H5 : glue H2 @ (glue H3)^ = r) => ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (H1 : Y); codeleft2_q10 := H3 : Q x1 (H1 : Y); codeleft2_u := H5 : glue (H2 : Q x0 (...)) @ (glue (H3 : Q x1 ...))^ = r |} : codeleft2; (H0 : x0 = x1; H4 : transport (fun x : X => Q x (codeleft2_y0 {| ...; ...; ...; ... |})) (H0 : x0 = x1) (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 ({| ... |} : codeleft2))) p (codeleft2_q00 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : ...; codeleft2_q10 := H3 : ...; codeleft2_u := H5 : ... |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (...); codeleft2_q10 := H3 : Q x1 (...); codeleft2_u := H5 : ... @ ...^ = r |} : codeleft2)}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}}) (Ocodeleft2b_s H) (Ocodeleft2b_y0 H) (Ocodeleft2b_q00 H) (Ocodeleft2b_q10 H) (Ocodeleft2b_w H) (Ocodeleft2b_u H)) o (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 & transport (fun x : X => Q x (codeleft2_y0 {| ... |})) p (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2}) => (fun (H6 : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1) (H7 : transport (fun x : X => Q x (...)) H6 (x0; codeleft2_q00 {| ...; ...; ...; ... |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2) => {| Ocodeleft2b_s := H6 : x0 = x1; Ocodeleft2b_y0 := H1 : Y; Ocodeleft2b_q00 := H2 : Q x0 (H1 : Y); Ocodeleft2b_q10 := H3 : Q x1 (H1 : Y); Ocodeleft2b_w := H7 : transport (...) (...) (...) = (H3 : ...); Ocodeleft2b_u := H4 : glue ... @ (...)^ = r |} : Ocodeleft2b) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) == idmap) ((fun H : Ocodeleft2b => (fun (H0 : x0 = x1) (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : transport (fun x : X => Q x H1) H0 H2 = H3) (H5 : glue H2 @ (glue H3)^ = r) => 1%path) (Ocodeleft2b_s H) (Ocodeleft2b_y0 H) (Ocodeleft2b_q00 H) (Ocodeleft2b_q10 H) (Ocodeleft2b_w H) (Ocodeleft2b_u H)) : (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 & transport (fun x : X => Q x (codeleft2_y0 {| ... |})) p (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2}) => (fun (H6 : (x0; codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).1) (H7 : transport (fun x : X => Q x (...)) H6 (x0; codeleft2_q00 {| ...; ...; ...; ... |}).2 = (x1; codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}).2) => {| Ocodeleft2b_s := H6 : x0 = x1; Ocodeleft2b_y0 := H1 : Y; Ocodeleft2b_q00 := H2 : Q x0 (H1 : Y); Ocodeleft2b_q10 := H3 : Q x1 (H1 : Y); Ocodeleft2b_w := H7 : transport (...) (...) (...) = (H3 : ...); Ocodeleft2b_u := H4 : glue ... @ (...)^ = r |} : Ocodeleft2b) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) o (fun H : Ocodeleft2b => (fun (H0 : x0 = x1) (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : transport (fun x : X => Q x H1) H0 H2 = H3) (H5 : glue H2 @ (glue H3)^ = r) => ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (H1 : Y); codeleft2_q10 := H3 : Q x1 (H1 : Y); codeleft2_u := H5 : glue (H2 : Q x0 (...)) @ (glue (H3 : Q x1 ...))^ = r |} : codeleft2; (H0 : x0 = x1; H4 : transport (fun x : X => Q x (codeleft2_y0 {| ...; ...; ...; ... |})) (H0 : x0 = x1) (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H5 |}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 ({| ... |} : codeleft2))) p (codeleft2_q00 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : ...; codeleft2_q10 := H3 : ...; codeleft2_u := H5 : ... |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := H1 : Y; codeleft2_q00 := H2 : Q x0 (...); codeleft2_q10 := H3 : Q x1 (...); codeleft2_u := H5 : ... @ ...^ = r |} : codeleft2)}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2}}) (Ocodeleft2b_s H) (Ocodeleft2b_y0 H) (Ocodeleft2b_q00 H) (Ocodeleft2b_q10 H) (Ocodeleft2b_w H) (Ocodeleft2b_u H)) == idmap) o Ocodeleft2ab == functor_sigma idmap (fun x : codeleft2 => fst) o (equiv_functor_sigma_id (fun a : codeleft2 => equiv_path_sigma (fun x : X => Q x (codeleft2_y0 a)) (x0; codeleft2_q00 a) (x1; codeleft2_q10 a) *E equiv_path_sigma (fun y : Y => Q x1 y) (codeleft2_y0 a; codeleft2_q10 a) (y1; q11)) oE equiv_adjointify (fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (H1 : Q x0 (y1 : Y)) @ (glue (q11 : Q x1 (y1 : Y)))^ = r |} : codeleft2; ((H0 : x0 = x1; H2 : transport (fun x : X => Q x y1) (H0 : x0 = x1) H1 = q11) : {p : x0 = x1 & transport (fun x : X => Q x y1) p H1 = q11}, (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : y1 = y1 & transport (fun y : Y => Q x1 y) p q11 = q11}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 ({| codeleft2_y0 := ...; codeleft2_q00 := ...; codeleft2_q10 := ...; codeleft2_u := ... |} : codeleft2))) p (codeleft2_q00 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (...); codeleft2_q10 := q11 : Q x1 (...); codeleft2_u := H3 : ... @ ...^ = r |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (...) @ (glue ...)^ = r |} : codeleft2)} * {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (...) @ (glue ...)^ = r |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (...); codeleft2_q10 := q11 : Q x1 (...); codeleft2_u := H3 : ... @ ...^ = r |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |})) p (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (fun x : X => Q x H1) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport (fun x : X => Q x H1) H7 H2 = H3) (H9 : {p : H1 = y1 & transport (fun ... => Q x1 y) p H3 = q11}) => (fun H10 : H1 = y1 => paths_ind_r y1 (fun (y : Y) (p : ...) => forall (H11 : ...) (H12 : ...), ... -> ...) (fun (H11 : ...) (H12 : ...) (H13 : ...) (H14 : ...) (H15 : ...) => paths_ind_r q11 (...) (...) H12 H15 H13 H14) H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) ((fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 {| ... |})) p (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (fun x : X => Q x H1) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport (... => ...) H7 H2 = H3) (H9 : {p : H1 = y1 & transport (...) p H3 = q11}) => (fun H10 : H1 = y1 => paths_ind_r y1 (... => ...) (... => ...) H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) : (fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (H1 : Q x0 ...) @ (glue (q11 : ...))^ = r |} : codeleft2; ((H0 : x0 = x1; H2 : transport (fun x : X => Q x y1) (H0 : x0 = x1) H1 = q11) : {p : x0 = x1 & transport (fun x : X => Q x y1) p H1 = q11}, (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : y1 = y1 & transport (fun y : Y => Q x1 y) p q11 = q11}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 (...))) p (codeleft2_q00 ({| ...; ...; ...; ... |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2)} * {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| ...; ...; ...; ... |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) o (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (...)) p (codeleft2_q00 {| ...; ...; ...; ... |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| ...; ...; ...; ... |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (... => ...) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport ... H7 H2 = H3) (H9 : {p : H1 = y1 & ... = q11}) => (fun ... => paths_ind_r y1 ... ... H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) == idmap) ((fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => 1%path) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) : (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (...)) p (codeleft2_q00 {| ...; ...; ...; ... |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| ...; ...; ...; ... |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (... => ...) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport ... H7 H2 = H3) (H9 : {p : H1 = y1 & ... = q11}) => (fun ... => paths_ind_r y1 ... ... H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) o (fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (H1 : Q x0 ...) @ (glue (q11 : ...))^ = r |} : codeleft2; ((H0 : x0 = x1; H2 : transport (fun x : X => Q x y1) (H0 : x0 = x1) H1 = q11) : {p : x0 = x1 & transport (fun x : X => Q x y1) p H1 = q11}, (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : y1 = y1 & transport (fun y : Y => Q x1 y) p q11 = q11}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 (...))) p (codeleft2_q00 ({| ...; ...; ...; ... |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2)} * {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| ...; ...; ...; ... |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) == idmap))
intros; reflexivity.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

equiv_functor_sigma_id (fun a : codeleft2 => equiv_path_sigma (fun y : Y => Q x1 y) (codeleft2_y0 a; codeleft2_q10 a) (y1; q11)) oE equiv_adjointify (fun H : Ocodeleft2c => (fun (H0 : Q x0 y1) (H1 : glue H0 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H1 : glue (H0 : Q x0 (y1 : Y)) @ (glue (q11 : Q x1 (y1 : Y)))^ = r |} : codeleft2; (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H1 : glue (H0 : Q x0 ...) @ (glue (q11 : ...))^ = r |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H1 : glue (...) @ (glue ...)^ = r |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) H.1 H.2) (fun H : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : H1 = y1 => paths_ind_r y1 (fun (y : Y) (p : y = y1) => forall (H7 : Q x0 y) (H8 : Q x1 y), glue H7 @ (glue H8)^ = r -> transport (fun y0 : Y => Q x1 y0) p H8 = q11 -> Ocodeleft2c) (fun (H7 : Q x0 y1) (H8 : Q x1 y1) (H9 : glue H7 @ (glue H8)^ = r) (H10 : transport (fun y : Y => Q x1 y) 1 H8 = q11) => paths_ind_r q11 (fun (y : Q x1 y1) (_ : y = q11) => glue H7 @ (glue y)^ = r -> Ocodeleft2c) (fun H11 : glue H7 @ (glue q11)^ = r => (H7 : Q x0 y1; H11 : glue ... @ (...)^ = r) : Ocodeleft2c) H8 H10 H9) H1 H6 H2 H3 H4) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) ((fun H : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : H1 = y1 => paths_ind_r y1 (fun (y : Y) (p : y = y1) => forall (H7 : Q x0 y) (H8 : Q x1 y) (H9 : glue H7 @ (glue H8)^ = r) (proj2 : transport (fun ... => Q x1 y0) p H8 = q11), ({| codeleft2_y0 := y1; codeleft2_q00 := (...).1; codeleft2_q10 := q11; codeleft2_u := (...).2 |}; 1%path; 1%path) = ({| codeleft2_y0 := y; codeleft2_q00 := H7; codeleft2_q10 := H8; codeleft2_u := H9 |}; p; proj2)) (fun (H7 : Q x0 y1) (H8 : Q x1 y1) (H9 : glue H7 @ (glue H8)^ = r) (H10 : transport (fun ... => Q x1 y) 1 H8 = q11) => paths_ind_r q11 (fun (y : Q x1 y1) (p : y = q11) => forall H11 : ... @ ...^ = r, ({| ... |}; 1%path; 1%path) = ({| ... |}; 1%path; p)) (fun H11 : ... @ ...^ = r => 1%path) H8 H10 H9) H1 H6 H2 H3 H4) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) : (fun H : Ocodeleft2c => (fun (H0 : Q x0 y1) (H1 : glue H0 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H1 : glue (H0 : Q x0 (...)) @ (glue (q11 : Q x1 ...))^ = r |} : codeleft2; (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (...); codeleft2_q10 := q11 : Q x1 (...); codeleft2_u := H1 : ... @ ...^ = r |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H1 : ... |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) H.1 H.2) o (fun H : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : H1 = y1 => paths_ind_r y1 (fun (y : Y) (p : y = y1) => forall (H7 : Q x0 y) (H8 : Q x1 y), glue H7 @ (...)^ = r -> transport ... p H8 = q11 -> Ocodeleft2c) (fun (H7 : Q x0 y1) (H8 : Q x1 y1) (H9 : glue H7 @ (...)^ = r) (H10 : transport (...) 1 H8 = q11) => paths_ind_r q11 (fun (y : ...) (_ : ...) => ... = r -> Ocodeleft2c) (fun H11 : ... => (...; ...) : Ocodeleft2c) H8 H10 H9) H1 H6 H2 H3 H4) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) == idmap) ((fun H : Ocodeleft2c => (fun (H0 : Q x0 y1) (H1 : glue H0 @ (glue q11)^ = r) => 1%path) H.1 H.2) : (fun H : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : H1 = y1 => paths_ind_r y1 (fun (y : Y) (p : y = y1) => forall (H7 : Q x0 y) (H8 : Q x1 y), glue H7 @ (...)^ = r -> transport ... p H8 = q11 -> Ocodeleft2c) (fun (H7 : Q x0 y1) (H8 : Q x1 y1) (H9 : glue H7 @ (...)^ = r) (H10 : transport (...) 1 H8 = q11) => paths_ind_r q11 (fun (y : ...) (_ : ...) => ... = r -> Ocodeleft2c) (fun H11 : ... => (...; ...) : Ocodeleft2c) H8 H10 H9) H1 H6 H2 H3 H4) H5.1 H5.2) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) o (fun H : Ocodeleft2c => (fun (H0 : Q x0 y1) (H1 : glue H0 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H1 : glue (H0 : Q x0 (...)) @ (glue (q11 : Q x1 ...))^ = r |} : codeleft2; (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : Q x0 (...); codeleft2_q10 := q11 : Q x1 (...); codeleft2_u := H1 : ... @ ...^ = r |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H0 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H1 : ... |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) H.1 H.2) == idmap) o Ocodeleft2ac == functor_sigma idmap (fun x : codeleft2 => snd) o (equiv_functor_sigma_id (fun a : codeleft2 => equiv_path_sigma (fun x : X => Q x (codeleft2_y0 a)) (x0; codeleft2_q00 a) (x1; codeleft2_q10 a) *E equiv_path_sigma (fun y : Y => Q x1 y) (codeleft2_y0 a; codeleft2_q10 a) (y1; q11)) oE equiv_adjointify (fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (H1 : Q x0 (y1 : Y)) @ (glue (q11 : Q x1 (y1 : Y)))^ = r |} : codeleft2; ((H0 : x0 = x1; H2 : transport (fun x : X => Q x y1) (H0 : x0 = x1) H1 = q11) : {p : x0 = x1 & transport (fun x : X => Q x y1) p H1 = q11}, (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : y1 = y1 & transport (fun y : Y => Q x1 y) p q11 = q11}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 ({| codeleft2_y0 := ...; codeleft2_q00 := ...; codeleft2_q10 := ...; codeleft2_u := ... |} : codeleft2))) p (codeleft2_q00 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (...); codeleft2_q10 := q11 : Q x1 (...); codeleft2_u := H3 : ... @ ...^ = r |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (...) @ (glue ...)^ = r |} : codeleft2)} * {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (...) @ (glue ...)^ = r |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (...); codeleft2_q10 := q11 : Q x1 (...); codeleft2_u := H3 : ... @ ...^ = r |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |})) p (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (fun x : X => Q x H1) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport (fun x : X => Q x H1) H7 H2 = H3) (H9 : {p : H1 = y1 & transport (fun ... => Q x1 y) p H3 = q11}) => (fun H10 : H1 = y1 => paths_ind_r y1 (fun (y : Y) (p : ...) => forall (H11 : ...) (H12 : ...), ... -> ...) (fun (H11 : ...) (H12 : ...) (H13 : ...) (H14 : ...) (H15 : ...) => paths_ind_r q11 (...) (...) H12 H15 H13 H14) H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) ((fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 {| ... |})) p (codeleft2_q00 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (fun x : X => Q x H1) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport (... => ...) H7 H2 = H3) (H9 : {p : H1 = y1 & transport (...) p H3 = q11}) => (fun H10 : H1 = y1 => paths_ind_r y1 (... => ...) (... => ...) H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) : (fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (H1 : Q x0 ...) @ (glue (q11 : ...))^ = r |} : codeleft2; ((H0 : x0 = x1; H2 : transport (fun x : X => Q x y1) (H0 : x0 = x1) H1 = q11) : {p : x0 = x1 & transport (fun x : X => Q x y1) p H1 = q11}, (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : y1 = y1 & transport (fun y : Y => Q x1 y) p q11 = q11}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 (...))) p (codeleft2_q00 ({| ...; ...; ...; ... |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2)} * {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| ...; ...; ...; ... |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) o (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (...)) p (codeleft2_q00 {| ...; ...; ...; ... |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| ...; ...; ...; ... |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (... => ...) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport ... H7 H2 = H3) (H9 : {p : H1 = y1 & ... = q11}) => (fun ... => paths_ind_r y1 ... ... H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) == idmap) ((fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => 1%path) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) : (fun H : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}} => (fun H0 : codeleft2 => (fun (H1 : Y) (H2 : Q x0 H1) (H3 : Q x1 H1) (H4 : glue H2 @ (glue H3)^ = r) (H5 : {p : x0 = x1 & transport (fun x : X => Q x (...)) p (codeleft2_q00 {| ...; ...; ...; ... |}) = codeleft2_q10 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |}} * {p : codeleft2_y0 {| codeleft2_y0 := H1; codeleft2_q00 := H2; codeleft2_q10 := H3; codeleft2_u := H4 |} = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 {| ...; ...; ...; ... |}) = q11}) => (fun H6 : {p : x0 = x1 & transport (... => ...) p H2 = H3} => (fun (H7 : x0 = x1) (H8 : transport ... H7 H2 = H3) (H9 : {p : H1 = y1 & ... = q11}) => (fun ... => paths_ind_r y1 ... ... H1 H10 H2 H3 H4 H8) H9.1 H9.2) H6.1 H6.2) (fst H5) (snd H5)) (codeleft2_y0 H0) (codeleft2_q00 H0) (codeleft2_q10 H0) (codeleft2_u H0)) H.1 H.2) o (fun H : Ocodeleft2a => (fun (H0 : x0 = x1) (H1 : Q x0 y1) (H2 : transport (fun x : X => Q x y1) H0 H1 = q11) (H3 : glue H1 @ (glue q11)^ = r) => ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : Q x0 (y1 : Y); codeleft2_q10 := q11 : Q x1 (y1 : Y); codeleft2_u := H3 : glue (H1 : Q x0 ...) @ (glue (q11 : ...))^ = r |} : codeleft2; ((H0 : x0 = x1; H2 : transport (fun x : X => Q x y1) (H0 : x0 = x1) H1 = q11) : {p : x0 = x1 & transport (fun x : X => Q x y1) p H1 = q11}, (1%path : y1 = y1; 1%path : transport (fun y : Y => Q x1 y) (1%path : y1 = y1) q11 = q11) : {p : y1 = y1 & transport (fun y : Y => Q x1 y) p q11 = q11}) : {p : x0 = x1 & transport (fun x : X => Q x (codeleft2_y0 (...))) p (codeleft2_q00 ({| ...; ...; ...; ... |} : codeleft2)) = codeleft2_q10 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2)} * {p : codeleft2_y0 ({| codeleft2_y0 := y1 : Y; codeleft2_q00 := H1 : ...; codeleft2_q10 := q11 : ...; codeleft2_u := H3 : ... |} : codeleft2) = y1 & transport (fun y : Y => Q x1 y) p (codeleft2_q10 ({| ...; ...; ...; ... |} : codeleft2)) = q11}) : {a : codeleft2 & {p : (x0; codeleft2_q00 a).1 = (x1; codeleft2_q10 a).1 & transport (fun x : X => Q x (codeleft2_y0 a)) p (x0; codeleft2_q00 a).2 = (x1; codeleft2_q10 a).2} * {p : (codeleft2_y0 a; codeleft2_q10 a).1 = (y1; q11).1 & transport (fun y : Y => Q x1 y) p (codeleft2_y0 a; codeleft2_q10 a).2 = (y1; q11).2}}) (Ocodeleft2a_s H) (Ocodeleft2a_q01 H) (Ocodeleft2a_w H) (Ocodeleft2a_u H)) == idmap))
intros; reflexivity. Defined. (** Now we combine this equivalence with the insertion of our connected type. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout Ocodeleft2ab Ocodeleft2ac) <~> O codeleft2
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout Ocodeleft2ab Ocodeleft2ac) <~> O codeleft2
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout Ocodeleft2ab Ocodeleft2ac) <~> O {yqqu : codeleft2 & O (Join ((x0; codeleft2_q00 yqqu) = (x1; codeleft2_q10 yqqu)) ((codeleft2_y0 yqqu; codeleft2_q10 yqqu) = (y1; q11)))}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout Ocodeleft2ab Ocodeleft2ac) <~> O {x : codeleft2 & Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))}
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Pushout Ocodeleft2ab Ocodeleft2ac <~> {x : codeleft2 & Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))}
apply equiv_Ocodeleft2plus. Defined. (** The next step is to reassociate the resulting double-pushout and "contract" both of them, one after the other, because they are pushouts along equivalences. In order to do this, we need first of all to know that the resulting map from [codeleft0] to the above pushout factors through [Ocodeleft2b] via an equivalence. Here's the equivalence: *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft0 <~> Ocodeleft2b
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft0 <~> Ocodeleft2b
make_equiv_contr_basedpaths. Defined. Definition Ocodeleft02 (c : codeleft0) : Pushout Ocodeleft2ab Ocodeleft2ac := pushl' Ocodeleft2ab Ocodeleft2ac (Ocodeleft02b c).
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
c: codeleft0

(equiv_Ocodeleft2plus (Ocodeleft02 c)).1 = codeleft02 c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
c: codeleft0

(equiv_Ocodeleft2plus (Ocodeleft02 c)).1 = codeleft02 c
destruct c; reflexivity. Qed. (** And here we show that this equivalence is indeed a factor of the relevant map in the original pushout. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
c: codeleft0

equiv_Ocodeleft2 (to O (Pushout Ocodeleft2ab Ocodeleft2ac) (Ocodeleft02 c)) = to O codeleft2 (codeleft02 c)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
c: codeleft0

equiv_Ocodeleft2 (to O (Pushout Ocodeleft2ab Ocodeleft2ac) (Ocodeleft02 c)) = to O codeleft2 (codeleft02 c)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

equiv_Ocodeleft2 (to O (Pushout Ocodeleft2ab Ocodeleft2ac) (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})) = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

(equiv_O_functor O (equiv_sigma_contr (fun yqqu : codeleft2 => O (Join ((x0; codeleft2_q00 yqqu) = (x1; codeleft2_q10 yqqu)) ((codeleft2_y0 yqqu; codeleft2_q10 yqqu) = (y1; q11))))) oE ((equiv_O_sigma_O O (fun x : codeleft2 => Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))))^-1 oE equiv_O_functor O equiv_Ocodeleft2plus)) (to O (Pushout Ocodeleft2ab Ocodeleft2ac) (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})) = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

(equiv_O_functor O (equiv_sigma_contr (fun yqqu : codeleft2 => O (Join ((x0; codeleft2_q00 yqqu) = (x1; codeleft2_q10 yqqu)) ((codeleft2_y0 yqqu; codeleft2_q10 yqqu) = (y1; q11))))) oE ((equiv_O_sigma_O O (fun x : codeleft2 => Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))))^-1 oE equiv_O_functor O equiv_Ocodeleft2plus)) (to O (Pushout Ocodeleft2ab Ocodeleft2ac) (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})) = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

O_functor O pr1 (O_functor O (functor_sigma idmap (fun x : codeleft2 => to O (Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))))) (O_functor O equiv_Ocodeleft2plus (to O (Pushout Ocodeleft2ab Ocodeleft2ac) (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})))) = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

O_functor O pr1 (O_functor O (functor_sigma idmap (fun x : codeleft2 => to O (Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))))) (to O {x : codeleft2 & Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11))} (equiv_Ocodeleft2plus (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})))) = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

O_functor O pr1 (to O {x : codeleft2 & O (Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)))} (functor_sigma idmap (fun x : codeleft2 => to O (Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)))) (equiv_Ocodeleft2plus (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})))) = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

to O codeleft2 (functor_sigma idmap (fun x : codeleft2 => to O (Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)))) (equiv_Ocodeleft2plus (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |}))).1 = to O codeleft2 (codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |})
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
codeleft0_s0: x0 = x1
codeleft0_y1: Y
codeleft0_v0: ap left codeleft0_s0 = r
codeleft0_q01: Q x0 codeleft0_y1
codeleft0_q11: Q x1 codeleft0_y1
codeleft0_w0: transport (fun x : X => Q x codeleft0_y1) codeleft0_s0 codeleft0_q01 = codeleft0_q11
codeleft0_u0: glue codeleft0_q01 @ (glue codeleft0_q11)^ = r
codeleft0_d0: frobnicate r codeleft0_s0 codeleft0_y1 codeleft0_q11 (codeleft0_q01; codeleft0_w0; codeleft0_u0) = codeleft0_v0

(functor_sigma idmap (fun x : codeleft2 => to O (Join ((x0; codeleft2_q00 x) = (x1; codeleft2_q10 x)) ((codeleft2_y0 x; codeleft2_q10 x) = (y1; q11)))) (equiv_Ocodeleft2plus (Ocodeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |}))).1 = codeleft02 {| codeleft0_s := codeleft0_s0; codeleft0_y0 := codeleft0_y1; codeleft0_v := codeleft0_v0; codeleft0_q00 := codeleft0_q01; codeleft0_q10 := codeleft0_q11; codeleft0_w := codeleft0_w0; codeleft0_u := codeleft0_u0; codeleft0_d := codeleft0_d0 |}
rapply Ocodeleft02plus_02b. Qed. (** Thus, our pushout in which one vertex is itself a pushout can be written as a "double pushout" [codeleft1] <- [codeleft0] -> [codeleft2b] <- [codeleft2a] -> [codeleft2c]. Since the map [codeleft0] -> [codeleft2b] is an equivalence, the pushout of the left-hand span is equivalent to [codeleft1], and thus the whole thing is equivalent to a pushout [codeleft1] <- [codeleft2a] -> [codeleft2c] Now we claim that the left-hand map of this span is also an equivalence. Rather than showing this directly, it seems to be much easier to first construct *an* equivalence from [codeleft2a] to [codeleft1] and then show that it is equal (as a function) to the induced one. Here's the equivalence: *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> codeleft1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> codeleft1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> ?Goal
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
?Goal <~> codeleft1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

?Goal <~> codeleft1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
s: x0 = x1

?Goal0 s <~> ap left s = r
(** Here's frobnicate showing up again! *) apply frobnicate.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a <~> {s : x0 = x1 & {q0 : Q x0 ?y & {_ : transport (fun x : X => Q x ?y) s q0 = ?q1 & glue q0 @ (glue ?q1)^ = r}}}
make_equiv. Defined. (** And now we check that the two are equal. Because we used the same proof of [frobnicate] in two places, this equality becomes definitional after simply decomposing up a Sigma-type! *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a1 == codeleft01 o Ocodeleft02b^-1 o Ocodeleft2ab
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

Ocodeleft2a1 == codeleft01 o Ocodeleft02b^-1 o Ocodeleft2ab
intros; reflexivity. Defined. (** Now we're finally ready to prove the glue equivalence. Since later on we'll have to compute its action on inputs from [codeleft1], we decompose it into seven steps, each of which with a corresponding computation lemma. (These lemmas seem to be much easier to prove step-by-step than all at once if we proved the whole equivalence in a big shebang.) *) Definition codeglue1 : codeleft <~> O (Pushout (O_functor O codeleft01) (O_functor O codeleft02)) := equiv_O_pushout O _ _. Definition codeglue1_pushl (s : x0 = x1) (v : ap left s = r) : codeglue1 (to O _ (pushl (s;v))) = to O _ (pushl (to O _ (s; v))) := equiv_O_pushout_to_O_pushl _ _ _ _.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout (O_functor O codeleft01) (O_functor O codeleft02)) <~> O (Pushout (O_functor O codeleft01) (O_functor O Ocodeleft02))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout (O_functor O codeleft01) (O_functor O codeleft02)) <~> O (Pushout (O_functor O codeleft01) (O_functor O Ocodeleft02))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

1%equiv o O_functor O codeleft01 == O_functor O codeleft01 o 1%equiv
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
equiv_Ocodeleft2 o O_functor O Ocodeleft02 == O_functor O codeleft02 o 1%equiv
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

1%equiv o O_functor O codeleft01 == O_functor O codeleft01 o 1%equiv
intros x; reflexivity.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

equiv_Ocodeleft2 o O_functor O Ocodeleft02 == O_functor O codeleft02 o 1%equiv
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
x: codeleft0

equiv_Ocodeleft2 (O_functor O Ocodeleft02 (to O codeleft0 x)) = O_functor O codeleft02 (1%equiv (to O codeleft0 x))
abstract (rewrite !to_O_natural; apply Ocodeleft02_02b). Defined. Definition codeglue2_pushl (s : x0 = x1) (v : ap left s = r) : codeglue2 (to O _ (pushl (to O _ (s;v)))) = to O _ (pushl (to O _ (s;v))) := to_O_equiv_natural _ _ _. Definition codeglue3 : O (Pushout (O_functor O codeleft01) (O_functor O Ocodeleft02)) <~> O (Pushout codeleft01 Ocodeleft02) := equiv_inverse (equiv_O_pushout O _ _). Definition codeglue3_pushl (s : x0 = x1) (v : ap left s = r) : codeglue3 (to O _ (pushl (to O _ (s;v)))) = to O _ (pushl (s;v)) := inverse_equiv_O_pushout_to_O_pushl _ _ _ _. Definition codeglue4 : O (Pushout codeleft01 Ocodeleft02) <~> O (Pushout (fun x : Ocodeleft2a => pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab x)) Ocodeleft2ac) := equiv_O_functor O (equiv_inverse (equiv_pushout_assoc _ _ _ _)). Definition codeglue4_pushl (s : x0 = x1) (v : ap left s = r) : codeglue4 (to O _ (pushl (s;v))) = to O _ (pushl (pushl (s;v))) := to_O_equiv_natural _ _ _.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout (fun x : Ocodeleft2a => pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab x)) Ocodeleft2ac) <~> O (Pushout Ocodeleft2a1 Ocodeleft2ac)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O (Pushout (fun x : Ocodeleft2a => pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab x)) Ocodeleft2ac) <~> O (Pushout Ocodeleft2a1 Ocodeleft2ac)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft1 <~> Pushout codeleft01 Ocodeleft02b
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
?eB o Ocodeleft2a1 == (fun x : Ocodeleft2a => pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab x)) o 1%equiv
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
1%equiv o Ocodeleft2ac == Ocodeleft2ac o 1%equiv
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

codeleft1 <~> Pushout codeleft01 Ocodeleft02b
exact (Build_Equiv _ _ (pushl' codeleft01 Ocodeleft02b) _).
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

{| equiv_fun := pushl' codeleft01 Ocodeleft02b; equiv_isequiv := isequiv_pushout_isequiv' codeleft01 Ocodeleft02b |} o Ocodeleft2a1 == (fun x : Ocodeleft2a => pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab x)) o 1%equiv
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
x: Ocodeleft2a

{| equiv_fun := pushl' codeleft01 Ocodeleft02b; equiv_isequiv := isequiv_pushout_isequiv' codeleft01 Ocodeleft02b |} (Ocodeleft2a1 x) = pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab (1%equiv x))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
x: Ocodeleft2a

{| equiv_fun := pushl' codeleft01 Ocodeleft02b; equiv_isequiv := isequiv_pushout_isequiv' codeleft01 Ocodeleft02b |} (codeleft01 (Ocodeleft02b^-1 (Ocodeleft2ab x))) = pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab (1%equiv x))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
x: Ocodeleft2a

pushr (Ocodeleft02b (Ocodeleft02b^-1 (Ocodeleft2ab x))) = pushr' codeleft01 Ocodeleft02b (Ocodeleft2ab (1%equiv x))
apply ap, eisretr.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

1%equiv o Ocodeleft2ac == Ocodeleft2ac o 1%equiv
intros x; reflexivity. Defined. Definition codeglue5_pushl (s : x0 = x1) (v : ap left s = r) : codeglue5 (to O _ (pushl (pushl (s;v)))) = to O _ (pushl (s;v)) := to_O_equiv_natural _ _ _. Definition codeglue6 : O (Pushout Ocodeleft2a1 Ocodeleft2ac) <~> O Ocodeleft2c := equiv_O_functor O (equiv_inverse (Build_Equiv _ _ (pushr' Ocodeleft2a1 Ocodeleft2ac) _)). Definition codeglue6_pushl (s : x0 = x1) (v : ap left s = r) : codeglue6 (to O _ (pushl (s;v))) = let z := (frobnicate r s y1 q11)^-1 v in to O Ocodeleft2c (Ocodeleft2ac (Build_Ocodeleft2a s z.1 z.2.1 z.2.2)) := to_O_equiv_natural _ _ _.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O Ocodeleft2c <~> coderight (r @ glue q11)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O Ocodeleft2c <~> coderight (r @ glue q11)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

O {q01 : Q x0 y1 & glue q01 @ (glue q11)^ = r} <~> O (hfiber glue (r @ glue q11))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1

{q01 : Q x0 y1 & glue q01 @ (glue q11)^ = r} <~> hfiber glue (r @ glue q11)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
x0, x1: X
r: left x0 = left x1
y1: Y
q11: Q x1 y1
q01: Q x0 y1

glue q01 @ (glue q11)^ = r <~> glue q01 = r @ glue q11
apply equiv_moveL_pM. Defined. Definition codeglue7_to_O (q01 : Q x0 y1) (u : glue q01 @ (glue q11)^ = r) : codeglue7 (to O _ (q01;u)) = to O (hfiber glue (r @ glue q11)) (q01 ; moveL_pM (glue q11) (glue q01) r u) := to_O_equiv_natural _ _ _. Definition codeglue : codeleft <~> coderight (r @ glue q11) := codeglue7 oE codeglue6 oE codeglue5 oE codeglue4 oE codeglue3 oE codeglue2 oE codeglue1. End CodeGlue. End CodeLeft. (** *** Completion of codes *) Context `{Univalence}. Context (x0 : X). (** The equivalence [codeglue] requires a bit of massaging to put it into the form needed by the actual definition of [code] from pushout-induction and univalence. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1

transport (fun p : SPushout Q => left x0 = p -> Type) (glue q11) codeleft = coderight
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1

transport (fun p : SPushout Q => left x0 = p -> Type) (glue q11) codeleft = coderight
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
z: left x0 = right y1

transport (fun p : SPushout Q => left x0 = p -> Type) (glue q11) codeleft z = coderight z
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
z: left x0 = right y1

codeleft (transport (paths (left x0)) (glue q11)^ z) = coderight z
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
z: left x0 = right y1

codeleft (transport (paths (left x0)) (glue q11)^ z) <~> coderight z
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
z: left x0 = right y1

codeleft (z @ (glue q11)^) <~> coderight z
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
z: left x0 = right y1

coderight ((z @ (glue q11)^) @ glue q11) <~> coderight z
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
z: left x0 = right y1

(z @ (glue q11)^) @ glue q11 = z
refine (concat_pV_p z (glue q11)). Defined. (** Here's the final definition of [code]. *) Definition code (p : P) (r : left x0 = p) : Type := SPushout_ind Q (fun p => left x0 = p -> Type) (@codeleft x0) (@coderight x0) ap_code_glue p r. (** When we compute with [code], we'll need to extract from it the actual behavior of the function [codeglue]. Here's the mess of path algebra that we "naturally" get out when we try to do that; later we'll see how to deal with it. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
r: left x0 = right y1

ap10 (apD code (glue q11)) r = transport_arrow_toconst (glue q11) codeleft r @ path_universe_uncurried (equiv_transport coderight (concat_pV_p r (glue q11)) oE codeglue (r @ (glue q11)^) q11 oE equiv_transport codeleft (transport_paths_r (glue q11)^ r))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
r: left x0 = right y1

ap10 (apD code (glue q11)) r = transport_arrow_toconst (glue q11) codeleft r @ path_universe_uncurried (equiv_transport coderight (concat_pV_p r (glue q11)) oE codeglue (r @ (glue q11)^) q11 oE equiv_transport codeleft (transport_paths_r (glue q11)^ r))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0, x1: X
y1: Y
q11: Q x1 y1
r: left x0 = right y1

ap10 (ap_code_glue x1 y1 q11) r = transport_arrow_toconst (glue q11) codeleft r @ path_universe_uncurried (equiv_transport coderight (concat_pV_p r (glue q11)) oE codeglue (r @ (glue q11)^) q11 oE equiv_transport codeleft (transport_paths_r (glue q11)^ r))
refine (ap10_path_arrow _ _ _ _). Defined. (** ** Contractibility of codes *) (** To construct a center for every type of codes, we construct one in an easy case and transport it around. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X

code (left x0) 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X

code (left x0) 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X

codeleft 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X

O (Pushout (codeleft01 1) (codeleft02 1))
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X

codeleft1 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X

{s : x0 = x0 & ap left s = 1}
exact (idpath; idpath). Defined. Definition center_code (p : P) (r : left x0 = p) : code p r := transport (fun (pr : {p : P & left x0 = p}) => code pr.1 pr.2) (path_contr (A := {p : P & left x0 = p}) (left x0; idpath) (p;r)) center_code1. (** As in HFLL, we first construct a contraction in the "partially general" case of an arbitrary path from left to right. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
r: left x0 = right y1
c: code (right y1) r

center_code (right y1) r = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
r: left x0 = right y1
c: code (right y1) r

center_code (right y1) r = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
r: left x0 = right y1
c: coderight r

center_code (right y1) r = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
r: left x0 = right y1
c: O (hfiber glue r)

center_code (right y1) r = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
r: left x0 = right y1
q01: Q x0 y1
t: glue q01 = r

center_code (right y1) r = to O (hfiber glue r) (q01; t)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
r: left x0 = right y1
q01: Q x0 y1
t: glue q01 = r

transport (fun pr : {p : P & left x0 = p} => code pr.1 pr.2) (path_contr (left x0; 1) (right y1; r)) (to O (Pushout (codeleft01 1) (codeleft02 1)) (pushl (1; 1))) = to O (hfiber glue r) (q01; t)
(** Here's how we use the apparently-unmanageable [code_beta_glue]. First we destruct the path [t] to make things simpler. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

transport (fun pr : {p : P & left x0 = p} => code pr.1 pr.2) (path_contr (left x0; 1) (right y1; glue q01)) (to O (Pushout (codeleft01 1) (codeleft02 1)) (pushl (1; 1))) = to O (hfiber glue (glue q01)) (q01; 1)
(** Then we notice that if we tried rewriting with [code_beta_glue] here, the unmanageable-looking result is actually fully general over the path [glue q01], so we can prove by path induction that it equals the nicer expression we'd like to see. This is the purpose of the lemma [transport_singleton]. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

transport (code (right y1)) (concat_1p (glue q01)) (codeglue 1 q01 (to O (Pushout (codeleft01 1) (codeleft02 1)) (pushl (1; 1)))) = to O (hfiber glue (glue q01)) (q01; 1)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

transport (code (right y1)) (concat_1p (glue q01)) ((codeglue7 1 q01 oE codeglue6 1 q01 oE codeglue5 1 q01 oE codeglue4 1 q01 oE codeglue3 1 q01 oE codeglue2 1 q01 oE codeglue1 1) (to O (Pushout (codeleft01 1) (codeleft02 1)) (pushl (1; 1)))) = to O (hfiber glue (glue q01)) (q01; 1)
(** Now we evaluate [codeglue] step by step using our lemmas. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

transport (code (right y1)) (concat_1p (glue q01)) (codeglue7 1 q01 (codeglue6 1 q01 (codeglue5 1 q01 (codeglue4 1 q01 (codeglue3 1 q01 (codeglue2 1 q01 (codeglue1 1 (to O (Pushout (codeleft01 1) (codeleft02 1)) (pushl (1; 1)))))))))) = to O (hfiber glue (glue q01)) (q01; 1)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

transport (code (right y1)) (concat_1p (glue q01)) (to O (hfiber glue (1 @ glue q01)) ((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2)) = to O (hfiber glue (glue q01)) (q01; 1)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

to O (hfiber glue (glue q01)) (transport (hfiber glue) (concat_1p (glue q01)) ((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2)) = to O (hfiber glue (glue q01)) (q01; 1)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

(((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2).1; transport (fun x : left x0 = right y1 => glue ((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2).1 = x) (concat_1p (glue q01)) ((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2).2) = (q01; 1)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2).2 @ concat_1p (glue q01) = 1
(** Finally, we have another terrible-looking thing involving [frobnicate]. However, there are enough identity paths that [frobnicate] evaluates to... something that's almost fully path-general! So with just a little bit of further work, we can reduce it also to something we can prove with path-induction. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

((Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1; moveL_pM (glue q01) (glue (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).1) 1 (Ocodeleft2ac 1 q01 {| Ocodeleft2a_s := 1; Ocodeleft2a_q01 := ((frobnicate 1 1 y1 q01)^-1 1).1; Ocodeleft2a_w := (((frobnicate 1 1 y1 q01)^-1 1).2).1; Ocodeleft2a_u := (((frobnicate 1 1 y1 q01)^-1 1).2).2 |}).2).2 @ concat_1p (glue q01) = 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

moveL_pM (glue q01) (glue q01) 1 (transport (fun qt : {q0 : Q x0 y1 & q0 = q01} => glue qt.1 @ (glue q01)^ = 1) (path_sigma' (fun q0 : Q x0 y1 => q0 = q01) 1 (isequiv_functor_sigma_subproof (Q x0 y1) (fun q0 : Q x0 y1 => q0 = q01) (Q x0 y1) (fun q0 : Q x0 y1 => q0 = q01) idmap (isequiv_idmap (Q x0 y1)) (fun a : Q x0 y1 => idmap) (fun a : Q x0 y1 => isequiv_moveL_transport_V (fun x : X => Q x y1) 1 a q01) q01 1))^ ((internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (equiv_concat_l (concat_pp_V 1 (glue q01))^ 1) (concat_p1 (1 @ glue q01))) ((concat_1p (glue q01))^ @ (concat_p1 (1 @ glue q01))^))^-1 1)) @ concat_1p (glue q01) = 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

moveL_pM (glue q01) (glue q01) 1 (transport (fun qt : {q0 : Q x0 y1 & q0 = q01} => glue qt.1 @ (glue q01)^ = 1) (path_sigma' (fun q0 : Q x0 y1 => q0 = q01) 1 (isequiv_functor_sigma_subproof (Q x0 y1) (fun q0 : Q x0 y1 => q0 = q01) (Q x0 y1) (fun q0 : Q x0 y1 => q0 = q01) idmap (isequiv_idmap (Q x0 y1)) (fun a : Q x0 y1 => idmap) (fun a : Q x0 y1 => isequiv_moveL_transport_V (fun x : X => Q x y1) 1 a q01) q01 1))^ ((internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (equiv_concat_l (concat_pp_V 1 (glue q01))^ 1) (concat_p1 (1 @ glue q01))) ((concat_1p (glue q01))^ @ (concat_p1 (1 @ glue q01))^))^-1 1)) @ concat_1p (glue q01) = 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

moveL_pM (glue q01) (glue q01) 1 (transport (fun q : Q x0 y1 => glue q @ (glue q01)^ = 1) (ap pr1 (path_sigma' (fun q0 : Q x0 y1 => q0 = q01) 1 (isequiv_functor_sigma_subproof (Q x0 y1) (fun q0 : Q x0 y1 => q0 = q01) (Q x0 y1) (fun q0 : Q x0 y1 => q0 = q01) idmap (isequiv_idmap (Q x0 y1)) (fun a : Q x0 y1 => idmap) (fun a : Q x0 y1 => isequiv_moveL_transport_V (fun x : X => Q x y1) 1 a q01) q01 1))^) ((internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (equiv_concat_l (concat_pp_V 1 (glue q01))^ 1) (concat_p1 (1 @ glue q01))) ((concat_1p (glue q01))^ @ (concat_p1 (1 @ glue q01))^))^-1 1)) @ concat_1p (glue q01) = 1
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y1: Y
q01: Q x0 y1

moveL_pM (glue q01) (glue q01) 1 ((internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (internal_paths_rew_r (fun p : left x0 = right y1 => p @ (glue q01)^ = 1 <~> 1 = 1) (equiv_concat_l (concat_pp_V 1 (glue q01))^ 1) (concat_p1 (1 @ glue q01))) ((concat_1p (glue q01))^ @ (concat_p1 (1 @ glue q01))^))^-1 1) @ concat_1p (glue q01) = 1
destruct (glue q01); reflexivity. Qed. (** It should be possible to prove an analogous [contraction_code_left] directly, but for now we follow HFLL and ABFJ by introducing a surjectivity assumption. *)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y0: Y
q00: Q x0 y0
pr: {p : P & left x0 = p}
c: code pr.1 pr.2

center_code pr.1 pr.2 = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y0: Y
q00: Q x0 y0
pr: {p : P & left x0 = p}
c: code pr.1 pr.2

center_code pr.1 pr.2 = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y0: Y
q00: Q x0 y0
pr: {p : P & left x0 = p}

forall c : code pr.1 pr.2, center_code pr.1 pr.2 = c
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y0: Y
q00: Q x0 y0
pr: {p : P & left x0 = p}

(fun pr' : {p : P & left x0 = p} => forall c : code pr'.1 pr'.2, center_code pr'.1 pr'.2 = c) (right y0; glue q00)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
y0: Y
q00: Q x0 y0
c: code (right y0) (glue q00)

center_code (right y0) (glue q00) = c
apply contraction_code_right. Defined.
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
inh: merely {y0 : Y & Q x0 y0}
p: P
r: left x0 = p

Contr (code p r)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
inh: merely {y0 : Y & Q x0 y0}
p: P
r: left x0 = p

Contr (code p r)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
p: P
r: left x0 = p
inh: {y0 : Y & Q x0 y0}

Contr (code p r)
X, Y: Type
Q: X -> Y -> Type
O: ReflectiveSubuniverse
isconnected_cogap: forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected O (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
P:= SPushout Q: Type
H: Univalence
x0: X
p: P
r: left x0 = p
y0: Y
q00: Q x0 y0

Contr (code p r)
exact (Build_Contr _ (center_code p r) (contraction_code q00 (p;r))). Defined. (** This version is sufficient for the classical Blakers-Massey theorem, as we'll see below, since its leg-wise connectivity hypothesis implies the above surjectivity assumption. ABFJ have a different method for eliminating the surjectivity assumption using a lemma about pushouts of monos also being pullbacks, though it seems to only work for coderight. *) End GBM. (** ** The classical Blakers-Massey Theorem *)
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y

IsConnMap (Tr (m +2+ n)) (spglue Q)
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y

IsConnMap (Tr (m +2+ n)) (spglue Q)
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y
r: spushl Q x = spushr Q y

IsConnected (Tr (m +2+ n)) (hfiber (spglue Q) r)
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y
r: spushl Q x = spushr Q y

forall (x1 x3 : X) (y2 y4 : Y) (q12 : Q x1 y2) (q32 : Q x3 y2) (q34 : Q x3 y4), IsConnected (Tr (m +2+ n)) (Join ((x1; q12) = (x3; q32)) ((y2; q32) = (y4; q34)))
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y
r: spushl Q x = spushr Q y
IsConnected (Tr n.+1) {y0 : Y & Q x y0}
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y
r: spushl Q x = spushr Q y
x1, x3: X
y2, y4: Y
q12: Q x1 y2
q32: Q x3 y2
q34: Q x3 y4

IsConnected (Tr m) ((x1; q12) = (x3; q32))
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y
r: spushl Q x = spushr Q y
x1, x3: X
y2, y4: Y
q12: Q x1 y2
q32: Q x3 y2
q34: Q x3 y4
IsConnected (Tr n) ((y2; q32) = (y4; q34))
H: Univalence
m, n: trunc_index
X, Y: Type
Q: X -> Y -> Type
H0: forall y : Y, IsConnected (Tr m.+1) {x : X & Q x y}
H1: forall x : X, IsConnected (Tr n.+1) {y : Y & Q x y}
x: X
y: Y
r: spushl Q x = spushr Q y
IsConnected (Tr n.+1) {y0 : Y & Q x y0}
all: exact _. Defined.