(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)

(** This module states the axiom of (dependent) functional extensionality and (dependent) eta-expansion.
   It introduces a tactic [extensionality] to apply the axiom of extensionality to an equality goal. *)

(** The converse of functional extensionality. *)

Definition equal_f {A B : Type} {f g : A -> B} :
  f = g -> forall x, f x = g x
  := fun H x => f_equal (fun h => h x) H.Definition equal_f_dep {A B} {f g : forall (x : A), B x} :
  f = g -> forall x, f x = g x
  := fun H x => f_equal (fun h => h x) H.(** Statements of functional extensionality for simple and dependent functions. *)

Axiom functional_extensionality_dep : forall {A} {B : A -> Type},
  forall (f g : forall x : A, B x),
  (forall x, f x = g x) -> f = g.

(* Specifications: *)
Lemma functional_extensionality {A B} (f g : A -> B) : (forall x, f x = g x) -> f = g.
Lemma forall_extensionality {A} {B C : A -> Type} (H : forall x : A, B x = C x) : (forall x, B x) = (forall x, C x).
Lemma forall_extensionalityP {A} {B C : A -> Prop} (H : forall x : A, B x = C x) : (forall x, B x) = (forall x, C x).
Lemma forall_extensionalityS {A} {B C : A -> Set} (H : forall x : A, B x = C x) : (forall x, B x) = (forall x, C x).