Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \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
Require Import Relation_Operators. Require Import Relation_Definitions. Require Import Transitive_Closure. Section WfUnion. Variable A : Type. Variables R1 R2 : relation A. Notation Union := (union A R1 R2).A:TypeR1, R2:relation Acommut 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'A:TypeR1, R2:relation Acommut 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'A:TypeR1, R2:relation AH:commut A R1 R2x, y:AH0:R1 x yz:AH1:R2 z xexists2 y' : A, R2 y' y & clos_trans A R1 z y'A:TypeR1, R2:relation AH:commut A R1 R2x, y, z:AH0:clos_trans A R1 x yH1:clos_trans A R1 y zIH1:forall z1 : A, R2 z1 x -> exists2 y' : A, R2 y' y & clos_trans A R1 z1 y'IH2:forall z1 : A, R2 z1 y -> exists2 y' : A, R2 y' z & clos_trans A R1 z1 y'z0:AH2:R2 z0 xexists2 y' : A, R2 y' z & clos_trans A R1 z0 y'A:TypeR1, R2:relation AH:commut A R1 R2x, y:AH0:R1 x yz:AH1:R2 z xexists2 y' : A, R2 y' y & clos_trans A R1 z y'exists x0; auto with sets.A:TypeR1, R2:relation AH:commut A R1 R2x, y:AH0:R1 x yz:AH1:R2 z xx0:AH2:R2 x0 yH3:R1 z x0exists2 y' : A, R2 y' y & clos_trans A R1 z y'A:TypeR1, R2:relation AH:commut A R1 R2x, y, z:AH0:clos_trans A R1 x yH1:clos_trans A R1 y zIH1:forall z1 : A, R2 z1 x -> exists2 y' : A, R2 y' y & clos_trans A R1 z1 y'IH2:forall z1 : A, R2 z1 y -> exists2 y' : A, R2 y' z & clos_trans A R1 z1 y'z0:AH2:R2 z0 xexists2 y' : A, R2 y' z & clos_trans A R1 z0 y'A:TypeR1, R2:relation AH:commut A R1 R2x, y, z:AH0:clos_trans A R1 x yH1:clos_trans A R1 y zIH1:forall z1 : A, R2 z1 x -> exists2 y' : A, R2 y' y & clos_trans A R1 z1 y'IH2:forall z1 : A, R2 z1 y -> exists2 y' : A, R2 y' z & clos_trans A R1 z1 y'z0:AH2:R2 z0 xx0:AH3:R2 x0 yH4:clos_trans A R1 z0 x0exists2 y' : A, R2 y' z & clos_trans A R1 z0 y'A:TypeR1, R2:relation AH:commut A R1 R2x, y, z:AH0:clos_trans A R1 x yH1:clos_trans A R1 y zIH1:forall z1 : A, R2 z1 x -> exists2 y' : A, R2 y' y & clos_trans A R1 z1 y'IH2:forall z1 : A, R2 z1 y -> exists2 y' : A, R2 y' z & clos_trans A R1 z1 y'z0:AH2:R2 z0 xx0:AH3:R2 x0 yH4:clos_trans A R1 z0 x0x1:AH5:R2 x1 zH6:clos_trans A R1 x0 x1exists2 y' : A, R2 y' z & clos_trans A R1 z0 y'apply t_trans with x0; auto with sets. Qed.A:TypeR1, R2:relation AH:commut A R1 R2x, y, z:AH0:clos_trans A R1 x yH1:clos_trans A R1 y zIH1:forall z1 : A, R2 z1 x -> exists2 y' : A, R2 y' y & clos_trans A R1 z1 y'IH2:forall z1 : A, R2 z1 y -> exists2 y' : A, R2 y' z & clos_trans A R1 z1 y'z0:AH2:R2 z0 xx0:AH3:R2 x0 yH4:clos_trans A R1 z0 x0x1:AH5:R2 x1 zH6:clos_trans A R1 x0 x1clos_trans A R1 z0 x1A:TypeR1, R2:relation Acommut A R1 R2 -> (forall x : A, Acc R2 x -> Acc R1 x) -> forall a : A, Acc R2 a -> Acc Union aA:TypeR1, R2:relation Acommut A R1 R2 -> (forall x : A, Acc R2 x -> Acc R1 x) -> forall a : A, Acc R2 a -> Acc Union aA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y : A, R2 y x -> Acc R2 yH2:forall y : A, R2 y x -> Acc Union yAcc Union xA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xAcc Union yA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xAcc Union yA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xclos_trans A R1 y x -> Acc Union yA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xx0:AH5:forall y0 : A, clos_trans A R1 y0 x0 -> Acc (clos_trans A R1) y0H6:forall y0 : A, clos_trans A R1 y0 x0 -> clos_trans A R1 y0 x -> Acc Union y0H7:clos_trans A R1 x0 xAcc Union x0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xAcc (clos_trans A R1) yA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xx0:AH5:forall y0 : A, clos_trans A R1 y0 x0 -> Acc (clos_trans A R1) y0H6:forall y0 : A, clos_trans A R1 y0 x0 -> clos_trans A R1 y0 x -> Acc Union y0H7:clos_trans A R1 x0 xAcc Union x0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0Acc Union y0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R1 y0 x0Acc Union y0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R2 y0 x0Acc Union y0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R1 y0 x0Acc Union y0apply t_trans with x0; auto with sets.A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R1 y0 x0clos_trans A R1 y0 xA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x1 : A, Acc R2 x1 -> Acc R1 x1x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R2 y0 x0Acc Union y0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x2 : A, Acc R2 x2 -> Acc R1 x2x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R2 y0 x0x1:AH10:R2 x1 xH11:clos_trans A R1 y0 x1Acc Union y0A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x2 : A, Acc R2 x2 -> Acc R1 x2x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R2 y0 x0x1:AH10:R2 x1 xH11:clos_trans A R1 y0 x1clos_trans A Union y0 x1A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x2 : A, Acc R2 x2 -> Acc R1 x2x:AH1:forall y1 : A, R2 y1 x -> Acc R2 y1H2:forall y1 : A, R2 y1 x -> Acc Union y1y:AH3:Union y xH4:R1 y xx0:AH5:forall y1 : A, clos_trans A R1 y1 x0 -> Acc (clos_trans A R1) y1H6:forall y1 : A, clos_trans A R1 y1 x0 -> clos_trans A R1 y1 x -> Acc Union y1H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R2 y0 x0x1:AH10:R2 x1 xH11:clos_trans A R1 y0 x1clos_trans A (fun x2 y1 : A => R1 x2 y1 \/ R2 x2 y1) y0 x1apply t_trans with y1; auto with sets.A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x3 : A, Acc R2 x3 -> Acc R1 x3x:AH1:forall y2 : A, R2 y2 x -> Acc R2 y2H2:forall y2 : A, R2 y2 x -> Acc Union y2y:AH3:Union y xH4:R1 y xx0:AH5:forall y2 : A, clos_trans A R1 y2 x0 -> Acc (clos_trans A R1) y2H6:forall y2 : A, clos_trans A R1 y2 x0 -> clos_trans A R1 y2 x -> Acc Union y2H7:clos_trans A R1 x0 xy0:AH8:Union y0 x0H9:R2 y0 x0x1:AH10:R2 x1 xH11:clos_trans A R1 y0 x1x2, y1, z:AH12:clos_trans A R1 x2 y1H13:clos_trans A (fun x3 y2 : A => R1 x3 y2 \/ R2 x3 y2) x2 y1H14:clos_trans A R1 y1 zH15:clos_trans A (fun x3 y2 : A => R1 x3 y2 \/ R2 x3 y2) y1 zclos_trans A (fun x3 y2 : A => R1 x3 y2 \/ R2 x3 y2) x2 zA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xAcc (clos_trans A R1) yA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xAcc R1 yA:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xAcc R1 xapply Acc_intro; auto with sets. Qed.A:TypeR1, R2:relation AH:commut A R1 R2H0:forall x0 : A, Acc R2 x0 -> Acc R1 x0x:AH1:forall y0 : A, R2 y0 x -> Acc R2 y0H2:forall y0 : A, R2 y0 x -> Acc Union y0y:AH3:Union y xH4:R1 y xAcc R2 xA:TypeR1, R2:relation Acommut A R1 R2 -> well_founded R1 -> well_founded R2 -> well_founded UnionA:TypeR1, R2:relation Acommut A R1 R2 -> well_founded R1 -> well_founded R2 -> well_founded UnionA:TypeR1, R2:relation Acommut A R1 R2 -> (forall a : A, Acc R1 a) -> (forall a : A, Acc R2 a) -> forall a : A, Acc Union aapply Acc_union; auto with sets. Qed. End WfUnion.A:TypeR1, R2:relation AH:commut A R1 R2H0:forall a0 : A, Acc R1 a0H1:forall a0 : A, Acc R2 a0a:AAcc Union a