Welcome to a World of Rocq (original) (raw)
Set Universe Polymorphism.
(* Equivalences *)
Class IsEquiv {A : Type} {B : Type} (f : A -> B) := BuildIsEquiv { e_inv : B -> A ; e_sect : forall x, e_inv (f x) = x; e_retr : forall y, f (e_inv y) = y; e_adj : forall x : A, e_retr (f x) = ap f (e_sect x); }.
(** A class that includes all the data of an adjoint equivalence. *) Class Equiv A B := BuildEquiv { e_fun : A -> B ; e_isequiv :> IsEquiv e_fun }.
Definition is_adjoint' {A B : Type} (f : A -> B) (g : B -> A) (issect : g∘ f == id) (isretr : f ∘ g == id) (a : A) : isretr (f a) = ap f (issect' f g issect isretr a).
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
isretr (f a) = ap f (issect' f g issect isretr a)
Proof.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
isretr (f a) = ap f (issect' f g issect isretr a)
unfold issect'.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
isretr (f a) = ap f ((ap g (ap f (issect a)^) @ ap g (isretr (f a))) @ issect a)
apply moveL_M1.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
eq_refl = ap f ((ap g (ap f (issect a)^) @ ap g (isretr (f a))) @ issect a) @ (isretr (f a))^
repeat rewrite ap_pp.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
eq_refl = ((ap f (ap g (ap f (issect a)^)) @ ap f (ap g (isretr (f a)))) @ ap f (issect a)) @ (isretr (f a))^
rewrite <- concat_p_pp; rewrite <- ap_compose.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
eq_refl = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ (ap f (issect a) @ (isretr (f a))^)
pose (concat_pA1 (fun b => (isretr b)^) (ap f (issect a))).
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
eq_refl = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ (ap f (issect a) @ (isretr (f a))^)
eapply concat.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
eq_refl = ?y
2: {
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
?y = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ (ap f (issect a) @ (isretr (f a))^)
apply ap2.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
?x = ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))
reflexivity.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
?x' = ap f (issect a) @ (isretr (f a))^
exact e. }
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
eq_refl = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ ((fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)))
cbn.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (ap f (issect a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (ap f (issect a)) = ap f (issect a) @ (fun b : B => (isretr b)^) (f a)
eq_refl = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a)))
clear e.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
eq_refl = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a)))
pose (concat_pA1 (fun b => (isretr b)^) (isretr (f a))).
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
eq_refl = (ap (fun x : B => f (g x)) (ap f (issect a)^) @ ap f (ap g (isretr (f a)))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a)))
rewrite <- concat_p_pp.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
pose (concat_A1p (fun b => (isretr b)) (isretr (f a))).
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:=** concat_A1p (fun b : B => isretr b) (isretr (f a)): ap (fun x : B => f (g x)) (isretr (f a)) @ (fun b : B => isretr b) (f a) = (fun b : B => isretr b) (f (g (f a))) @ isretr (f a)
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
apply moveL_Vp in e0.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap (fun x : B => f (g x)) (isretr (f a)) = (isretr (f (g (f a))) @ isretr (f a)) @ (isretr (f a))^
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
rewrite <- concat_p_pp in e0.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap (fun x : B => f (g x)) (isretr (f a)) = isretr (f (g (f a))) @ (isretr (f a) @ (isretr (f a))^)
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
rewrite inv_inv' in e0.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap (fun x : B => f (g x)) (isretr (f a)) = isretr (f (g (f a))) @ eq_refl
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
rewrite concat_refl in e0.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap (fun x : B => f (g x)) (isretr (f a)) = isretr (f (g (f a)))
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
rewrite ap_compose in e0.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
eapply concat.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
eq_refl = ?y
2: {
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?y = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a))))
apply ap2.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x = ap (fun x : B => f (g x)) (ap f (issect a)^)
reflexivity.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x' = ap f (ap g (isretr (f a))) @ ((isretr (f (g (f a))))^ @ ap (fun b : B => f (g b)) (ap f (issect a)))
rewrite concat_p_pp.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x' = (ap f (ap g (isretr (f a))) @ (isretr (f (g (f a))))^) @ ap (fun b : B => f (g b)) (ap f (issect a))
eapply concat.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x' = ?y
2: {
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?y = (ap f (ap g (isretr (f a))) @ (isretr (f (g (f a))))^) @ ap (fun b : B => f (g b)) (ap f (issect a))
apply ap2.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x = ap f (ap g (isretr (f a))) @ (isretr (f (g (f a))))^
eapply concat.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x = ?y
2:{
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?y = ap f (ap g (isretr (f a))) @ (isretr (f (g (f a))))^
apply ap2.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x0 = ap f (ap g (isretr (f a)))
symmetry.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
ap f (ap g (isretr (f a))) = ?x0
apply e0.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x'1 = (isretr (f (g (f a))))^
reflexivity. }
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x = isretr (f (g (f a))) @ (isretr (f (g (f a))))^
symmetry.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
isretr (f (g (f a))) @ (isretr (f (g (f a))))^ = ?x
apply inv_inv'.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x'0 = ap (fun b : B => f (g b)) (ap f (issect a))
reflexivity. }
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
?x' = eq_refl @ ap (fun b : B => f (g b)) (ap f (issect a))
reflexivity. }
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
eq_refl = ap (fun x : B => f (g x)) (ap f (issect a)^) @ (eq_refl @ ap (fun b : B => f (g b)) (ap f (issect a)))
repeat rewrite <- ap_compose.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
eq_refl = ap (fun x : A => f (g (f x))) (issect a)^ @ (eq_refl @ ap (fun x : A => f (g (f x))) (issect a))
cbn.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
eq_refl = ap (fun x : A => f (g (f x))) (issect a)^ @ ap (fun x : A => f (g (f x))) (issect a)
symmetry.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
ap (fun x : A => f (g (f x))) (issect a)^ @ ap (fun x : A => f (g (f x))) (issect a) = eq_refl
eapply concat.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
ap (fun x : A => f (g (f x))) (issect a)^ @ ap (fun x : A => f (g (f x))) (issect a) = ?y
refine (ap_pp ((f ∘ g) ∘f) _ _)^.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
ap (f ∘ g) ∘ f ((issect a)^ @ issect a) = eq_refl
rewrite inv_inv.
A, B**:** Type
f**:** A -> B
g**:** B -> A
issect**:** g ∘ f == id
isretr**:** f ∘ g == id
a**:** A
e**:=** concat_pA1 (fun b : B => (isretr b)^) (isretr (f a)): (fun b : B => (isretr b)^) (f (g (f a))) @ ap (fun b : B => f (g b)) (isretr (f a)) = isretr (f a) @ (fun b : B => (isretr b)^) (f a)
e0**:** ap f (ap g (isretr (f a))) = isretr (f (g (f a)))
ap (fun x : A => f (g (f x))) eq_refl = eq_refl
reflexivity. Defined.
Definition isequiv_adjointify {A B : Type} (f : A -> B) (g : B -> A) (issect : g∘ f == id) (isretr : f ∘ g == id) : IsEquiv f := BuildIsEquiv A B f g (issect' f g issect isretr) isretr (is_adjoint' f g issect isretr).