Definition injective {X Y:Type} (f:X->Y) :=
  forall x1 x2:X, f x1 = f x2 -> x1 = x2.Definition surjective {X Y:Type} (f:X->Y) :=
  forall y:Y, exists x:X, f x = y.Definition bijective {X Y:Type} (f:X->Y) :=
  injective f /\ surjective f.Inductive invertible {X Y:Type} (f:X->Y) : Prop :=
  | intro_invertible: forall g:Y->X,
  (forall x:X, g (f x) = x) -> (forall y:Y, f (g y) = y) ->
  invertible f.Inductive invertible {X Y:Type} (f:X->Y) : Prop :=
  | intro_invertible: forall g:Y->X,
  (forall x:X, g (f x) = x) -> (forall y:Y, f (g y) = y) ->
  invertible f.

(* Specifications: *)
Lemma unique_inverse: forall {X Y:Type} (f:X->Y), invertible f -> exists! g:Y->X, (forall x:X, g (f x) = x) /\ (forall y:Y, f (g y) = y).