Section Relations.
(* Properties of a binary relation R on type A *)
Variable A : Set.
Variable R : A -> A -> Prop.
(* Definition of the reflexive-transitive closure R* of R *)
(* Smallest reflexive P containing R o P *)
Definition Rstar (x y : A) :=
forall P : A -> A -> Prop,
(forall u : A, P u u) ->
(forall u v w : A, R u v -> P v w -> P u w) -> P x y.
Proof
fun (x : A) (P : A -> A -> Prop) (h1 : forall u : A, P u u)
(h2 : forall u v w : A, R u v -> P v w -> P u w) =>
h1 x.
Proof
fun (x y z : A) (t1 : R x y) (t2 : Rstar y z) (P : A -> A -> Prop)
(h1 : forall u : A, P u u)
(h2 : forall u v w : A, R u v -> P v w -> P u w) =>
h2 x y z t1 (t2 P h1 h2).
(* We conclude with transitivity of Rstar : *)
Proof
fun (x y z : A) (h : Rstar x y) =>
h (fun u v : A => Rstar v z -> Rstar u z)
(fun (u : A) (t : Rstar u z) => t)
(fun (u v w : A) (t1 : R u v) (t2 : Rstar w z -> Rstar v z)
(t3 : Rstar w z) => Rstar_R u v z t1 (t2 t3)).
(* Another characterization of R* *)
(* Smallest reflexive P containing R o R* *)
Definition Rstar' (x y : A) :=
forall P : A -> A -> Prop,
P x x -> (forall u : A, R x u -> Rstar u y -> P x y) -> P x y.
Proof
fun (x : A) (P : A -> A -> Prop) (h : P x x)
(h' : forall u : A, R x u -> Rstar u x -> P x x) => h.
Proof
fun (x y z : A) (t1 : R x z) (t2 : Rstar z y) (P : A -> A -> Prop)
(h1 : P x x) (h2 : forall u : A, R x u -> Rstar u y -> P x y) =>
h2 z t1 t2.
(* Equivalence of the two definitions: *)
Proof
fun (x y : A) (h : Rstar' x y) =>
h Rstar (Rstar_reflexive x) (fun u : A => Rstar_R x u y).

Theorem Rstar_Rstar' : forall x y : A, Rstar x y -> Rstar' x y.