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