| Authors: Bruno Barras,Cristina Cornes |
Require Eqdep.
Require Relation_Operators.
Require Transitive_Closure.
| From : Constructing Recursion Operators in Type Theory L. Paulson JSC (1986) 2, 325-355 |
Section WfLexicographic_Product.
Variable A:Set.
Variable B:A->Set.
Variable leA: A->A->Prop.
Variable leB: (x:A)(B x)->(B x)->Prop.
Syntactic Definition LexProd := (lexprod A B leA leB).
Hints Resolve t_step Acc_clos_trans wf_clos_trans.
Lemma acc_A_B_lexprod : (x:A)(Acc A leA x)
->((x0:A)(clos_trans A leA x0 x)->(well_founded (B x0) (leB x0)))
->(y:(B x))(Acc (B x) (leB x) y)
->(Acc (sigS A B) LexProd (existS A B x y)).
Proof.
Induction 1; Intros x0 H0 H1 H2 y.
Induction 1;Intros.
Apply Acc_intro.
Induction y0.
Intros x2 y1 H6.
Simple Inversion H6;Intros.
Cut (leA x2 x0);Intros.
Apply H1;Auto with sets.
Intros.
Apply H2.
Apply t_trans with x2 ;Auto with sets.
Red in H2.
Apply H2.
Auto with sets.
Injection H8.
Induction 2.
Injection H9.
Induction 2;Auto with sets.
Elim H8.
Generalize y2 y' H9 H7 .
Replace x3 with x0.
Clear H7 H8 H9 y2 y' x3 H6 y1 x2 y0.
Intros.
Apply H5.
Elim inj_pair2 with A B x0 y' x1 ;Auto with sets.
Injection H9;Auto with sets.
Qed.
Theorem wf_lexprod:
(well_founded A leA) ->((x:A) (well_founded (B x) (leB x)))
-> (well_founded (sigS A B) LexProd).
Proof.
Intros wfA wfB;Unfold well_founded .
Induction a;Intros.
Apply acc_A_B_lexprod;Auto with sets;Intros.
Red in wfB.
Auto with sets.
Save.
End WfLexicographic_Product.
Section Wf_Symmetric_Product.
Variable A:Set.
Variable B:Set.
Variable leA: A->A->Prop.
Variable leB: B->B->Prop.
Syntactic Definition Symprod := (symprod A B leA leB).
Lemma Acc_symprod: (x:A)(Acc A leA x)->(y:B)(Acc B leB y)
->(Acc (A*B) Symprod (x,y)).
Proof.
Induction 1;Intros.
Elim H2;Intros.
Apply Acc_intro;Intros.
Inversion_clear H5;Auto with sets.
Apply H1;Auto with sets.
Apply Acc_intro;Auto with sets.
Save.
Lemma wf_symprod: (well_founded A leA)->(well_founded B leB)
->(well_founded (A*B) Symprod).
Proof.
Red.
Induction a;Intros.
Apply Acc_symprod;Auto with sets.
Save.
End Wf_Symmetric_Product.
Section Swap.
Variable A:Set.
Variable R:A->A->Prop.
Syntactic Definition SwapProd :=(swapprod A R).
Lemma swap_Acc: (x,y:A)(Acc A*A SwapProd (x,y))->(Acc A*A SwapProd (y,x)).
Proof.
Intros.
Inversion_clear H.
Apply Acc_intro.
NewDestruct y0;Intros.
Inversion_clear H;Inversion_clear H1;Apply H0.
Apply sp_swap.
Apply right_sym;Auto with sets.
Apply sp_swap.
Apply left_sym;Auto with sets.
Apply sp_noswap.
Apply right_sym;Auto with sets.
Apply sp_noswap.
Apply left_sym;Auto with sets.
Save.
Lemma Acc_swapprod: (x,y:A)(Acc A R x)->(Acc A R y)
->(Acc A*A SwapProd (x,y)).
Proof.
Induction 1;Intros.
Cut (y0:A)(R y0 x0)->(Acc ? SwapProd (y0,y)).
Clear H1.
Elim H2;Intros.
Cut (y:A)(R y x1)->(Acc ? SwapProd (x0,y)).
Clear H3.
Intro.
Apply Acc_intro.
Induction y0;Intros.
Inversion_clear H5.
Inversion_clear H6;Auto with sets.
Apply swap_Acc.
Inversion_clear H6;Auto with sets.
Intros.
Apply H3;Auto with sets;Intros.
Apply Acc_inv with (y1,x1) ;Auto with sets.
Apply sp_noswap.
Apply right_sym;Auto with sets.
Auto with sets.
Save.
Lemma wf_swapprod: (well_founded A R)->(well_founded A*A SwapProd).
Proof.
Red.
Induction a;Intros.
Apply Acc_swapprod;Auto with sets.
Save.
End Swap.