aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/Wellfounded/Lexicographic_Product.v
diff options
context:
space:
mode:
authorGravatar filliatr <filliatr@85f007b7-540e-0410-9357-904b9bb8a0f7>2000-11-21 14:41:16 +0000
committerGravatar filliatr <filliatr@85f007b7-540e-0410-9357-904b9bb8a0f7>2000-11-21 14:41:16 +0000
commit838ffd441e80aa324ffe731f2527dbb181654308 (patch)
treea4ab1228901f2b63f0638c9a5fa627d6036af625 /theories/Wellfounded/Lexicographic_Product.v
parent78fb07846e6ca303417699d19beaeaf1a97f96af (diff)
ajout de theories/Wellfounded
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@900 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/Wellfounded/Lexicographic_Product.v')
-rw-r--r--theories/Wellfounded/Lexicographic_Product.v193
1 files changed, 193 insertions, 0 deletions
diff --git a/theories/Wellfounded/Lexicographic_Product.v b/theories/Wellfounded/Lexicographic_Product.v
new file mode 100644
index 000000000..5fa24e2cc
--- /dev/null
+++ b/theories/Wellfounded/Lexicographic_Product.v
@@ -0,0 +1,193 @@
+
+(* $Id$ *)
+
+(****************************************************************************)
+(* 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.
+ Induction 4;Intros.
+ Apply Acc_intro.
+ Induction y0.
+ Intros.
+ 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. (*** BUG ***)
+ 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).
+
+(*
+ Local sig_prod:=
+ [x:A*B]<{_:A&B}>Case x of [a:A][b:B](existS A [_:A]B a b) end.
+
+Lemma incl_sym_lexprod: (included (A*B) Symprod
+ (R_o_f (A*B) {_:A&B} sig_prod (lexprod A [_:A]B leA [_:A]leB))).
+Proof.
+ Red.
+ Induction x.
+ (Induction y1;Intros).
+ Red.
+ Unfold sig_prod .
+ Inversion_clear H.
+ (Apply left_lex;Auto with sets).
+
+ (Apply right_lex;Auto with sets).
+Save.
+*)
+
+ 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.
+ Destruct 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.