(************************************************************************)
(*         *      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)         *)
(************************************************************************)
(** Author: Bruno Barras *)
Section WfUnion.
Variable A : Type.
Variables R1 R2 : relation A.
Notation Union := (union A R1 R2).
Remark strip_commut :
commut A R1 R2 ->
forall x y:A,
clos_trans A R1 y x ->
forall z:A, R2 z y ->  exists2 y' : A, R2 y' x & clos_trans A R1 z y'.

(* Specifications: *)
Lemma Acc_union :
commut A R1 R2 ->
(forall x:A, Acc R2 x -> Acc R1 x) -> forall a:A, Acc R2 a -> Acc Union a.
Theorem wf_union :
commut A R1 R2 -> well_founded R1 -> well_founded R2 -> well_founded Union.