From Coq Require Import ssreflect ssrfun FunctionalExtensionality.
Record Isomorphism (A B : Type) := {
Forward : A -> B;
Backward : B -> A;
BF : cancel Forward Backward;
FB : cancel Backward Forward;
}.
Infix "<-->" := Isomorphism (at level 95, no associativity).
Definition iso_refl {A : Type} : A <--> A := {|
Forward x := x;
Backward x := x;
BF x := eq_refl;
FB x := eq_refl;
|}.
Definition iso_sym {A B : Type} (α : A <--> B) : B <--> A := {|
Forward x := Backward _ _ α x;
Backward x := Forward _ _ α x;
BF x := FB _ _ α x;
FB x := BF _ _ α x;
|}.
Definition iso_trans {A B C : Type} (α : A <--> B) (β : B <--> C) : A <--> C.
Proof.
refine ({|
Forward x := Forward _ _ β (Forward _ _ α x);
Backward x := Backward _ _ α (Backward _ _ β x);
BF x := _;
FB x := _;
|}).
- by rewrite BF BF.
- by rewrite FB FB.
Qed.
Definition iso_exp {A B C : Type} (α : A <--> B) : (A -> C) <--> (B -> C).
Proof.
refine ({|
Forward f x := f (Backward _ _ α x);
Backward f x := f (Forward _ _ α x);
BF f := _;
FB f := _;
|}).
- apply functional_extensionality => x.
by rewrite BF.
- apply functional_extensionality => x.
by rewrite FB.
Qed.