(** Functional extensionality *)

Local Notation FunctionalExtensionality :=
  (forall A B (f g : A -> B), (forall x, f x = g x) -> f = g).(** Equality of projections from diagonal *)

Local Notation EqDeltaProjs := (forall A, pi1 = pi2 :> (Delta A -> A)).(** Unicity of bijection inverse *)

Local Notation UniqueInverse := (forall A B (f:A->B) g1 g2, is_inverse f g1 -> is_inverse f g2 -> g1 = g2).(** Bijectivity of bijective composition *)

Definition action A B C (f:A->B) := (fun h:B->C => fun x => h (f x)).Local Notation BijectivityBijectiveComp := (forall A B C (f:A->B) g,
  is_inverse f g -> is_inverse (A:=B->C) (action f) (action g)).

(* Specifications: *)
Theorem FunctExt_iff_EqDeltaProjs : FunctionalExtensionality <-> EqDeltaProjs.
Lemma FunctExt_UniqInverse : FunctionalExtensionality -> UniqueInverse.
Lemma UniqInverse_EqDeltaProjs : UniqueInverse -> EqDeltaProjs.
Theorem FunctExt_iff_UniqInverse : FunctionalExtensionality <-> UniqueInverse.
Lemma FunctExt_BijComp : FunctionalExtensionality -> BijectivityBijectiveComp.
Lemma BijComp_FunctExt : BijectivityBijectiveComp -> FunctionalExtensionality.