--

open function

structure bijection (A : Type) :=
(func finv : A → A)
(linv : finv ∘ func = id)
(rinv : func ∘ finv = id)

attribute bijection.func [coercion]

namespace bijection
  variable {A : Type}

  protected theorem eq {f g : bijection A}
    (func_eq : func f = func g) (finv_eq : finv f = finv g) : f = g :=
  begin
    revert finv_eq,
    revert func_eq,
    cases g with [gfunc, gfinv, glinv, grinv],
    cases f with [func, finv, linv, rinv],
    state,
    esimp,
    intros [func_eq, finv_eq],
    revert grinv, revert glinv, revert rinv, revert linv,
    rewrite [func_eq, finv_eq],
    intros [H1, H2, H3, H4],
    apply rfl
  end

end bijection