Section PointFixe.
(* cadeau de Christine Paulin, pour definir un point fixe avec une relation bien fondee *)
Variable A : Set.
Variable P : A -> Set.
Variable R : A -> A -> Prop.
Hypothesis Rwf : well_founded R.
Variable F : forall x : A, (forall y : A, R y x -> P y) -> P x.
Hypothesis
F_ext :
forall (x : A) (f g : forall y : A, R y x -> P y),
(forall (y : A) (p : R y x), f y p = g y p) -> F x f = F x g.
Fixpoint Fix_F (x : A) (r : Acc R x) {struct r} : P x :=
F x (fun (y : A) (p : R y x) => Fix_F y (Acc_inv r y p)).
Scheme Acc_inv_dep := Induction for Acc Sort Prop.
intros x r; elim r using Acc_inv_dep; auto.
Qed.
intro x; elim (Rwf x); intros.
rewrite (Fix_F_eq x0 r); rewrite (Fix_F_eq x0 s); intros.
apply F_ext; auto.
Qed.
Definition Fix (x : A) := Fix_F x (Rwf x).

Lemma fix_eq : forall x : A, Fix x = F x (fun (y : A) (p : R y x) => Fix y).