Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
bydestruct s.Defined.(* Sometimes we want the DPathSquare to be typed differently *)(* This could be achieved with some clever rewriting of squares and DPathSquares *)(* It seems that writing it like this might get in the way, Cube.v has some examples of this. *)
A, P: Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00, b10, b01, b11: P qx0: DPath (fun_ : A => P) px0 b00 b10 qx1: DPath (fun_ : A => P) px1 b01 b11 q0x: DPath (fun_ : A => P) p0x b00 b01 q1x: DPath (fun_ : A => P) p1x b10 b11
bydestruct s.Defined.Notationds_const' := equiv_ds_const'.(** [dp_apD] fits into a natural square *)
A: Type P: A -> Type f, g: forallx : A, P x x, y: A q: f == g p: x = y
DPathSquare P (sq_refl_h p) (apD f p) (apD g p) (q x)
(q y)
A: Type P: A -> Type f, g: forallx : A, P x x, y: A q: f == g p: x = y
DPathSquare P (sq_refl_h p) (apD f p) (apD g p) (q x)
(q y)
A: Type P: A -> Type f, g: forallx : A, P x x: A q: f == g
DPathSquare P (sq_refl_h 1) (apD f 1) (apD g 1) (q x)
(q x)
byapply sq_1G.Defined.
A: Type P: A -> Type a00, a10: A px0, px1: a00 = a10 p: px0 = px1 b00: P a00 b10: P a10 qx0: DPath P px0 b00 b10 qx1: DPath P px1 b00 b10
DPath (funx : a00 = a10 => DPath P x b00 b10) p qx0
qx1 <~> DPathSquare P (sq_G1 p) qx0 qx1 11
A: Type P: A -> Type a00, a10: A px0, px1: a00 = a10 p: px0 = px1 b00: P a00 b10: P a10 qx0: DPath P px0 b00 b10 qx1: DPath P px1 b00 b10
DPath (funx : a00 = a10 => DPath P x b00 b10) p qx0
qx1 <~> DPathSquare P (sq_G1 p) qx0 qx1 11
A: Type P: A -> Type a00: A b00, b10: P a00 qx0, qx1: DPath P 1 b00 b10
DPath (funx : a00 = a00 => DPath P x b00 b10) 1 qx0
qx1 <~> DPathSquare P (sq_G1 1%path) qx0 qx1 11
exact sq_G1.Defined.Notationds_G1 := equiv_ds_G1.(** A [DPath] in a path-type is naturally a [DPathSquare]. *)
A: Type B: A -> Type f, g: foralla : A, B a x1, x2: A p: x1 = x2 q1: f x1 = g x1 q2: f x2 = g x2
DPath (funx : A => f x = g x) p q1 q2 <~>
DPathSquare B (sq_refl_h p) (apD f p) (apD g p) q1 q2
A: Type B: A -> Type f, g: foralla : A, B a x1, x2: A p: x1 = x2 q1: f x1 = g x1 q2: f x2 = g x2
DPath (funx : A => f x = g x) p q1 q2 <~>
DPathSquare B (sq_refl_h p) (apD f p) (apD g p) q1 q2
A: Type B: A -> Type f, g: foralla : A, B a x1: A q1, q2: f x1 = g x1
DPath (funx : A => f x = g x) 1 q1 q2 <~>
DPathSquare B (sq_refl_h 1) (apD f 1) (apD g 1) q1 q2
exact sq_1G.Defined.Notationds_dp := equiv_ds_dp.(** Dependent Kan operations *)SectionKan.Context {A : Type} {P : A -> Type} {a00a10a01a11 : A}
{px0 : a00 = a10} {px1 : a01 = a11} {p0xp1x}
(s : PathSquare px0 px1 p0x p1x)
{b00 : P a00} {b10 : P a10} {b01 : P a01} {b11 : P a11}.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx1: DPath P px1 b01 b11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
{qx0 : DPath P px0 b00 b10 &
DPathSquare P s qx0 qx1 q0x q1x}
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx1: DPath P px1 b01 b11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
{qx0 : DPath P px0 b00 b10 &
DPathSquare P s qx0 qx1 q0x q1x}
destruct s; apply sq_fill_l.Defined.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx1: DPath P px1 b01 b11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11 qx0: DPath P px0 b00 b10 t: DPathSquare P s qx0 qx1 q0x q1x qx0': DPath P px0 b00 b10 t': DPathSquare P s qx0' qx1 q0x q1x
qx0 = qx0'
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx1: DPath P px1 b01 b11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11 qx0: DPath P px0 b00 b10 t: DPathSquare P s qx0 qx1 q0x q1x qx0': DPath P px0 b00 b10 t': DPathSquare P s qx0' qx1 q0x q1x
qx0 = qx0'
A: Type P: A -> Type x: A s: PathSquare 1111 b00, b10, b01, b11: P x qx1: DPath P 1 b01 b11 q0x: DPath P 1 b00 b01 q1x: DPath P 1 b10 b11 qx0: DPath P 1 b00 b10 t: DPathSquare P 1%square qx0 qx1 q0x q1x qx0': DPath P 1 b00 b10 t': DPathSquare P 1%square qx0' qx1 q0x q1x
qx0 = qx0'
exact (sq_fill_l_uniq t t').Defined.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
{qx1 : DPath P px1 b01 b11 &
DPathSquare P s qx0 qx1 q0x q1x}
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
{qx1 : DPath P px1 b01 b11 &
DPathSquare P s qx0 qx1 q0x q1x}
destruct s; apply sq_fill_r.Defined.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11 qx1: DPath P px1 b01 b11 t: DPathSquare P s qx0 qx1 q0x q1x qx1': DPath P px1 b01 b11 t': DPathSquare P s qx0 qx1' q0x q1x
qx1 = qx1'
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11 qx1: DPath P px1 b01 b11 t: DPathSquare P s qx0 qx1 q0x q1x qx1': DPath P px1 b01 b11 t': DPathSquare P s qx0 qx1' q0x q1x
qx1 = qx1'
A: Type P: A -> Type x: A s: PathSquare 1111 b00, b10, b01, b11: P x qx0: DPath P 1 b00 b10 q0x: DPath P 1 b00 b01 q1x: DPath P 1 b10 b11 qx1: DPath P 1 b01 b11 t: DPathSquare P 1%square qx0 qx1 q0x q1x qx1': DPath P 1 b01 b11 t': DPathSquare P 1%square qx0 qx1' q0x q1x
qx1 = qx1'
exact (sq_fill_r_uniq t t').Defined.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
DPath P px0 b00 b10 <~> DPath P px1 b01 b11
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
DPath P px0 b00 b10 <~> DPath P px1 b01 b11
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
DPath P px0 b00 b10 -> DPath P px1 b01 b11
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
DPath P px1 b01 b11 -> DPath P px0 b00 b10
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
?f o ?g == idmap
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
?g o ?f == idmap
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
DPath P px0 b00 b10 -> DPath P px1 b01 b11
intros qx0; exact (ds_fill_r qx0 q0x q1x).1.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
DPath P px1 b01 b11 -> DPath P px0 b00 b10
intros qx1; exact (ds_fill_l qx1 q0x q1x).1.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11
(funqx0 : DPath P px0 b00 b10 =>
(ds_fill_r qx0 q0x q1x).1)
o (funqx1 : DPath P px1 b01 b11 =>
(ds_fill_l qx1 q0x q1x).1) == idmap
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 q0x: DPath P p0x b00 b01 q1x: DPath P p1x b10 b11 qx1: DPath P px1 b01 b11
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 qx1: DPath P px1 b01 b11 q1x: DPath P p1x b10 b11
{q0x : DPath P p0x b00 b01 &
DPathSquare P s qx0 qx1 q0x q1x}
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 qx1: DPath P px1 b01 b11 q1x: DPath P p1x b10 b11
{q0x : DPath P p0x b00 b01 &
DPathSquare P s qx0 qx1 q0x q1x}
destruct s; apply sq_fill_t.Defined.
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 qx1: DPath P px1 b01 b11 q0x: DPath P p0x b00 b01
{q1x : DPath P p1x b10 b11 &
DPathSquare P s qx0 qx1 q0x q1x}
A: Type P: A -> Type a00, a10, a01, a11: A px0: a00 = a10 px1: a01 = a11 p0x: a00 = a01 p1x: a10 = a11 s: PathSquare px0 px1 p0x p1x b00: P a00 b10: P a10 b01: P a01 b11: P a11 qx0: DPath P px0 b00 b10 qx1: DPath P px1 b01 b11 q0x: DPath P p0x b00 b01
{q1x : DPath P p1x b10 b11 &
DPathSquare P s qx0 qx1 q0x q1x}
destruct s; apply sq_fill_b.Defined.EndKan.(** Another equivalent formulation of a dependent square over reflexivity *)
A: Type a0, a1: A p: a0 = a1 P: A -> Type b00: P a0 b10: P a1 b01: P a0 b11: P a1 qx0: DPath P p b00 b10 qx1: DPath P p b01 b11 q0x: b00 = b01 q1x: b10 = b11
DPathSquare P (sq_refl_h p) qx0 qx1 q0x q1x <~>
transport (funy : P a0 => DPath P p y b11) q0x
(transport (funy : P a1 => DPath P p b00 y) q1x qx0) =
qx1
A: Type a0, a1: A p: a0 = a1 P: A -> Type b00: P a0 b10: P a1 b01: P a0 b11: P a1 qx0: DPath P p b00 b10 qx1: DPath P p b01 b11 q0x: b00 = b01 q1x: b10 = b11
DPathSquare P (sq_refl_h p) qx0 qx1 q0x q1x <~>
transport (funy : P a0 => DPath P p y b11) q0x
(transport (funy : P a1 => DPath P p b00 y) q1x qx0) =
qx1
A: Type a0: A P: A -> Type b00, b10, b01, b11: P a0 qx0: DPath P 1 b00 b10 qx1: DPath P 1 b01 b11 q0x: b00 = b01 q1x: b10 = b11
PathSquare qx0 qx1 q0x q1x <~>
transport (funy : P a0 => y = b11) q0x
(transport (funy : P a0 => b00 = y) q1x qx0) = qx1
A: Type a0: A P: A -> Type b00, b10, b01, b11: P a0 qx0: DPath P 1 b00 b10 qx1: DPath P 1 b01 b11 q0x: b00 = b01 q1x: b10 = b11
qx0 @ q1x = q0x @ qx1 <~>
transport (funy : P a0 => y = b11) q0x
(transport (funy : P a0 => b00 = y) q1x qx0) = qx1
A: Type a0: A P: A -> Type b00, b10, b01, b11: P a0 qx0: DPath P 1 b00 b10 qx1: DPath P 1 b01 b11 q0x: b00 = b01 q1x: b10 = b11
transport (funy : P a0 => y = b11) q0x
(transport (funy : P a0 => b00 = y) q1x qx0) =
?Goal
A: Type a0: A P: A -> Type b00, b10, b01, b11: P a0 qx0: DPath P 1 b00 b10 qx1: DPath P 1 b01 b11 q0x: b00 = b01 q1x: b10 = b11
qx0 @ q1x = q0x @ qx1 <~> ?Goal = qx1
A: Type a0: A P: A -> Type b00, b10, b01, b11: P a0 qx0: DPath P 1 b00 b10 qx1: DPath P 1 b01 b11 q0x: b00 = b01 q1x: b10 = b11
transport (funy : P a0 => y = b11) q0x
(transport (funy : P a0 => b00 = y) q1x qx0) =
?Goal
apply transport_paths_l.
A: Type a0: A P: A -> Type b00, b10, b01, b11: P a0 qx0: DPath P 1 b00 b10 qx1: DPath P 1 b01 b11 q0x: b00 = b01 q1x: b10 = b11