Coq.Wellfounded.Union

# Module Coq.Wellfounded.Union

``

Author: Bruno Barras

`

`Require` Relation_Operators.
`Require` Relation_Definitions.
`Require` Transitive_Closure.

`Section` WfUnion.
`Variable` A: Set.
`Variable` R1,R2: (relation A).
`Syntactic` `Definition` Union := (union A R1 R2).

`Hints` Resolve Acc_clos_trans wf_clos_trans.

`Remark` strip_commut:
(commut A R1 R2)->(x,y:A)(clos_trans A R1 y x)->(z:A)(R2 z y)
->(EX y':A | (R2 y' x) & (clos_trans A R1 z y')).
`Proof`.
Induction 2;Intros.
Elim H with y0 x0 z ;Auto with sets;Intros.
Exists x1;Auto with sets.

Elim H2 with z0 ;Auto with sets;Intros.
Elim H4 with x1 ;Auto with sets;Intros.
Exists x2;Auto with sets.
Apply t_trans with x1 ;Auto with sets.
`Save`.

`Lemma` Acc_union: (commut A R1 R2)->((x:A)(Acc A R2 x)->(Acc A R1 x))
->(a:A)(Acc A R2 a)->(Acc A Union a).
`Proof`.
Induction 3.
Intros.
Apply Acc_intro;Intros.
Elim H4;Intros;Auto with sets.
Cut (clos_trans A R1 y x);Auto with sets.
ElimType (Acc A (clos_trans A R1) y);Intros.
Apply Acc_intro;Intros.
Elim H9;Intros.
Apply H7;Auto with sets.
Apply t_trans with x0 ;Auto with sets.

Elim strip_commut with x x0 y0 ;Auto with sets;Intros.
Apply Acc_inv_trans with x1 ;Auto with sets.
Unfold union .
Elim H12;Auto with sets;Intros.
Apply t_trans with y1 ;Auto with sets.

Apply (Acc_clos_trans A).
Apply Acc_inv with x ;Auto with sets.
Apply H0.
Apply Acc_intro;Auto with sets.
`Save`.

`Theorem` wf_union: (commut A R1 R2)->(well_founded A R1)->(well_founded A R2)
->(well_founded A Union).
`Proof`.
Unfold well_founded .
Intros.
Apply Acc_union;Auto with sets.
`Save`.

`End` WfUnion.

`

Index