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]
(** * Commutative squares *)(** Commutative squares compose vertically. A --f--> B | // | h comm g | // | V // V C --f'-> D | // | h' comm' g' | // | V // V E --f''> F*)
A, B, C, D, E, F: Type f: A -> B f': C -> D h: A -> C g: B -> D comm: f' o h == g o f f'': E -> F h': C -> E g': D -> F comm': f'' o h' == g' o f'
f'' o (h' o h) == g' o g o f
A, B, C, D, E, F: Type f: A -> B f': C -> D h: A -> C g: B -> D comm: f' o h == g o f f'': E -> F h': C -> E g': D -> F comm': f'' o h' == g' o f'
f'' o (h' o h) == g' o g o f
A, B, C, D, E, F: Type f: A -> B f': C -> D h: A -> C g: B -> D comm: f' o h == g o f f'': E -> F h': C -> E g': D -> F comm': f'' o h' == g' o f' x: A
f'' (h' (h x)) = g' (g (f x))
A, B, C, D, E, F: Type f: A -> B f': C -> D h: A -> C g: B -> D comm: f' o h == g o f f'': E -> F h': C -> E g': D -> F comm': f'' o h' == g' o f' x: A
g' (f' (h x)) = g' (g (f x))
apply ap, comm.Defined.(** Commutative squares compose horizontally. A --k--> B --l--> C | // | // | f comm g comm h | // | // | V // V // V X --i--> Y --j--> Z*)
A, B, C, X, Y, Z: Type k: A -> B l: B -> C f: A -> X g: B -> Y h: C -> Z i: X -> Y j: Y -> Z H: i o f == g o k K: j o g == h o l
j o i o f == h o (l o k)
A, B, C, X, Y, Z: Type k: A -> B l: B -> C f: A -> X g: B -> Y h: C -> Z i: X -> Y j: Y -> Z H: i o f == g o k K: j o g == h o l
j o i o f == h o (l o k)
A, B, C, X, Y, Z: Type k: A -> B l: B -> C f: A -> X g: B -> Y h: C -> Z i: X -> Y j: Y -> Z H: i o f == g o k K: j o g == h o l x: A
j (i (f x)) = h (l (k x))
A, B, C, X, Y, Z: Type k: A -> B l: B -> C f: A -> X g: B -> Y h: C -> Z i: X -> Y j: Y -> Z H: i o f == g o k K: j o g == h o l x: A
j (i (f x)) = j (g (k x))
apply ap, H.Defined.(** Given any commutative square from [f] to [f'] whose verticals[wA, wB] are equivalences, the [equiv_inv] square from [f'] to [f] with verticals [wA ^-1, wB ^-1] also commutes. *)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f
f o wA^-1 == wB^-1 o f'
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f
f o wA^-1 == wB^-1 o f'
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a': A'
f (wA^-1 a') = wB^-1 (f' a')
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a': A'
f (wA^-1 a') = wB^-1 (wB (f (wA^-1 a')))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a': A'
wB^-1 (wB (f (wA^-1 a'))) = wB^-1 (f' a')
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a': A'
f (wA^-1 a') = wB^-1 (wB (f (wA^-1 a')))
apply inverse, eissect.
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a': A'
wB^-1 (wB (f (wA^-1 a'))) = wB^-1 (f' a')
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a': A'
f' (wA (wA^-1 a')) = f' a'
apply ap, eisretr.Defined.(** Up to naturality, the result of [comm_square_inverse] really is aretraction (aka left inverse); *)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
comm_square_comp wf (comm_square_inverse wf) a @
eissect wB (f a) = ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
comm_square_comp wf (comm_square_inverse wf) a @
eissect wB (f a) = ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
(((eissect wB (f (wA^-1 (wA a))))^ @
ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a)))) @
ap wB^-1 (wf a)) @ eissect wB (f a) =
ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
(eissect wB (f (wA^-1 (wA a))))^ @
(ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
(ap wB^-1 (wf a) @ eissect wB (f a))) =
ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
(ap wB^-1 (wf a) @ eissect wB (f a)) =
eissect wB (f (wA^-1 (wA a))) @ ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
(ap wB^-1 (wf a) @ eissect wB (f a)) =
ap (wB^-1 o wB) (ap f (eissect wA a)) @
eissect wB (f a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap (wB^-1 o wB) (ap f (eissect wA a)) @
eissect wB (f a) =
eissect wB (f (wA^-1 (wA a))) @ ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap (wB^-1 o wB) (ap f (eissect wA a)) @
eissect wB (f a) =
eissect wB (f (wA^-1 (wA a))) @ ap f (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
eissect wB (f (wA^-1 (wA a))) @
ap idmap (ap f (eissect wA a)) =
eissect wB (f (wA^-1 (wA a))) @ ap f (eissect wA a)
apply ap, ap_idmap.
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
(ap wB^-1 (wf a) @ eissect wB (f a)) =
ap (wB^-1 o wB) (ap f (eissect wA a)) @
eissect wB (f a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
(ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
ap wB^-1 (wf a)) @ eissect wB (f a) =
ap (funx : B => wB^-1 (wB x)) (ap f (eissect wA a)) @
eissect wB (f a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap wB^-1
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
ap wB^-1 (wf a) =
ap (funx : B => wB^-1 (wB x)) (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap wB^-1
(((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
wf a) =
ap (funx : B => wB^-1 (wB x)) (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap wB^-1
(((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
wf a) = ap wB^-1 (ap wB (ap f (eissect wA a)))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
((wf (wA^-1 (wA a)))^ @ ap f' (eisretr wA (wA a))) @
wf a = ap wB (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
(wf (wA^-1 (wA a)))^ @
(ap f' (eisretr wA (wA a)) @ wf a) =
ap wB (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap f' (eisretr wA (wA a)) @ wf a =
wf (wA^-1 (wA a)) @ ap wB (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap f' (eisretr wA (wA a)) @ wf a =
ap (funx : A => f' (wA x)) (eissect wA a) @ wf a
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap (funx : A => f' (wA x)) (eissect wA a) @ wf a =
wf (wA^-1 (wA a)) @ ap wB (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap f' (eisretr wA (wA a)) @ wf a =
ap (funx : A => f' (wA x)) (eissect wA a) @ wf a
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap f' (eisretr wA (wA a)) =
ap (funx : A => f' (wA x)) (eissect wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap f' (eisretr wA (wA a)) =
ap f' (ap wA (eissect wA a))
apply ap, eisadj.
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
ap (funx : A => f' (wA x)) (eissect wA a) @ wf a =
wf (wA^-1 (wA a)) @ ap wB (ap f (eissect wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A
wf (wA^-1 (wA a)) @
ap (funx : A => wB (f x)) (eissect wA a) =
wf (wA^-1 (wA a)) @ ap wB (ap f (eissect wA a))
apply whiskerL, (ap_compose f wB).Defined.(** and similarly, [comm_square_inverse] is a section (aka right [equiv_inv]). *)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
comm_square_comp (comm_square_inverse wf) wf a @
eisretr wB (f' a) = ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
comm_square_comp (comm_square_inverse wf) wf a @
eisretr wB (f' a) = ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
(wf (wA^-1 a) @
ap wB
((eissect wB (f (wA^-1 a)))^ @
ap wB^-1 ((wf (wA^-1 a))^ @ ap f' (eisretr wA a)))) @
eisretr wB (f' a) = ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
(wf (wA^-1 a) @
(ap wB (eissect wB (f (wA^-1 a)))^ @
(ap wB (ap wB^-1 (wf (wA^-1 a))^) @
ap wB (ap wB^-1 (ap f' (eisretr wA a)))))) @
eisretr wB (f' a) = ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
(((wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^) @
ap wB (ap wB^-1 (wf (wA^-1 a))^)) @
ap wB (ap wB^-1 (ap f' (eisretr wA a)))) @
eisretr wB (f' a) = ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
((wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^) @
ap wB (ap wB^-1 (wf (wA^-1 a))^)) @
(ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a)) = ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
((wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^) @
ap wB (ap wB^-1 (wf (wA^-1 a))^)) @ p =
ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
((wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^) @
ap wB (ap wB^-1 (wf (wA^-1 a))^)) @ p =
(eisretr wB (f' (wA (wA^-1 a))))^ @ p
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
(eisretr wB (f' (wA (wA^-1 a))))^ @ p =
ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
((wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^) @
ap wB (ap wB^-1 (wf (wA^-1 a))^)) @ p =
(eisretr wB (f' (wA (wA^-1 a))))^ @ p
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
(wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^) @
ap wB (ap wB^-1 (wf (wA^-1 a))^) =
(eisretr wB (f' (wA (wA^-1 a))))^
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^ =
(eisretr wB (f' (wA (wA^-1 a))))^ @
(ap wB (ap wB^-1 (wf (wA^-1 a))^))^
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^ =
(eisretr wB (f' (wA (wA^-1 a))))^ @
ap (funx : B' => wB (wB^-1 x)) (wf (wA^-1 a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
(eisretr wB (f' (wA (wA^-1 a))))^ @
ap (funx : B' => wB (wB^-1 x)) (wf (wA^-1 a)) =
(eisretr wB (f' (wA (wA^-1 a))))^ @
(ap wB (ap wB^-1 (wf (wA^-1 a))^))^
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
wf (wA^-1 a) @ ap wB (eissect wB (f (wA^-1 a)))^ =
(eisretr wB (f' (wA (wA^-1 a))))^ @
ap (funx : B' => wB (wB^-1 x)) (wf (wA^-1 a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
wf (wA^-1 a) @ (eisretr wB (wB (f (wA^-1 a))))^ =
(eisretr wB (f' (wA (wA^-1 a))))^ @
ap (funx : B' => wB (wB^-1 x)) (wf (wA^-1 a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
(eisretr wB (f' (wA (wA^-1 a))))^ @
ap (funx : B' => wB (wB^-1 x)) (wf (wA^-1 a)) =
(eisretr wB (f' (wA (wA^-1 a))))^ @
(ap wB (ap wB^-1 (wf (wA^-1 a))^))^
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
ap (funx : B' => wB (wB^-1 x)) (wf (wA^-1 a)) =
(ap wB (ap wB^-1 (wf (wA^-1 a))^))^
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
ap wB (ap wB^-1 (wf (wA^-1 a))) =
((ap wB (ap wB^-1 (wf (wA^-1 a))))^)^
apply inverse, inv_V.
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
(eisretr wB (f' (wA (wA^-1 a))))^ @ p =
ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A' p:= ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a): wB (wB^-1 (f' (wA (wA^-1 a)))) = f' a
p =
eisretr wB (f' (wA (wA^-1 a))) @ ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
ap wB (ap wB^-1 (ap f' (eisretr wA a))) @
eisretr wB (f' a) =
eisretr wB (f' (wA (wA^-1 a))) @ ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
ap (funx : B' => wB (wB^-1 x)) (ap f' (eisretr wA a)) @
eisretr wB (f' a) =
eisretr wB (f' (wA (wA^-1 a))) @ ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
ap (funx : B' => wB (wB^-1 x)) (ap f' (eisretr wA a)) @
eisretr wB (f' a) =
eisretr wB (f' (wA (wA^-1 a))) @
ap idmap (ap f' (eisretr wA a))
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
eisretr wB (f' (wA (wA^-1 a))) @
ap idmap (ap f' (eisretr wA a)) =
eisretr wB (f' (wA (wA^-1 a))) @ ap f' (eisretr wA a)
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
ap (funx : B' => wB (wB^-1 x)) (ap f' (eisretr wA a)) @
eisretr wB (f' a) =
eisretr wB (f' (wA (wA^-1 a))) @
ap idmap (ap f' (eisretr wA a))
exact (concat_Ap (eisretr wB) _).
A, B: Type f: A -> B A', B': Type f': A' -> B' wA: A <~> A' wB: B <~> B' wf: f' o wA == wB o f a: A'
eisretr wB (f' (wA (wA^-1 a))) @
ap idmap (ap f' (eisretr wA a)) =
eisretr wB (f' (wA (wA^-1 a))) @ ap f' (eisretr wA a)