summaryrefslogtreecommitdiff
path: root/test-suite/success
diff options
context:
space:
mode:
authorGravatar Samuel Mimram <samuel.mimram@ens-lyon.org>2004-07-28 21:54:47 +0000
committerGravatar Samuel Mimram <samuel.mimram@ens-lyon.org>2004-07-28 21:54:47 +0000
commit6b649aba925b6f7462da07599fe67ebb12a3460e (patch)
tree43656bcaa51164548f3fa14e5b10de5ef1088574 /test-suite/success
Imported Upstream version 8.0pl1upstream/8.0pl1
Diffstat (limited to 'test-suite/success')
-rw-r--r--test-suite/success/Abstract.v826
-rw-r--r--test-suite/success/Case1.v15
-rw-r--r--test-suite/success/Case10.v26
-rw-r--r--test-suite/success/Case11.v11
-rw-r--r--test-suite/success/Case12.v60
-rw-r--r--test-suite/success/Case13.v33
-rw-r--r--test-suite/success/Case14.v16
-rw-r--r--test-suite/success/Case15.v48
-rw-r--r--test-suite/success/Case16.v9
-rw-r--r--test-suite/success/Case17.v45
-rw-r--r--test-suite/success/Case2.v11
-rw-r--r--test-suite/success/Case5.v14
-rw-r--r--test-suite/success/Case6.v19
-rw-r--r--test-suite/success/Case7.v16
-rw-r--r--test-suite/success/Case9.v55
-rw-r--r--test-suite/success/CaseAlias.v21
-rw-r--r--test-suite/success/Cases.v1597
-rw-r--r--test-suite/success/CasesDep.v405
-rw-r--r--test-suite/success/Check.v14
-rw-r--r--test-suite/success/Conjecture.v13
-rw-r--r--test-suite/success/DHyp.v14
-rw-r--r--test-suite/success/Decompose.v7
-rw-r--r--test-suite/success/Destruct.v13
-rw-r--r--test-suite/success/DiscrR.v41
-rw-r--r--test-suite/success/Discriminate.v11
-rw-r--r--test-suite/success/Field.v71
-rw-r--r--test-suite/success/Fourier.v16
-rw-r--r--test-suite/success/Funind.v440
-rw-r--r--test-suite/success/Generalize.v7
-rw-r--r--test-suite/success/Hints.v48
-rw-r--r--test-suite/success/Inductive.v34
-rw-r--r--test-suite/success/Injection.v34
-rw-r--r--test-suite/success/Inversion.v85
-rw-r--r--test-suite/success/LetIn.v11
-rw-r--r--test-suite/success/MatchFail.v28
-rw-r--r--test-suite/success/Mod_ltac.v20
-rw-r--r--test-suite/success/Mod_params.v78
-rw-r--r--test-suite/success/Mod_strengthen.v64
-rw-r--r--test-suite/success/NatRing.v10
-rw-r--r--test-suite/success/Omega.v89
-rw-r--r--test-suite/success/PPFix.v88
-rw-r--r--test-suite/success/Print.v20
-rw-r--r--test-suite/success/Projection.v45
-rw-r--r--test-suite/success/Record.v3
-rw-r--r--test-suite/success/Reg.v136
-rw-r--r--test-suite/success/Remark.v12
-rw-r--r--test-suite/success/Rename.v5
-rw-r--r--test-suite/success/Require.v3
-rw-r--r--test-suite/success/Scopes.v8
-rw-r--r--test-suite/success/Simplify_eq.v13
-rw-r--r--test-suite/success/Tauto.v240
-rw-r--r--test-suite/success/Try.v8
-rw-r--r--test-suite/success/cc.v83
-rw-r--r--test-suite/success/coercions.v11
-rw-r--r--test-suite/success/coqbugs0181.v7
-rw-r--r--test-suite/success/eauto.v49
-rw-r--r--test-suite/success/eqdecide.v29
-rw-r--r--test-suite/success/evars.v23
-rw-r--r--test-suite/success/fix.v51
-rw-r--r--test-suite/success/if.v5
-rw-r--r--test-suite/success/implicit.v31
-rw-r--r--test-suite/success/import_lib.v202
-rw-r--r--test-suite/success/import_mod.v75
-rw-r--r--test-suite/success/inds_type_sec.v10
-rw-r--r--test-suite/success/induct.v17
-rw-r--r--test-suite/success/ltac.v70
-rw-r--r--test-suite/success/mutual_ind.v41
-rw-r--r--test-suite/success/options.v34
-rw-r--r--test-suite/success/refine.v30
-rw-r--r--test-suite/success/setoid_test.v104
-rw-r--r--test-suite/success/unfold.v15
-rw-r--r--test-suite/success/univers.v19
72 files changed, 4982 insertions, 0 deletions
diff --git a/test-suite/success/Abstract.v8 b/test-suite/success/Abstract.v8
new file mode 100644
index 00000000..21a985bc
--- /dev/null
+++ b/test-suite/success/Abstract.v8
@@ -0,0 +1,26 @@
+
+(* Cf coqbugs #546 *)
+
+Require Import Omega.
+
+Section S.
+
+Variables n m : nat.
+Variable H : n<m.
+
+Inductive Dummy : nat -> Set :=
+| Dummy0 : Dummy 0
+| Dummy2 : Dummy 2
+| DummyApp : forall i j, Dummy i -> Dummy j -> Dummy (i+j).
+
+Definition Bug : Dummy (2*n).
+Proof.
+induction n.
+ simpl ; apply Dummy0.
+ replace (2 * S n0) with (2*n0 + 2) ; auto with arith.
+ apply DummyApp.
+ 2:exact Dummy2.
+ apply IHn0 ; abstract omega.
+Defined.
+
+End S.
diff --git a/test-suite/success/Case1.v b/test-suite/success/Case1.v
new file mode 100644
index 00000000..2d5a5134
--- /dev/null
+++ b/test-suite/success/Case1.v
@@ -0,0 +1,15 @@
+(* Testing eta-expansion of elimination predicate *)
+
+Section NATIND2.
+Variable P : nat -> Type.
+Variable H0 : (P O).
+Variable H1 : (P (S O)).
+Variable H2 : (n:nat)(P n)->(P (S (S n))).
+Fixpoint nat_ind2 [n:nat] : (P n) :=
+ <P>Cases n of
+ O => H0
+ | (S O) => H1
+ | (S (S n)) => (H2 n (nat_ind2 n))
+ end.
+End NATIND2.
+
diff --git a/test-suite/success/Case10.v b/test-suite/success/Case10.v
new file mode 100644
index 00000000..73413c47
--- /dev/null
+++ b/test-suite/success/Case10.v
@@ -0,0 +1,26 @@
+(* ============================================== *)
+(* To test compilation of dependent case *)
+(* Multiple Patterns *)
+(* ============================================== *)
+Inductive skel: Type :=
+ PROP: skel
+ | PROD: skel->skel->skel.
+
+Parameter Can : skel -> Type.
+Parameter default_can : (s:skel) (Can s).
+
+
+Type [s1,s2:skel]
+ <[s1,_:skel](Can s1)>Cases s1 s2 of
+ PROP PROP => (default_can PROP)
+ | s1 _ => (default_can s1)
+ end.
+
+
+Type [s1,s2:skel]
+<[s1:skel][_:skel](Can s1)>Cases s1 s2 of
+ PROP PROP => (default_can PROP)
+| (PROP as s) _ => (default_can s)
+| ((PROD s1 s2) as s) PROP => (default_can s)
+| ((PROD s1 s2) as s) _ => (default_can s)
+end.
diff --git a/test-suite/success/Case11.v b/test-suite/success/Case11.v
new file mode 100644
index 00000000..580cd87d
--- /dev/null
+++ b/test-suite/success/Case11.v
@@ -0,0 +1,11 @@
+(* L'algo d'inférence du prédicat doit gérer le K-rédex dans le type de b *)
+(* Problème rapporté par Solange Coupet *)
+
+Section A.
+
+Variables Alpha:Set; Beta:Set.
+
+Definition nodep_prod_of_dep: (sigS Alpha [a:Alpha]Beta)-> Alpha*Beta:=
+[c] Cases c of (existS a b)=>(a,b) end.
+
+End A.
diff --git a/test-suite/success/Case12.v b/test-suite/success/Case12.v
new file mode 100644
index 00000000..284695f4
--- /dev/null
+++ b/test-suite/success/Case12.v
@@ -0,0 +1,60 @@
+(* This example was proposed by Cuihtlauac ALVARADO *)
+
+Require PolyList.
+
+Fixpoint mult2 [n:nat] : nat :=
+Cases n of
+| O => O
+| (S n) => (S (S (mult2 n)))
+end.
+
+Inductive list : nat -> Set :=
+| nil : (list O)
+| cons : (n:nat)(list (mult2 n))->(list (S (S (mult2 n)))).
+
+Type
+[P:((n:nat)(list n)->Prop);
+ f:(P O nil);
+ f0:((n:nat; l:(list (mult2 n)))
+ (P (mult2 n) l)->(P (S (S (mult2 n))) (cons n l)))]
+ Fix F
+ {F [n:nat; l:(list n)] : (P n l) :=
+ <P>Cases l of
+ nil => f
+ | (cons n0 l0) => (f0 n0 l0 (F (mult2 n0) l0))
+ end}.
+
+Inductive list' : nat -> Set :=
+| nil' : (list' O)
+| cons' : (n:nat)[m:=(mult2 n)](list' m)->(list' (S (S m))).
+
+Fixpoint length [n; l:(list' n)] : nat :=
+ Cases l of
+ nil' => O
+ | (cons' _ m l0) => (S (length m l0))
+ end.
+
+Type
+[P:((n:nat)(list' n)->Prop);
+ f:(P O nil');
+ f0:((n:nat)
+ [m:=(mult2 n)](l:(list' m))(P m l)->(P (S (S m)) (cons' n l)))]
+ Fix F
+ {F [n:nat; l:(list' n)] : (P n l) :=
+ <P>
+ Cases l of
+ nil' => f
+ | (cons' n0 m l0) => (f0 n0 l0 (F m l0))
+ end}.
+
+(* Check on-the-fly insertion of let-in patterns for compatibility *)
+
+Inductive list'' : nat -> Set :=
+| nil'' : (list'' O)
+| cons'' : (n:nat)[m:=(mult2 n)](list'' m)->[p:=(S (S m))](list'' p).
+
+Check Fix length { length [n; l:(list'' n)] : nat :=
+ Cases l of
+ nil'' => O
+ | (cons'' n l0) => (S (length (mult2 n) l0))
+ end }.
diff --git a/test-suite/success/Case13.v b/test-suite/success/Case13.v
new file mode 100644
index 00000000..71c9191d
--- /dev/null
+++ b/test-suite/success/Case13.v
@@ -0,0 +1,33 @@
+(* Check coercions in patterns *)
+
+Inductive I : Set :=
+ C1 : nat -> I
+| C2 : I -> I.
+
+Coercion C1 : nat >-> I.
+
+(* Coercion at the root of pattern *)
+Check [x]Cases x of (C2 n) => O | O => O | (S n) => n end.
+
+(* Coercion not at the root of pattern *)
+Check [x]Cases x of (C2 O) => O | _ => O end.
+
+(* Unification and coercions inside patterns *)
+Check [x:(option nat)]Cases x of None => O | (Some O) => O | _ => O end.
+
+(* Coercion up to delta-conversion, and unification *)
+Coercion somenat := (Some nat).
+Check [x]Cases x of None => O | O => O | (S n) => n end.
+
+(* Coercions with parameters *)
+Inductive listn : nat-> Set :=
+ niln : (listn O)
+| consn : (n:nat)nat->(listn n) -> (listn (S n)).
+
+Inductive I' : nat -> Set :=
+ C1' : (n:nat) (listn n) -> (I' n)
+| C2' : (n:nat) (I' n) -> (I' n).
+
+Coercion C1' : listn >-> I'.
+Check [x:(I' O)]Cases x of (C2' _ _) => O | niln => O | _ => O end.
+Check [x:(I' O)]Cases x of (C2' _ niln) => O | _ => O end.
diff --git a/test-suite/success/Case14.v b/test-suite/success/Case14.v
new file mode 100644
index 00000000..edecee79
--- /dev/null
+++ b/test-suite/success/Case14.v
@@ -0,0 +1,16 @@
+(* Test of inference of elimination predicate for "if" *)
+(* submitted by Robert R Schneck *)
+
+Axiom bad : false = true.
+
+Definition try1 : False :=
+ <[b:bool][_:false=b](if b then False else True)>
+ Cases bad of refl_equal => I end.
+
+Definition try2 : False :=
+ <[b:bool][_:false=b]((if b then False else True)::Prop)>
+ Cases bad of refl_equal => I end.
+
+Definition try3 : False :=
+ <[b:bool][_:false=b](([b':bool] if b' then False else True) b)>
+ Cases bad of refl_equal => I end.
diff --git a/test-suite/success/Case15.v b/test-suite/success/Case15.v
new file mode 100644
index 00000000..22944520
--- /dev/null
+++ b/test-suite/success/Case15.v
@@ -0,0 +1,48 @@
+(* Check compilation of multiple pattern-matching on terms non
+ apparently of inductive type *)
+
+(* Check that the non dependency in y is OK both in V7 and V8 *)
+Check ([x;y:Prop;z]<[x][z]x=x \/ z=z>Cases x y z of
+ | O y z' => (or_introl ? (z'=z') (refl_equal ? O))
+ | _ y O => (or_intror ?? (refl_equal ? O))
+ | x y _ => (or_introl ?? (refl_equal ? x))
+ end).
+
+(* Suggested by Pierre Letouzey (PR#207) *)
+Inductive Boite : Set :=
+ boite : (b:bool)(if b then nat else nat*nat)->Boite.
+
+Definition test := [B:Boite]<nat>Cases B of
+ (boite true n) => n
+| (boite false (n,m)) => (plus n m)
+end.
+
+(* Check lazyness of compilation ... future work
+Inductive I : Set := c : (b:bool)(if b then bool else nat)->I.
+
+Check [x]
+ Cases x of
+ (c (true as y) (true as x)) => (if x then y else true)
+ | (c false O) => true | _ => false
+ end.
+
+Check [x]
+ Cases x of
+ (c true true) => true
+ | (c false O) => true
+ | _ => false
+ end.
+
+(* Devrait produire ceci mais trouver le type intermediaire est coton ! *)
+Check
+ [x:I]
+ Cases x of
+ (c b y) =>
+ (<[b:bool](if b then bool else nat)->bool>if b
+ then [y](if y then true else false)
+ else [y]Cases y of
+ O => true
+ | (S _) => false
+ end y)
+ end.
+*)
diff --git a/test-suite/success/Case16.v b/test-suite/success/Case16.v
new file mode 100644
index 00000000..3f142fae
--- /dev/null
+++ b/test-suite/success/Case16.v
@@ -0,0 +1,9 @@
+(**********************************************************************)
+(* Test dependencies in constructors *)
+(**********************************************************************)
+
+Check [x : {b:bool|if b then True else False}]
+ <[x]let (b,_) = x in if b then True else False>Cases x of
+ | (exist true y) => y
+ | (exist false z) => z
+ end.
diff --git a/test-suite/success/Case17.v b/test-suite/success/Case17.v
new file mode 100644
index 00000000..07d64958
--- /dev/null
+++ b/test-suite/success/Case17.v
@@ -0,0 +1,45 @@
+(* Check the synthesis of predicate from a cast in case of matching of
+ the first component (here [list bool]) of a dependent type (here [sigS])
+ (Simplification of an example from file parsing2.v of the Coq'Art
+ exercises) *)
+
+Require Import PolyList.
+
+Variable parse_rel : (list bool) -> (list bool) -> nat -> Prop.
+
+Variables l0:(list bool); rec:(l' : (list bool))
+ (le (length l') (S (length l0))) ->
+ {l'' : (list bool) &
+ {t : nat | (parse_rel l' l'' t) /\ (le (length l'') (length l'))}} +
+ {(l'' : (list bool))(t : nat)~ (parse_rel l' l'' t)}.
+
+Axiom HHH : (A:Prop)A.
+
+Check (Cases (rec l0 (HHH ?)) of
+ | (inleft (existS (cons false l1) _)) => (inright ? ? (HHH ?))
+ | (inleft (existS (cons true l1) (exist t1 (conj Hp Hl)))) =>
+ (inright ? ? (HHH ?))
+ | (inleft (existS _ _)) => (inright ? ? (HHH ?))
+ | (inright Hnp) => (inright ? ? (HHH ?))
+ end ::
+ {l'' : (list bool) &
+ {t : nat | (parse_rel (cons true l0) l'' t) /\ (le (length l'') (S (length l0)))}} +
+ {(l'' : (list bool)) (t : nat) ~ (parse_rel (cons true l0) l'' t)}).
+
+(* The same but with relative links to l0 and rec *)
+
+Check [l0:(list bool);rec:(l' : (list bool))
+ (le (length l') (S (length l0))) ->
+ {l'' : (list bool) &
+ {t : nat | (parse_rel l' l'' t) /\ (le (length l'') (length l'))}} +
+ {(l'' : (list bool)) (t : nat) ~ (parse_rel l' l'' t)}]
+ (Cases (rec l0 (HHH ?)) of
+ | (inleft (existS (cons false l1) _)) => (inright ? ? (HHH ?))
+ | (inleft (existS (cons true l1) (exist t1 (conj Hp Hl)))) =>
+ (inright ? ? (HHH ?))
+ | (inleft (existS _ _)) => (inright ? ? (HHH ?))
+ | (inright Hnp) => (inright ? ? (HHH ?))
+ end ::
+ {l'' : (list bool) &
+ {t : nat | (parse_rel (cons true l0) l'' t) /\ (le (length l'') (S (length l0)))}} +
+ {(l'' : (list bool)) (t : nat) ~ (parse_rel (cons true l0) l'' t)}).
diff --git a/test-suite/success/Case2.v b/test-suite/success/Case2.v
new file mode 100644
index 00000000..0aa7b5be
--- /dev/null
+++ b/test-suite/success/Case2.v
@@ -0,0 +1,11 @@
+(* ============================================== *)
+(* To test compilation of dependent case *)
+(* Nested patterns *)
+(* ============================================== *)
+
+Type <[n:nat]n=n>Cases O of
+ O => (refl_equal nat O)
+ | m => (refl_equal nat m)
+end.
+
+
diff --git a/test-suite/success/Case5.v b/test-suite/success/Case5.v
new file mode 100644
index 00000000..fe49cdf9
--- /dev/null
+++ b/test-suite/success/Case5.v
@@ -0,0 +1,14 @@
+
+Parameter ff: (n,m:nat)~n=m -> ~(S n)=(S m).
+Parameter discr_r : (n:nat) ~(O=(S n)).
+Parameter discr_l : (n:nat) ~((S n)=O).
+
+
+Type
+[n:nat]
+ <[n:nat]n=O\/~n=O>Cases n of
+ O => (or_introl ? ~O=O (refl_equal ? O))
+ | (S O) => (or_intror (S O)=O ? (discr_l O))
+ | (S (S x)) => (or_intror (S (S x))=O ? (discr_l (S x)))
+
+ end.
diff --git a/test-suite/success/Case6.v b/test-suite/success/Case6.v
new file mode 100644
index 00000000..a262251e
--- /dev/null
+++ b/test-suite/success/Case6.v
@@ -0,0 +1,19 @@
+Parameter ff: (n,m:nat)~n=m -> ~(S n)=(S m).
+Parameter discr_r : (n:nat) ~(O=(S n)).
+Parameter discr_l : (n:nat) ~((S n)=O).
+
+Fixpoint eqdec [n:nat] : (m:nat) n=m \/ ~n=m :=
+[m:nat]
+ <[n,m:nat] n=m \/ ~n=m>Cases n m of
+ O O => (or_introl ? ~O=O (refl_equal ? O))
+
+ | O (S x) => (or_intror O=(S x) ? (discr_r x))
+
+ | (S x) O => (or_intror ? ~(S x)=O (discr_l x))
+
+ | ((S x) as N) ((S y) as M) =>
+ <N=M\/~N=M>Cases (eqdec x y) of
+ (or_introl h) => (or_introl ? ~N=M (f_equal nat nat S x y h))
+ | (or_intror h) => (or_intror N=M ? (ff x y h))
+ end
+ end.
diff --git a/test-suite/success/Case7.v b/test-suite/success/Case7.v
new file mode 100644
index 00000000..6e2aea48
--- /dev/null
+++ b/test-suite/success/Case7.v
@@ -0,0 +1,16 @@
+Inductive List [A:Set] :Set :=
+ Nil:(List A) | Cons:A->(List A)->(List A).
+
+Inductive Empty [A:Set] : (List A)-> Prop :=
+ intro_Empty: (Empty A (Nil A)).
+
+Parameter inv_Empty : (A:Set)(a:A)(x:(List A)) ~(Empty A (Cons A a x)).
+
+
+Type
+[A:Set]
+[l:(List A)]
+ <[l:(List A)](Empty A l) \/ ~(Empty A l)>Cases l of
+ Nil => (or_introl ? ~(Empty A (Nil A)) (intro_Empty A))
+ | ((Cons a y) as b) => (or_intror (Empty A b) ? (inv_Empty A a y))
+ end.
diff --git a/test-suite/success/Case9.v b/test-suite/success/Case9.v
new file mode 100644
index 00000000..a5d07405
--- /dev/null
+++ b/test-suite/success/Case9.v
@@ -0,0 +1,55 @@
+Inductive List [A:Set] :Set :=
+ Nil:(List A) | Cons:A->(List A)->(List A).
+
+Inductive eqlong : (List nat)-> (List nat)-> Prop :=
+ eql_cons : (n,m:nat)(x,y:(List nat))
+ (eqlong x y) -> (eqlong (Cons nat n x) (Cons nat m y))
+| eql_nil : (eqlong (Nil nat) (Nil nat)).
+
+
+Parameter V1 : (eqlong (Nil nat) (Nil nat))\/ ~(eqlong (Nil nat) (Nil nat)).
+Parameter V2 : (a:nat)(x:(List nat))
+ (eqlong (Nil nat) (Cons nat a x))\/ ~(eqlong (Nil nat)(Cons nat a x)).
+Parameter V3 : (a:nat)(x:(List nat))
+ (eqlong (Cons nat a x) (Nil nat))\/ ~(eqlong (Cons nat a x) (Nil nat)).
+Parameter V4 : (a:nat)(x:(List nat))(b:nat)(y:(List nat))
+ (eqlong (Cons nat a x)(Cons nat b y))
+ \/ ~(eqlong (Cons nat a x) (Cons nat b y)).
+
+Parameter nff : (n,m:nat)(x,y:(List nat))
+ ~(eqlong x y)-> ~(eqlong (Cons nat n x) (Cons nat m y)).
+Parameter inv_r : (n:nat)(x:(List nat)) ~(eqlong (Nil nat) (Cons nat n x)).
+Parameter inv_l : (n:nat)(x:(List nat)) ~(eqlong (Cons nat n x) (Nil nat)).
+
+Fixpoint eqlongdec [x:(List nat)]: (y:(List nat))(eqlong x y)\/~(eqlong x y) :=
+[y:(List nat)]
+ <[x,y:(List nat)](eqlong x y)\/~(eqlong x y)>Cases x y of
+ Nil Nil => (or_introl ? ~(eqlong (Nil nat) (Nil nat)) eql_nil)
+
+ | Nil ((Cons a x) as L) =>(or_intror (eqlong (Nil nat) L) ? (inv_r a x))
+
+ | ((Cons a x) as L) Nil => (or_intror (eqlong L (Nil nat)) ? (inv_l a x))
+
+ | ((Cons a x) as L1) ((Cons b y) as L2) =>
+ <(eqlong L1 L2) \/~(eqlong L1 L2)>Cases (eqlongdec x y) of
+ (or_introl h) => (or_introl ? ~(eqlong L1 L2) (eql_cons a b x y h))
+ | (or_intror h) => (or_intror (eqlong L1 L2) ? (nff a b x y h))
+ end
+ end.
+
+
+Type
+ <[x,y:(List nat)](eqlong x y)\/~(eqlong x y)>Cases (Nil nat) (Nil nat) of
+ Nil Nil => (or_introl ? ~(eqlong (Nil nat) (Nil nat)) eql_nil)
+
+ | Nil ((Cons a x) as L) =>(or_intror (eqlong (Nil nat) L) ? (inv_r a x))
+
+ | ((Cons a x) as L) Nil => (or_intror (eqlong L (Nil nat)) ? (inv_l a x))
+
+ | ((Cons a x) as L1) ((Cons b y) as L2) =>
+ <(eqlong L1 L2) \/~(eqlong L1 L2)>Cases (eqlongdec x y) of
+ (or_introl h) => (or_introl ? ~(eqlong L1 L2) (eql_cons a b x y h))
+ | (or_intror h) => (or_intror (eqlong L1 L2) ? (nff a b x y h))
+ end
+ end.
+
diff --git a/test-suite/success/CaseAlias.v b/test-suite/success/CaseAlias.v
new file mode 100644
index 00000000..b5f0e730
--- /dev/null
+++ b/test-suite/success/CaseAlias.v
@@ -0,0 +1,21 @@
+(* This has been a bug reported by Y. Bertot *)
+Inductive expr : Set :=
+ b: expr -> expr -> expr
+ | u: expr -> expr
+ | a: expr
+ | var: nat -> expr .
+
+Fixpoint f [t : expr] : expr :=
+ Cases t of
+ | (b t1 t2) => (b (f t1) (f t2))
+ | a => a
+ | x => (b t a)
+ end.
+
+Fixpoint f2 [t : expr] : expr :=
+ Cases t of
+ | (b t1 t2) => (b (f2 t1) (f2 t2))
+ | a => a
+ | x => (b x a)
+ end.
+
diff --git a/test-suite/success/Cases.v b/test-suite/success/Cases.v
new file mode 100644
index 00000000..6ccd669a
--- /dev/null
+++ b/test-suite/success/Cases.v
@@ -0,0 +1,1597 @@
+(****************************************************************************)
+(* Pattern-matching when non inductive terms occur *)
+
+(* Dependent form of annotation *)
+Type <[n:nat]nat>Cases O eq of O x => O | (S x) y => x end.
+Type <[_,_:nat]nat>Cases O eq O of O x y => O | (S x) y z => x end.
+
+(* Non dependent form of annotation *)
+Type <nat>Cases O eq of O x => O | (S x) y => x end.
+
+(* Combining dependencies and non inductive arguments *)
+Type [A:Set][a:A][H:O=O]<[x][H]H==H>Cases H a of _ _ => (refl_eqT ? H) end.
+
+(* Interaction with coercions *)
+Parameter bool2nat : bool -> nat.
+Coercion bool2nat : bool >-> nat.
+Check [x](Cases x of O => true | (S _) => O end :: nat).
+
+(****************************************************************************)
+(* All remaining examples come from Cristina Cornes' V6 TESTS/MultCases.v *)
+
+Inductive IFExpr : Set :=
+ Var : nat -> IFExpr
+ | Tr : IFExpr
+ | Fa : IFExpr
+ | IfE : IFExpr -> IFExpr -> IFExpr -> IFExpr.
+
+Inductive List [A:Set] :Set :=
+ Nil:(List A) | Cons:A->(List A)->(List A).
+
+Inductive listn : nat-> Set :=
+ niln : (listn O)
+| consn : (n:nat)nat->(listn n) -> (listn (S n)).
+
+Inductive Listn [A:Set] : nat-> Set :=
+ Niln : (Listn A O)
+| Consn : (n:nat)nat->(Listn A n) -> (Listn A (S n)).
+
+Inductive Le : nat->nat->Set :=
+ LeO: (n:nat)(Le O n)
+| LeS: (n,m:nat)(Le n m) -> (Le (S n) (S m)).
+
+Inductive LE [n:nat] : nat->Set :=
+ LE_n : (LE n n) | LE_S : (m:nat)(LE n m)->(LE n (S m)).
+
+Require Bool.
+
+
+
+Inductive PropForm : Set :=
+ Fvar : nat -> PropForm
+ | Or : PropForm -> PropForm -> PropForm .
+
+Section testIFExpr.
+Definition Assign:= nat->bool.
+Parameter Prop_sem : Assign -> PropForm -> bool.
+
+Type [A:Assign][F:PropForm]
+ <bool>Cases F of
+ (Fvar n) => (A n)
+ | (Or F G) => (orb (Prop_sem A F) (Prop_sem A G))
+ end.
+
+Type [A:Assign][H:PropForm]
+ <bool>Cases H of
+ (Fvar n) => (A n)
+ | (Or F G) => (orb (Prop_sem A F) (Prop_sem A G))
+ end.
+End testIFExpr.
+
+
+
+Type [x:nat]<nat>Cases x of O => O | x => x end.
+
+Section testlist.
+Parameter A:Set.
+Inductive list : Set := nil : list | cons : A->list->list.
+Parameter inf: A->A->Prop.
+
+
+Definition list_Lowert2 :=
+ [a:A][l:list](<Prop>Cases l of nil => True
+ | (cons b l) =>(inf a b) end).
+
+Definition titi :=
+ [a:A][l:list](<list>Cases l of nil => l
+ | (cons b l) => l end).
+Reset list.
+End testlist.
+
+
+(* To test translation *)
+(* ------------------- *)
+
+
+Type <nat>Cases O of O => O | _ => O end.
+
+Type <nat>Cases O of
+ (O as b) => b
+ | (S O) => O
+ | (S (S x)) => x end.
+
+Type Cases O of
+ (O as b) => b
+ | (S O) => O
+ | (S (S x)) => x end.
+
+
+Type [x:nat]<nat>Cases x of
+ (O as b) => b
+ | (S x) => x end.
+
+Type [x:nat]Cases x of
+ (O as b) => b
+ | (S x) => x end.
+
+Type <nat>Cases O of
+ (O as b) => b
+ | (S x) => x end.
+
+Type <nat>Cases O of
+ x => x
+ end.
+
+Type Cases O of
+ x => x
+ end.
+
+Type <nat>Cases O of
+ O => O
+ | ((S x) as b) => b
+ end.
+
+Type [x:nat]<nat>Cases x of
+ O => O
+ | ((S x) as b) => b
+ end.
+
+Type [x:nat] Cases x of
+ O => O
+ | ((S x) as b) => b
+ end.
+
+
+Type <nat>Cases O of
+ O => O
+ | (S x) => O
+ end.
+
+
+Type <nat*nat>Cases O of
+ O => (O,O)
+ | (S x) => (x,O)
+ end.
+
+Type Cases O of
+ O => (O,O)
+ | (S x) => (x,O)
+ end.
+
+Type <nat->nat>Cases O of
+ O => [n:nat]O
+ | (S x) => [n:nat]O
+ end.
+
+Type Cases O of
+ O => [n:nat]O
+ | (S x) => [n:nat]O
+ end.
+
+
+Type <nat->nat>Cases O of
+ O => [n:nat]O
+ | (S x) => [n:nat](plus x n)
+ end.
+
+Type Cases O of
+ O => [n:nat]O
+ | (S x) => [n:nat](plus x n)
+ end.
+
+
+Type <nat>Cases O of
+ O => O
+ | ((S x) as b) => (plus b x)
+ end.
+
+Type <nat>Cases O of
+ O => O
+ | ((S (x as a)) as b) => (plus b a)
+ end.
+Type Cases O of
+ O => O
+ | ((S (x as a)) as b) => (plus b a)
+ end.
+
+
+Type Cases O of
+ O => O
+ | _ => O
+ end.
+
+Type <nat>Cases O of
+ O => O
+ | x => x
+ end.
+
+Type <nat>Cases O (S O) of
+ x y => (plus x y)
+ end.
+
+Type Cases O (S O) of
+ x y => (plus x y)
+ end.
+
+Type <nat>Cases O (S O) of
+ O y => y
+ | (S x) y => (plus x y)
+ end.
+
+Type Cases O (S O) of
+ O y => y
+ | (S x) y => (plus x y)
+ end.
+
+
+Type <nat>Cases O (S O) of
+ O x => x
+ | (S y) O => y
+ | x y => (plus x y)
+ end.
+
+
+
+
+Type Cases O (S O) of
+ O x => (plus x O)
+ | (S y) O => (plus y O)
+ | x y => (plus x y)
+ end.
+
+Type
+ <nat>Cases O (S O) of
+ O x => (plus x O)
+ | (S y) O => (plus y O)
+ | x y => (plus x y)
+ end.
+
+
+Type
+ <nat>Cases O (S O) of
+ O x => x
+ | ((S x) as b) (S y) => (plus (plus b x) y)
+ | x y => (plus x y)
+ end.
+
+
+Type Cases O (S O) of
+ O x => x
+ | ((S x) as b) (S y) => (plus (plus b x) y)
+ | x y => (plus x y)
+ end.
+
+
+Type [l:(List nat)]<(List nat)>Cases l of
+ Nil => (Nil nat)
+ | (Cons a l) => l
+ end.
+
+Type [l:(List nat)] Cases l of
+ Nil => (Nil nat)
+ | (Cons a l) => l
+ end.
+
+Type <nat>Cases (Nil nat) of
+ Nil =>O
+ | (Cons a l) => (S a)
+ end.
+Type Cases (Nil nat) of
+ Nil =>O
+ | (Cons a l) => (S a)
+ end.
+
+Type <(List nat)>Cases (Nil nat) of
+ (Cons a l) => l
+ | x => x
+ end.
+
+Type Cases (Nil nat) of
+ (Cons a l) => l
+ | x => x
+ end.
+
+Type <(List nat)>Cases (Nil nat) of
+ Nil => (Nil nat)
+ | (Cons a l) => l
+ end.
+
+Type Cases (Nil nat) of
+ Nil => (Nil nat)
+ | (Cons a l) => l
+ end.
+
+
+Type
+ <nat>Cases O of
+ O => O
+ | (S x) => <nat>Cases (Nil nat) of
+ Nil => x
+ | (Cons a l) => (plus x a)
+ end
+ end.
+
+Type
+ Cases O of
+ O => O
+ | (S x) => Cases (Nil nat) of
+ Nil => x
+ | (Cons a l) => (plus x a)
+ end
+ end.
+
+Type
+ [y:nat]Cases y of
+ O => O
+ | (S x) => Cases (Nil nat) of
+ Nil => x
+ | (Cons a l) => (plus x a)
+ end
+ end.
+
+
+Type
+ <nat>Cases O (Nil nat) of
+ O x => O
+ | (S x) Nil => x
+ | (S x) (Cons a l) => (plus x a)
+ end.
+
+
+
+Type [n:nat][l:(listn n)]<[_:nat]nat>Cases l of
+ niln => O
+ | x => O
+ end.
+
+Type [n:nat][l:(listn n)]
+ Cases l of
+ niln => O
+ | x => O
+ end.
+
+
+Type <[_:nat]nat>Cases niln of
+ niln => O
+ | x => O
+ end.
+
+Type Cases niln of
+ niln => O
+ | x => O
+ end.
+
+
+Type <[_:nat]nat>Cases niln of
+ niln => O
+ | (consn n a l) => a
+ end.
+Type Cases niln of niln => O
+ | (consn n a l) => a
+ end.
+
+
+Type <[n:nat][_:(listn n)]nat>Cases niln of
+ (consn m _ niln) => m
+ | _ => (S O) end.
+
+
+
+Type [n:nat][x:nat][l:(listn n)]<[_:nat]nat>Cases x l of
+ O niln => O
+ | y x => O
+ end.
+
+Type <[_:nat]nat>Cases O niln of
+ O niln => O
+ | y x => O
+ end.
+
+
+Type <[_:nat]nat>Cases niln O of
+ niln O => O
+ | y x => O
+ end.
+
+Type Cases niln O of
+ niln O => O
+ | y x => O
+ end.
+
+Type <[_:nat][_:nat]nat>Cases niln niln of
+ niln niln => O
+ | x y => O
+ end.
+
+Type Cases niln niln of
+ niln niln => O
+ | x y => O
+ end.
+
+Type <[_,_,_:nat]nat>Cases niln niln niln of
+ niln niln niln => O
+ | x y z => O
+ end.
+
+
+Type Cases niln niln niln of
+ niln niln niln => O
+ | x y z => O
+ end.
+
+
+
+Type <[_:nat]nat>Cases (niln) of
+ niln => O
+ | (consn n a l) => O
+ end.
+
+Type Cases (niln) of
+ niln => O
+ | (consn n a l) => O
+ end.
+
+
+Type <[_:nat][_:nat]nat>Cases niln niln of
+ niln niln => O
+ | niln (consn n a l) => n
+ | (consn n a l) x => a
+ end.
+
+
+Type Cases niln niln of
+ niln niln => O
+ | niln (consn n a l) => n
+ | (consn n a l) x => a
+ end.
+
+
+Type [n:nat][l:(listn n)]<[_:nat]nat>Cases l of
+ niln => O
+ | x => O
+ end.
+
+Type [c:nat;s:bool]
+ <[_:nat;_:bool]nat>Cases c s of
+ | O _ => O
+ | _ _ => c
+ end.
+
+Type [c:nat;s:bool]
+ <[_:nat;_:bool]nat>Cases c s of
+ | O _ => O
+ | (S _) _ => c
+ end.
+
+
+(* Rows of pattern variables: some tricky cases *)
+Axiom P:nat->Prop; f:(n:nat)(P n).
+
+Type [i:nat]
+ <[_:bool;n:nat](P n)>Cases true i of
+ | true k => (f k)
+ | _ k => (f k)
+ end.
+
+Type [i:nat]
+ <[n:nat;_:bool](P n)>Cases i true of
+ | k true => (f k)
+ | k _ => (f k)
+ end.
+
+(* Nested Cases: the SYNTH of the Cases on n used to make Multcase believe
+ * it has to synthtize the predicate on O (which he can't)
+ *)
+Type <[n]Cases n of O => bool | (S _) => nat end>Cases O of
+ O => true
+ | (S _) => O
+ end.
+
+Type [n:nat][l:(listn n)]Cases l of
+ niln => O
+ | x => O
+ end.
+
+Type [n:nat][l:(listn n)]<[_:nat]nat>Cases l of
+ niln => O
+ | (consn n a niln) => O
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+
+Type [n:nat][l:(listn n)]Cases l of
+ niln => O
+ | (consn n a niln) => O
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+
+
+Type [n:nat][l:(listn n)]<[_:nat]nat>Cases l of
+ niln => O
+ | (consn n a niln) => O
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+Type [n:nat][l:(listn n)]Cases l of
+ niln => O
+ | (consn n a niln) => O
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+
+Type [A:Set][n:nat][l:(Listn A n)]<[_:nat]nat>Cases l of
+ Niln => O
+ | (Consn n a Niln) => O
+ | (Consn n a (Consn m b l)) => (plus n m)
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]Cases l of
+ Niln => O
+ | (Consn n a Niln) => O
+ | (Consn n a (Consn m b l)) => (plus n m)
+ end.
+
+(*
+Type [A:Set][n:nat][l:(Listn A n)]
+ <[_:nat](Listn A O)>Cases l of
+ (Niln as b) => b
+ | (Consn n a (Niln as b))=> (Niln A)
+ | (Consn n a (Consn m b l)) => (Niln A)
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ (Niln as b) => b
+ | (Consn n a (Niln as b))=> (Niln A)
+ | (Consn n a (Consn m b l)) => (Niln A)
+ end.
+*)
+(******** This example rises an error unconstrained_variables!
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ (Niln as b) => (Consn A O O b)
+ | ((Consn n a Niln) as L) => L
+ | (Consn n a _) => (Consn A O O (Niln A))
+ end.
+**********)
+
+(* To test tratement of as-patterns in depth *)
+Type [A:Set] [l:(List A)]
+ Cases l of
+ (Nil as b) => (Nil A)
+ | ((Cons a Nil) as L) => L
+ | ((Cons a (Cons b m)) as L) => L
+ end.
+
+
+Type [n:nat][l:(listn n)]
+ <[_:nat](listn n)>Cases l of
+ niln => l
+ | (consn n a c) => l
+ end.
+Type [n:nat][l:(listn n)]
+ Cases l of
+ niln => l
+ | (consn n a c) => l
+ end.
+
+
+Type [n:nat][l:(listn n)]
+ <[_:nat](listn n)>Cases l of
+ (niln as b) => l
+ | _ => l
+ end.
+
+
+Type [n:nat][l:(listn n)]
+ Cases l of
+ (niln as b) => l
+ | _ => l
+ end.
+
+Type [n:nat][l:(listn n)]
+ <[_:nat](listn n)>Cases l of
+ (niln as b) => l
+ | x => l
+ end.
+
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ (Niln as b) => l
+ | _ => l
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ <[_:nat](Listn A n)>Cases l of
+ Niln => l
+ | (Consn n a Niln) => l
+ | (Consn n a (Consn m b c)) => l
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ Niln => l
+ | (Consn n a Niln) => l
+ | (Consn n a (Consn m b c)) => l
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ <[_:nat](Listn A n)>Cases l of
+ (Niln as b) => l
+ | (Consn n a (Niln as b)) => l
+ | (Consn n a (Consn m b _)) => l
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ (Niln as b) => l
+ | (Consn n a (Niln as b)) => l
+ | (Consn n a (Consn m b _)) => l
+ end.
+
+
+Type <[_:nat]nat>Cases (niln) of
+ niln => O
+ | (consn n a niln) => O
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+
+Type Cases (niln) of
+ niln => O
+ | (consn n a niln) => O
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+Type <[_,_:nat]nat>Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m h) => (plus n m)
+ end.
+
+
+Type Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m h) => (plus n m)
+ end.
+
+Type [n:nat][l:(Listn nat n)]
+ <[_:nat]nat>Cases l of
+ Niln => O
+ | (Consn n a l) => O
+ end.
+
+
+Type [n:nat][l:(Listn nat n)]
+ Cases l of
+ Niln => O
+ | (Consn n a l) => O
+ end.
+
+
+Type Cases (Niln nat) of
+ Niln => O
+ | (Consn n a l) => O
+ end.
+
+Type <[_:nat]nat>Cases (LE_n O) of
+ LE_n => O
+ | (LE_S m h) => O
+ end.
+
+
+Type Cases (LE_n O) of
+ LE_n => O
+ | (LE_S m h) => O
+ end.
+
+
+
+Type Cases (LE_n O) of
+ LE_n => O
+ | (LE_S m h) => O
+ end.
+
+
+
+Type <[_:nat]nat>Cases (niln ) of
+ niln => O
+ | (consn n a niln) => n
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+Type Cases (niln ) of
+ niln => O
+ | (consn n a niln) => n
+ | (consn n a (consn m b l)) => (plus n m)
+ end.
+
+
+Type <[_:nat]nat>Cases (Niln nat) of
+ Niln => O
+ | (Consn n a Niln) => n
+ | (Consn n a (Consn m b l)) => (plus n m)
+ end.
+
+Type Cases (Niln nat) of
+ Niln => O
+ | (Consn n a Niln) => n
+ | (Consn n a (Consn m b l)) => (plus n m)
+ end.
+
+
+Type <[_,_:nat]nat>Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) => (plus n x)
+ end.
+
+
+Type Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) => (plus n x)
+ end.
+
+
+Type <[_,_:nat]nat>Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) => m
+ end.
+
+Type Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) => m
+ end.
+
+
+Type [n,m:nat][h:(Le n m)]
+ <[_,_:nat]nat>Cases h of
+ (LeO x) => x
+ | x => O
+ end.
+
+Type [n,m:nat][h:(Le n m)]
+ Cases h of
+ (LeO x) => x
+ | x => O
+ end.
+
+
+Type [n,m:nat][h:(Le n m)]
+ <[_,_:nat]nat>Cases h of
+ (LeS n m h) => n
+ | x => O
+ end.
+
+
+Type [n,m:nat][h:(Le n m)]
+ Cases h of
+ (LeS n m h) => n
+ | x => O
+ end.
+
+
+Type [n,m:nat][h:(Le n m)]
+ <[_,_:nat]nat*nat>Cases h of
+ (LeO n) => (O,n)
+ |(LeS n m _) => ((S n),(S m))
+ end.
+
+
+Type [n,m:nat][h:(Le n m)]
+ Cases h of
+ (LeO n) => (O,n)
+ |(LeS n m _) => ((S n),(S m))
+ end.
+
+
+Fixpoint F [n,m:nat; h:(Le n m)] : (Le n (S m)) :=
+ <[n,m:nat](Le n (S m))>Cases h of
+ (LeO m') => (LeO (S m'))
+ | (LeS n' m' h') => (LeS n' (S m') (F n' m' h'))
+ end.
+
+Reset F.
+
+Fixpoint F [n,m:nat; h:(Le n m)] :(Le n (S m)) :=
+ <[n,m:nat](Le n (S m))>Cases h of
+ (LeS n m h) => (LeS n (S m) (F n m h))
+ | (LeO m) => (LeO (S m))
+ end.
+
+(* Rend la longueur de la liste *)
+Definition length1:= [n:nat] [l:(listn n)]
+ <[_:nat]nat>Cases l of
+ (consn n _ (consn m _ _)) => (S (S m))
+ |(consn n _ _) => (S O)
+ | _ => O
+ end.
+
+Reset length1.
+Definition length1:= [n:nat] [l:(listn n)]
+ Cases l of
+ (consn n _ (consn m _ _)) => (S (S m))
+ |(consn n _ _) => (S O)
+ | _ => O
+ end.
+
+
+Definition length2:= [n:nat] [l:(listn n)]
+ <[_:nat]nat>Cases l of
+ (consn n _ (consn m _ _)) => (S (S m))
+ |(consn n _ _) => (S n)
+ | _ => O
+ end.
+
+Reset length2.
+
+Definition length2:= [n:nat] [l:(listn n)]
+ Cases l of
+ (consn n _ (consn m _ _)) => (S (S m))
+ |(consn n _ _) => (S n)
+ | _ => O
+ end.
+
+Definition length3 :=
+[n:nat][l:(listn n)]
+ <[_:nat]nat>Cases l of
+ (consn n _ (consn m _ l)) => (S n)
+ |(consn n _ _) => (S O)
+ | _ => O
+ end.
+
+
+Reset length3.
+
+Definition length3 :=
+[n:nat][l:(listn n)]
+ Cases l of
+ (consn n _ (consn m _ l)) => (S n)
+ |(consn n _ _) => (S O)
+ | _ => O
+ end.
+
+
+Type <[_,_:nat]nat>Cases (LeO O) of
+ (LeS n m h) =>(plus n m)
+ | x => O
+ end.
+Type Cases (LeO O) of
+ (LeS n m h) =>(plus n m)
+ | x => O
+ end.
+
+Type [n,m:nat][h:(Le n m)]<[_,_:nat]nat>Cases h of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) =>(plus n (plus m (plus x y)))
+ end.
+
+
+Type [n,m:nat][h:(Le n m)]Cases h of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) =>(plus n (plus m (plus x y)))
+ end.
+
+Type <[_,_:nat]nat>Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) =>(plus n (plus m (plus x y)))
+ end.
+
+Type Cases (LeO O) of
+ (LeO x) => x
+ | (LeS n m (LeO x)) => (plus x m)
+ | (LeS n m (LeS x y h)) =>(plus n (plus m (plus x y)))
+ end.
+
+
+Type <[_:nat]nat>Cases (LE_n O) of
+ LE_n => O
+ | (LE_S m LE_n) => (plus O m)
+ | (LE_S m (LE_S y h)) => (plus O m)
+ end.
+
+
+Type Cases (LE_n O) of
+ LE_n => O
+ | (LE_S m LE_n) => (plus O m)
+ | (LE_S m (LE_S y h)) => (plus O m)
+ end.
+
+
+Type [n,m:nat][h:(Le n m)] Cases h of
+ x => x
+ end.
+
+Type [n,m:nat][h:(Le n m)]<[_,_:nat]nat>Cases h of
+ (LeO n) => n
+ | x => O
+ end.
+Type [n,m:nat][h:(Le n m)] Cases h of
+ (LeO n) => n
+ | x => O
+ end.
+
+
+Type [n:nat]<[_:nat]nat->nat>Cases niln of
+ niln => [_:nat]O
+ | (consn n a niln) => [_:nat]O
+ | (consn n a (consn m b l)) => [_:nat](plus n m)
+ end.
+
+
+Type [n:nat] Cases niln of
+ niln => [_:nat]O
+ | (consn n a niln) => [_:nat]O
+ | (consn n a (consn m b l)) => [_:nat](plus n m)
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ <[_:nat]nat->nat>Cases l of
+ Niln => [_:nat]O
+ | (Consn n a Niln) => [_:nat] n
+ | (Consn n a (Consn m b l)) => [_:nat](plus n m)
+ end.
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ Niln => [_:nat]O
+ | (Consn n a Niln) => [_:nat] n
+ | (Consn n a (Consn m b l)) => [_:nat](plus n m)
+ end.
+
+(* Alsos tests for multiple _ patterns *)
+Type [A:Set][n:nat][l:(Listn A n)]
+ <[n:nat](Listn A n)>Cases l of
+ (Niln as b) => b
+ | ((Consn _ _ _ ) as b)=> b
+ end.
+
+(** Horrible error message!
+
+Type [A:Set][n:nat][l:(Listn A n)]
+ Cases l of
+ (Niln as b) => b
+ | ((Consn _ _ _ ) as b)=> b
+ end.
+******)
+
+Type <[n:nat](listn n)>Cases niln of
+ (niln as b) => b
+ | ((consn _ _ _ ) as b)=> b
+ end.
+
+
+Type <[n:nat](listn n)>Cases niln of
+ (niln as b) => b
+ | x => x
+ end.
+
+Type [n,m:nat][h:(LE n m)]<[_:nat]nat->nat>Cases h of
+ LE_n => [_:nat]n
+ | (LE_S m LE_n) => [_:nat](plus n m)
+ | (LE_S m (LE_S y h)) => [_:nat](plus m y )
+ end.
+Type [n,m:nat][h:(LE n m)]Cases h of
+ LE_n => [_:nat]n
+ | (LE_S m LE_n) => [_:nat](plus n m)
+ | (LE_S m (LE_S y h)) => [_:nat](plus m y )
+ end.
+
+
+Type [n,m:nat][h:(LE n m)]
+ <[_:nat]nat>Cases h of
+ LE_n => n
+ | (LE_S m LE_n ) => (plus n m)
+ | (LE_S m (LE_S y LE_n )) => (plus (plus n m) y)
+ | (LE_S m (LE_S y (LE_S y' h))) => (plus (plus n m) (plus y y'))
+ end.
+
+
+
+Type [n,m:nat][h:(LE n m)]
+ Cases h of
+ LE_n => n
+ | (LE_S m LE_n ) => (plus n m)
+ | (LE_S m (LE_S y LE_n )) => (plus (plus n m) y)
+ | (LE_S m (LE_S y (LE_S y' h))) => (plus (plus n m) (plus y y'))
+ end.
+
+
+Type [n,m:nat][h:(LE n m)]<[_:nat]nat>Cases h of
+ LE_n => n
+ | (LE_S m LE_n) => (plus n m)
+ | (LE_S m (LE_S y h)) => (plus (plus n m) y)
+ end.
+
+
+Type [n,m:nat][h:(LE n m)]Cases h of
+ LE_n => n
+ | (LE_S m LE_n) => (plus n m)
+ | (LE_S m (LE_S y h)) => (plus (plus n m) y)
+ end.
+
+Type [n,m:nat]
+ <[_,_:nat]nat>Cases (LeO O) of
+ (LeS n m h) =>(plus n m)
+ | x => O
+ end.
+
+Type [n,m:nat]
+ Cases (LeO O) of
+ (LeS n m h) =>(plus n m)
+ | x => O
+ end.
+
+Parameter test : (n:nat){(le O n)}+{False}.
+Type [n:nat]<nat>Cases (test n) of
+ (left _) => O
+ | _ => O end.
+
+
+Type [n:nat] <nat> Cases (test n) of
+ (left _) => O
+ | _ => O end.
+
+Type [n:nat]Cases (test n) of
+ (left _) => O
+ | _ => O end.
+
+Parameter compare : (n,m:nat)({(lt n m)}+{n=m})+{(gt n m)}.
+Type <nat>Cases (compare O O) of
+ (* k<i *) (inleft (left _)) => O
+ | (* k=i *) (inleft _) => O
+ | (* k>i *) (inright _) => O end.
+
+Type Cases (compare O O) of
+ (* k<i *) (inleft (left _)) => O
+ | (* k=i *) (inleft _) => O
+ | (* k>i *) (inright _) => O end.
+
+
+
+CoInductive SStream [A:Set] : (nat->A->Prop)->Type :=
+scons :
+ (P:nat->A->Prop)(a:A)(P O a)->(SStream A [n:nat](P (S n)))->(SStream A P).
+Parameter B : Set.
+
+Type
+ [P:nat->B->Prop][x:(SStream B P)]<[_:nat->B->Prop]B>Cases x of
+ (scons _ a _ _) => a end.
+
+
+Type
+ [P:nat->B->Prop][x:(SStream B P)] Cases x of
+ (scons _ a _ _) => a end.
+
+Type <nat*nat>Cases (O,O) of (x,y) => ((S x),(S y)) end.
+Type <nat*nat>Cases (O,O) of ((x as b), y) => ((S x),(S y)) end.
+Type <nat*nat>Cases (O,O) of (pair x y) => ((S x),(S y)) end.
+
+Type Cases (O,O) of (x,y) => ((S x),(S y)) end.
+Type Cases (O,O) of ((x as b), y) => ((S x),(S y)) end.
+Type Cases (O,O) of (pair x y) => ((S x),(S y)) end.
+
+
+
+Parameter concat : (A:Set)(List A) ->(List A) ->(List A).
+
+Type <(List nat)>Cases (Nil nat) (Nil nat) of
+ (Nil as b) x => (concat nat b x)
+ | ((Cons _ _) as d) (Nil as c) => (concat nat d c)
+ | _ _ => (Nil nat)
+ end.
+Type Cases (Nil nat) (Nil nat) of
+ (Nil as b) x => (concat nat b x)
+ | ((Cons _ _) as d) (Nil as c) => (concat nat d c)
+ | _ _ => (Nil nat)
+ end.
+
+
+Inductive redexes : Set :=
+ VAR : nat -> redexes
+ | Fun : redexes -> redexes
+ | Ap : bool -> redexes -> redexes -> redexes.
+
+Fixpoint regular [U:redexes] : Prop := <Prop>Cases U of
+ (VAR n) => True
+| (Fun V) => (regular V)
+| (Ap true ((Fun _) as V) W) => (regular V) /\ (regular W)
+| (Ap true _ W) => False
+| (Ap false V W) => (regular V) /\ (regular W)
+end.
+
+
+Type [n:nat]Cases n of O => O | (S ((S n) as V)) => V | _ => O end.
+
+Reset concat.
+Parameter concat :(n:nat) (listn n) -> (m:nat) (listn m)-> (listn (plus n m)).
+Type [n:nat][l:(listn n)][m:nat][l':(listn m)]
+ <[n,_:nat](listn (plus n m))>Cases l l' of
+ niln x => x
+ | (consn n a l'') x =>(consn (plus n m) a (concat n l'' m x))
+ end.
+
+Type [x,y,z:nat]
+ [H:x=y]
+ [H0:y=z]<[_:nat]x=z>Cases H of refl_equal =>
+ <[n:nat]x=n>Cases H0 of refl_equal => H
+ end
+ end.
+
+Type [h:False]<False>Cases h of end.
+
+Type [h:False]<True>Cases h of end.
+
+Definition is_zero := [n:nat]Cases n of O => True | _ => False end.
+
+Type [n:nat][h:O=(S n)]<[n:nat](is_zero n)>Cases h of refl_equal => I end.
+
+Definition disc : (n:nat)O=(S n)->False :=
+ [n:nat][h:O=(S n)]
+ <[n:nat](is_zero n)>Cases h of refl_equal => I end.
+
+Definition nlength3 := [n:nat] [l: (listn n)]
+ Cases l of
+ niln => O
+ | (consn O _ _) => (S O)
+ | (consn (S n) _ _) => (S (S n))
+ end.
+
+(* == Testing strategy elimintation predicate synthesis == *)
+Section titi.
+Variable h:False.
+Type Cases O of
+ O => O
+ | _ => (Except h)
+ end.
+End titi.
+
+Type Cases niln of
+ (consn _ a niln) => a
+ | (consn n _ x) => O
+ | niln => O
+ end.
+
+
+
+Inductive wsort : Set := ws : wsort | wt : wsort.
+Inductive TS : wsort->Set :=
+ id :(TS ws)
+| lift:(TS ws)->(TS ws).
+
+Type [b:wsort][M:(TS b)][N:(TS b)]
+ Cases M N of
+ (lift M1) id => False
+ | _ _ => True
+ end.
+
+
+
+(* ===================================================================== *)
+(* To test pattern matching over a non-dependent inductive type, but *)
+(* having constructors with some arguments that depend on others *)
+(* I.e. to test manipulation of elimination predicate *)
+(* ===================================================================== *)
+
+
+Parameter LTERM : nat -> Set.
+Mutual Inductive TERM : Type :=
+ var : TERM
+ | oper : (op:nat) (LTERM op) -> TERM.
+
+Parameter t1, t2:TERM.
+
+Type Cases t1 t2 of
+ var var => True
+
+ | (oper op1 l1) (oper op2 l2) => False
+ | _ _ => False
+ end.
+Reset LTERM.
+
+
+
+Require Peano_dec.
+Parameter n:nat.
+Definition eq_prf := (EXT m | n=m).
+Parameter p:eq_prf .
+
+Type Cases p of
+ (exT_intro c eqc) =>
+ Cases (eq_nat_dec c n) of
+ (right _) => (refl_equal ? n)
+ |(left y) (* c=n*) => (refl_equal ? n)
+ end
+ end.
+
+
+Parameter ordre_total : nat->nat->Prop.
+
+Parameter N_cla:(N:nat){N=O}+{N=(S O)}+{(ge N (S (S O)))}.
+
+Parameter exist_U2:(N:nat)(ge N (S (S O)))->
+ {n:nat|(m:nat)(lt O m)/\(le m N)
+ /\(ordre_total n m)
+ /\(lt O n)/\(lt n N)}.
+
+Type [N:nat](Cases (N_cla N) of
+ (inright H)=>(Cases (exist_U2 N H) of
+ (exist a b)=>a
+ end)
+ | _ => O
+ end).
+
+
+
+(* ============================================== *)
+(* To test compilation of dependent case *)
+(* Nested patterns *)
+(* ============================================== *)
+
+(* == To test that terms named with AS are correctly absolutized before
+ substitution in rhs == *)
+
+Type [n:nat]<[n:nat]nat>Cases (n) of
+ O => O
+ | (S O) => O
+ | ((S (S n1)) as N) => N
+ end.
+
+(* ========= *)
+
+Type <[n:nat][_:(listn n)]Prop>Cases niln of
+ niln => True
+ | (consn (S O) _ _) => False
+ | _ => True end.
+
+Type <[n:nat][_:(listn n)]Prop>Cases niln of
+ niln => True
+ | (consn (S (S O)) _ _) => False
+ | _ => True end.
+
+
+Type <[n,m:nat][h:(Le n m)]nat>Cases (LeO O) of
+ (LeO _) => O
+ | (LeS (S x) _ _) => x
+ | _ => (S O) end.
+
+Type <[n,m:nat][h:(Le n m)]nat>Cases (LeO O) of
+ (LeO _) => O
+ | (LeS (S x) (S y) _) => x
+ | _ => (S O) end.
+
+Type <[n,m:nat][h:(Le n m)]nat>Cases (LeO O) of
+ (LeO _) => O
+ | (LeS ((S x) as b) (S y) _) => b
+ | _ => (S O) end.
+
+
+
+Parameter ff: (n,m:nat)~n=m -> ~(S n)=(S m).
+Parameter discr_r : (n:nat) ~(O=(S n)).
+Parameter discr_l : (n:nat) ~((S n)=O).
+
+Type
+[n:nat]
+ <[n:nat]n=O\/~n=O>Cases n of
+ O => (or_introl ? ~O=O (refl_equal ? O))
+ | (S x) => (or_intror (S x)=O ? (discr_l x))
+ end.
+
+
+Fixpoint eqdec [n:nat] : (m:nat) n=m \/ ~n=m :=
+[m:nat]
+ <[n,m:nat] n=m \/ ~n=m>Cases n m of
+ O O => (or_introl ? ~O=O (refl_equal ? O))
+
+ | O (S x) => (or_intror O=(S x) ? (discr_r x))
+
+ | (S x) O => (or_intror ? ~(S x)=O (discr_l x))
+
+ | (S x) (S y) =>
+ <(S x)=(S y)\/~(S x)=(S y)>Cases (eqdec x y) of
+ (or_introl h) => (or_introl ? ~(S x)=(S y) (f_equal nat nat S x y h))
+ | (or_intror h) => (or_intror (S x)=(S y) ? (ff x y h))
+ end
+ end.
+
+Reset eqdec.
+
+Fixpoint eqdec [n:nat] : (m:nat) n=m \/ ~n=m :=
+<[n:nat] (m:nat)n=m \/ ~n=m>Cases n of
+ O => [m:nat] <[m:nat]O=m\/~O=m>Cases m of
+ O => (or_introl ? ~O=O (refl_equal nat O))
+ |(S x) => (or_intror O=(S x) ? (discr_r x))
+ end
+ | (S x) => [m:nat]
+ <[m:nat](S x)=m\/~(S x)=m>Cases m of
+ O => (or_intror (S x)=O ? (discr_l x))
+ | (S y) =>
+ <(S x)=(S y)\/~(S x)=(S y)>Cases (eqdec x y) of
+ (or_introl h) => (or_introl ? ~(S x)=(S y) (f_equal ? ? S x y h))
+ | (or_intror h) => (or_intror (S x)=(S y) ? (ff x y h))
+ end
+ end
+ end.
+
+
+Inductive empty : (n:nat)(listn n)-> Prop :=
+ intro_empty: (empty O niln).
+
+Parameter inv_empty : (n,a:nat)(l:(listn n)) ~(empty (S n) (consn n a l)).
+
+Type
+[n:nat] [l:(listn n)]
+ <[n:nat] [l:(listn n)](empty n l) \/ ~(empty n l)>Cases l of
+ niln => (or_introl ? ~(empty O niln) intro_empty)
+ | ((consn n a y) as b) => (or_intror (empty (S n) b) ? (inv_empty n a y))
+ end.
+
+Reset ff.
+Parameter ff: (n,m:nat)~n=m -> ~(S n)=(S m).
+Parameter discr_r : (n:nat) ~(O=(S n)).
+Parameter discr_l : (n:nat) ~((S n)=O).
+
+Type
+[n:nat]
+ <[n:nat]n=O\/~n=O>Cases n of
+ O => (or_introl ? ~O=O (refl_equal ? O))
+ | (S x) => (or_intror (S x)=O ? (discr_l x))
+ end.
+
+
+Fixpoint eqdec [n:nat] : (m:nat) n=m \/ ~n=m :=
+[m:nat]
+ <[n,m:nat] n=m \/ ~n=m>Cases n m of
+ O O => (or_introl ? ~O=O (refl_equal ? O))
+
+ | O (S x) => (or_intror O=(S x) ? (discr_r x))
+
+ | (S x) O => (or_intror ? ~(S x)=O (discr_l x))
+
+ | (S x) (S y) =>
+ <(S x)=(S y)\/~(S x)=(S y)>Cases (eqdec x y) of
+ (or_introl h) => (or_introl ? ~(S x)=(S y) (f_equal nat nat S x y h))
+ | (or_intror h) => (or_intror (S x)=(S y) ? (ff x y h))
+ end
+ end.
+Reset eqdec.
+
+Fixpoint eqdec [n:nat] : (m:nat) n=m \/ ~n=m :=
+<[n:nat] (m:nat)n=m \/ ~n=m>Cases n of
+ O => [m:nat] <[m:nat]O=m\/~O=m>Cases m of
+ O => (or_introl ? ~O=O (refl_equal nat O))
+ |(S x) => (or_intror O=(S x) ? (discr_r x))
+ end
+ | (S x) => [m:nat]
+ <[m:nat](S x)=m\/~(S x)=m>Cases m of
+ O => (or_intror (S x)=O ? (discr_l x))
+ | (S y) =>
+ <(S x)=(S y)\/~(S x)=(S y)>Cases (eqdec x y) of
+ (or_introl h) => (or_introl ? ~(S x)=(S y) (f_equal ? ? S x y h))
+ | (or_intror h) => (or_intror (S x)=(S y) ? (ff x y h))
+ end
+ end
+ end.
+
+
+(* ================================================== *)
+(* Pour tester parametres *)
+(* ================================================== *)
+
+
+Inductive Empty [A:Set] : (List A)-> Prop :=
+ intro_Empty: (Empty A (Nil A)).
+
+Parameter inv_Empty : (A:Set)(a:A)(x:(List A)) ~(Empty A (Cons A a x)).
+
+
+Type
+ <[l:(List nat)](Empty nat l) \/ ~(Empty nat l)>Cases (Nil nat) of
+ Nil => (or_introl ? ~(Empty nat (Nil nat)) (intro_Empty nat))
+ | (Cons a y) => (or_intror (Empty nat (Cons nat a y)) ?
+ (inv_Empty nat a y))
+ end.
+
+
+(* ================================================== *)
+(* Sur les listes *)
+(* ================================================== *)
+
+
+Inductive empty : (n:nat)(listn n)-> Prop :=
+ intro_empty: (empty O niln).
+
+Parameter inv_empty : (n,a:nat)(l:(listn n)) ~(empty (S n) (consn n a l)).
+
+Type
+[n:nat] [l:(listn n)]
+ <[n:nat] [l:(listn n)](empty n l) \/ ~(empty n l)>Cases l of
+ niln => (or_introl ? ~(empty O niln) intro_empty)
+ | ((consn n a y) as b) => (or_intror (empty (S n) b) ? (inv_empty n a y))
+ end.
+
+(* ===================================== *)
+(* Test parametros: *)
+(* ===================================== *)
+
+Inductive eqlong : (List nat)-> (List nat)-> Prop :=
+ eql_cons : (n,m:nat)(x,y:(List nat))
+ (eqlong x y) -> (eqlong (Cons nat n x) (Cons nat m y))
+| eql_nil : (eqlong (Nil nat) (Nil nat)).
+
+
+Parameter V1 : (eqlong (Nil nat) (Nil nat))\/ ~(eqlong (Nil nat) (Nil nat)).
+Parameter V2 : (a:nat)(x:(List nat))
+ (eqlong (Nil nat) (Cons nat a x))\/ ~(eqlong (Nil nat)(Cons nat a x)).
+Parameter V3 : (a:nat)(x:(List nat))
+ (eqlong (Cons nat a x) (Nil nat))\/ ~(eqlong (Cons nat a x) (Nil nat)).
+Parameter V4 : (a:nat)(x:(List nat))(b:nat)(y:(List nat))
+ (eqlong (Cons nat a x)(Cons nat b y))
+ \/ ~(eqlong (Cons nat a x) (Cons nat b y)).
+
+Type
+ <[x,y:(List nat)](eqlong x y)\/~(eqlong x y)>Cases (Nil nat) (Nil nat) of
+ Nil Nil => V1
+ | Nil (Cons a x) => (V2 a x)
+ | (Cons a x) Nil => (V3 a x)
+ | (Cons a x) (Cons b y) => (V4 a x b y)
+ end.
+
+
+Type
+[x,y:(List nat)]
+ <[x,y:(List nat)](eqlong x y)\/~(eqlong x y)>Cases x y of
+ Nil Nil => V1
+ | Nil (Cons a x) => (V2 a x)
+ | (Cons a x) Nil => (V3 a x)
+ | (Cons a x) (Cons b y) => (V4 a x b y)
+ end.
+
+
+(* ===================================== *)
+
+Inductive Eqlong : (n:nat) (listn n)-> (m:nat) (listn m)-> Prop :=
+ Eql_cons : (n,m:nat )(x:(listn n))(y:(listn m)) (a,b:nat)
+ (Eqlong n x m y)
+ ->(Eqlong (S n) (consn n a x) (S m) (consn m b y))
+| Eql_niln : (Eqlong O niln O niln).
+
+
+Parameter W1 : (Eqlong O niln O niln)\/ ~(Eqlong O niln O niln).
+Parameter W2 : (n,a:nat)(x:(listn n))
+ (Eqlong O niln (S n)(consn n a x)) \/ ~(Eqlong O niln (S n) (consn n a x)).
+Parameter W3 : (n,a:nat)(x:(listn n))
+ (Eqlong (S n) (consn n a x) O niln) \/ ~(Eqlong (S n) (consn n a x) O niln).
+Parameter W4 : (n,a:nat)(x:(listn n)) (m,b:nat)(y:(listn m))
+ (Eqlong (S n)(consn n a x) (S m) (consn m b y))
+ \/ ~(Eqlong (S n)(consn n a x) (S m) (consn m b y)).
+
+Type
+ <[n:nat][x:(listn n)][m:nat][y:(listn m)]
+ (Eqlong n x m y)\/~(Eqlong n x m y)>Cases niln niln of
+ niln niln => W1
+ | niln (consn n a x) => (W2 n a x)
+ | (consn n a x) niln => (W3 n a x)
+ | (consn n a x) (consn m b y) => (W4 n a x m b y)
+ end.
+
+
+Type
+[n,m:nat][x:(listn n)][y:(listn m)]
+ <[n:nat][x:(listn n)][m:nat][y:(listn m)]
+ (Eqlong n x m y)\/~(Eqlong n x m y)>Cases x y of
+ niln niln => W1
+ | niln (consn n a x) => (W2 n a x)
+ | (consn n a x) niln => (W3 n a x)
+ | (consn n a x) (consn m b y) => (W4 n a x m b y)
+ end.
+
+
+Parameter Inv_r : (n,a:nat)(x:(listn n)) ~(Eqlong O niln (S n) (consn n a x)).
+Parameter Inv_l : (n,a:nat)(x:(listn n)) ~(Eqlong (S n) (consn n a x) O niln).
+Parameter Nff : (n,a:nat)(x:(listn n)) (m,b:nat)(y:(listn m))
+ ~(Eqlong n x m y)
+ -> ~(Eqlong (S n) (consn n a x) (S m) (consn m b y)).
+
+
+
+Fixpoint Eqlongdec [n:nat; x:(listn n)] : (m:nat)(y:(listn m))
+ (Eqlong n x m y)\/~(Eqlong n x m y)
+:= [m:nat][y:(listn m)]
+ <[n:nat][x:(listn n)][m:nat][y:(listn m)]
+ (Eqlong n x m y)\/~(Eqlong n x m y)>Cases x y of
+ niln niln => (or_introl ? ~(Eqlong O niln O niln) Eql_niln)
+
+ | niln ((consn n a x) as L) =>
+ (or_intror (Eqlong O niln (S n) L) ? (Inv_r n a x))
+
+ | ((consn n a x) as L) niln =>
+ (or_intror (Eqlong (S n) L O niln) ? (Inv_l n a x))
+
+
+ | ((consn n a x) as L1) ((consn m b y) as L2) =>
+ <(Eqlong (S n) L1 (S m) L2) \/~(Eqlong (S n) L1 (S m) L2)>
+ Cases (Eqlongdec n x m y) of
+ (or_introl h) =>
+ (or_introl ? ~(Eqlong (S n) L1 (S m) L2)(Eql_cons n m x y a b h))
+ | (or_intror h) =>
+ (or_intror (Eqlong (S n) L1 (S m) L2) ? (Nff n a x m b y h))
+ end
+ end.
+
+(* ============================================== *)
+(* To test compilation of dependent case *)
+(* Multiple Patterns *)
+(* ============================================== *)
+Inductive skel: Type :=
+ PROP: skel
+ | PROD: skel->skel->skel.
+
+Parameter Can : skel -> Type.
+Parameter default_can : (s:skel) (Can s).
+
+Type [s1,s2:skel]
+[s1,s2:skel]<[s1:skel][_:skel](Can s1)>Cases s1 s2 of
+ PROP PROP => (default_can PROP)
+| (PROD x y) PROP => (default_can (PROD x y))
+| (PROD x y) _ => (default_can (PROD x y))
+| PROP _ => (default_can PROP)
+end.
+
+(* to test bindings in nested Cases *)
+(* ================================ *)
+Inductive Pair : Set :=
+ pnil : Pair |
+ pcons : Pair -> Pair -> Pair.
+
+Type [p,q:Pair]Cases p of
+ (pcons _ x) =>
+ Cases q of
+ (pcons _ (pcons _ x)) => True
+ | _ => False
+ end
+| _ => False
+end.
+
+
+Type [p,q:Pair]Cases p of
+ (pcons _ x) =>
+ Cases q of
+ (pcons _ (pcons _ x)) =>
+ Cases q of
+ (pcons _ (pcons _ (pcons _ x))) => x
+ | _ => pnil
+ end
+ | _ => pnil
+ end
+| _ => pnil
+end.
+
+Type
+ [n:nat]
+ [l:(listn (S n))]
+ <[z:nat](listn (pred z))>Cases l of
+ niln => niln
+ | (consn n _ l) =>
+ <[m:nat](listn m)>Cases l of
+ niln => niln
+ | b => b
+ end
+ end.
+
+
+
+(* Test de la syntaxe avec nombres *)
+Require Arith.
+Type [n]Cases n of (2) => true | _ => false end.
+
+Require ZArith.
+Type [n]Cases n of `0` => true | _ => false end.
diff --git a/test-suite/success/CasesDep.v b/test-suite/success/CasesDep.v
new file mode 100644
index 00000000..0256280c
--- /dev/null
+++ b/test-suite/success/CasesDep.v
@@ -0,0 +1,405 @@
+(* Check forward dependencies *)
+
+Check [P:nat->Prop][Q][A:(P O)->Q][B:(n:nat)(P (S n))->Q][x]
+ <[_]Q>Cases x of
+ | (exist O H) => (A H)
+ | (exist (S n) H) => (B n H)
+ end.
+
+(* Check dependencies in anonymous arguments (from FTA/listn.v) *)
+
+Inductive listn [A:Set] : nat->Set :=
+ niln: (listn A O)
+| consn: (a:A)(n:nat)(listn A n)->(listn A (S n)).
+
+Section Folding.
+Variables B, C : Set.
+Variable g : B -> C -> C.
+Variable c : C.
+
+Fixpoint foldrn [n:nat; bs:(listn B n)] : C :=
+ Cases bs of niln => c
+ | (consn b _ tl) => (g b (foldrn ? tl))
+ end.
+End Folding.
+
+(* -------------------------------------------------------------------- *)
+(* Example to test patterns matching on dependent families *)
+(* This exemple extracted from the developement done by Nacira Chabane *)
+(* (equipe Paris 6) *)
+(* -------------------------------------------------------------------- *)
+
+
+Require Prelude.
+Require Logic_Type.
+
+Section Orderings.
+ Variable U: Type.
+
+ Definition Relation := U -> U -> Prop.
+
+ Variable R: Relation.
+
+ Definition Reflexive : Prop := (x: U) (R x x).
+
+ Definition Transitive : Prop := (x,y,z: U) (R x y) -> (R y z) -> (R x z).
+
+ Definition Symmetric : Prop := (x,y: U) (R x y) -> (R y x).
+
+ Definition Antisymmetric : Prop :=
+ (x,y: U) (R x y) -> (R y x) -> x==y.
+
+ Definition contains : Relation -> Relation -> Prop :=
+ [R,R': Relation] (x,y: U) (R' x y) -> (R x y).
+ Definition same_relation : Relation -> Relation -> Prop :=
+ [R,R': Relation] (contains R R') /\ (contains R' R).
+Inductive Equivalence : Prop :=
+ Build_Equivalence:
+ Reflexive -> Transitive -> Symmetric -> Equivalence.
+
+ Inductive PER : Prop :=
+ Build_PER: Symmetric -> Transitive -> PER.
+
+End Orderings.
+
+(***** Setoid *******)
+
+Inductive Setoid : Type
+ := Build_Setoid : (S:Type)(R:(Relation S))(Equivalence ? R) -> Setoid.
+
+Definition elem := [A:Setoid] let (S,R,e)=A in S.
+
+Grammar constr constr1 :=
+ elem [ "|" constr0($s) "|"] -> [ (elem $s) ].
+
+Definition equal := [A:Setoid]
+ <[s:Setoid](Relation |s|)>let (S,R,e)=A in R.
+
+Grammar constr constr1 :=
+ equal [ constr0($c) "=" "%" "S" constr0($c2) ] ->
+ [ (equal ? $c $c2) ].
+
+
+Axiom prf_equiv : (A:Setoid)(Equivalence |A| (equal A)).
+Axiom prf_refl : (A:Setoid)(Reflexive |A| (equal A)).
+Axiom prf_sym : (A:Setoid)(Symmetric |A| (equal A)).
+Axiom prf_trans : (A:Setoid)(Transitive |A| (equal A)).
+
+Section Maps.
+Variables A,B: Setoid.
+
+Definition Map_law := [f:|A| -> |B|]
+ (x,y:|A|) x =%S y -> (f x) =%S (f y).
+
+Inductive Map : Type :=
+ Build_Map : (f:|A| -> |B|)(p:(Map_law f))Map.
+
+Definition explicit_ap := [m:Map] <|A| -> |B|>Match m with
+ [f:?][p:?]f end.
+
+Axiom pres : (m:Map)(Map_law (explicit_ap m)).
+
+Definition ext := [f,g:Map]
+ (x:|A|) (explicit_ap f x) =%S (explicit_ap g x).
+
+Axiom Equiv_map_eq : (Equivalence Map ext).
+
+Definition Map_setoid := (Build_Setoid Map ext Equiv_map_eq).
+
+End Maps.
+
+Notation ap := (explicit_ap ? ?).
+
+Grammar constr constr8 :=
+ map_setoid [ constr7($c1) "=>" constr8($c2) ]
+ -> [ (Map_setoid $c1 $c2) ].
+
+
+Definition ap2 := [A,B,C:Setoid][f:|(A=>(B=>C))|][a:|A|] (ap (ap f a)).
+
+
+(***** posint ******)
+
+Inductive posint : Type
+ := Z : posint | Suc : posint -> posint.
+
+Axiom f_equal : (A,B:Type)(f:A->B)(x,y:A) x==y -> (f x)==(f y).
+Axiom eq_Suc : (n,m:posint) n==m -> (Suc n)==(Suc m).
+
+(* The predecessor function *)
+
+Definition pred : posint->posint
+ := [n:posint](<posint>Case n of (* Z *) Z
+ (* Suc u *) [u:posint]u end).
+
+Axiom pred_Sucn : (m:posint) m==(pred (Suc m)).
+Axiom eq_add_Suc : (n,m:posint) (Suc n)==(Suc m) -> n==m.
+Axiom not_eq_Suc : (n,m:posint) ~(n==m) -> ~((Suc n)==(Suc m)).
+
+
+Definition IsSuc : posint->Prop
+ := [n:posint](<Prop>Case n of (* Z *) False
+ (* Suc p *) [p:posint]True end).
+Definition IsZero :posint->Prop :=
+ [n:posint]<Prop>Match n with
+ True
+ [p:posint][H:Prop]False end.
+
+Axiom Z_Suc : (n:posint) ~(Z==(Suc n)).
+Axiom Suc_Z: (n:posint) ~(Suc n)==Z.
+Axiom n_Sucn : (n:posint) ~(n==(Suc n)).
+Axiom Sucn_n : (n:posint) ~(Suc n)==n.
+Axiom eqT_symt : (a,b:posint) ~(a==b)->~(b==a).
+
+
+(******* Dsetoid *****)
+
+Definition Decidable :=[A:Type][R:(Relation A)]
+ (x,y:A)(R x y) \/ ~(R x y).
+
+
+Record DSetoid : Type :=
+{Set_of : Setoid;
+ prf_decid : (Decidable |Set_of| (equal Set_of))}.
+
+(* example de Dsetoide d'entiers *)
+
+
+Axiom eqT_equiv : (Equivalence posint (eqT posint)).
+Axiom Eq_posint_deci : (Decidable posint (eqT posint)).
+
+(* Dsetoide des posint*)
+
+Definition Set_of_posint := (Build_Setoid posint (eqT posint) eqT_equiv).
+
+Definition Dposint := (Build_DSetoid Set_of_posint Eq_posint_deci).
+
+
+
+(**************************************)
+
+
+(* Definition des signatures *)
+(* une signature est un ensemble d'operateurs muni
+ de l'arite de chaque operateur *)
+
+
+Section Sig.
+
+Record Signature :Type :=
+{Sigma : DSetoid;
+ Arity : (Map (Set_of Sigma) (Set_of Dposint))}.
+
+Variable S:Signature.
+
+
+
+Variable Var : DSetoid.
+
+Mutual Inductive TERM : Type :=
+ var : |(Set_of Var)| -> TERM
+ | oper : (op: |(Set_of (Sigma S))| ) (LTERM (ap (Arity S) op)) -> TERM
+with
+ LTERM : posint -> Type :=
+ nil : (LTERM Z)
+ | cons : TERM -> (n:posint)(LTERM n) -> (LTERM (Suc n)).
+
+
+
+(* -------------------------------------------------------------------- *)
+(* Examples *)
+(* -------------------------------------------------------------------- *)
+
+
+Parameter t1,t2: TERM.
+
+Type
+ Cases t1 t2 of
+ | (var v1) (var v2) => True
+ | (oper op1 l1) (oper op2 l2) => False
+ | _ _ => False
+ end.
+
+
+
+Parameter n2:posint.
+Parameter l1, l2:(LTERM n2).
+
+Type
+ Cases l1 l2 of
+ nil nil => True
+ | (cons v m y) nil => False
+ | _ _ => False
+end.
+
+
+Type Cases l1 l2 of
+ nil nil => True
+ | (cons u n x) (cons v m y) =>False
+ | _ _ => False
+end.
+
+
+
+Definition equalT [t1:TERM]:TERM->Prop :=
+[t2:TERM]
+ Cases t1 t2 of
+ (var v1) (var v2) => True
+ | (oper op1 l1) (oper op2 l2) => False
+ | _ _ => False
+ end.
+
+Definition EqListT [n1:posint;l1:(LTERM n1)]: (n2:posint)(LTERM n2)->Prop :=
+[n2:posint][l2:(LTERM n2)]
+ Cases l1 l2 of
+ nil nil => True
+ | (cons t1 n1' l1') (cons t2 n2' l2') => False
+ | _ _ => False
+end.
+
+
+Reset equalT.
+(* ------------------------------------------------------------------*)
+(* Initial exemple (without patterns) *)
+(*-------------------------------------------------------------------*)
+
+Fixpoint equalT [t1:TERM]:TERM->Prop :=
+<TERM->Prop>Case t1 of
+ (*var*) [v1:|(Set_of Var)|][t2:TERM]
+ <Prop>Case t2 of
+ (*var*)[v2:|(Set_of Var)|] (v1 =%S v2)
+ (*oper*)[op2:|(Set_of (Sigma S))|][_:(LTERM (ap (Arity S) op2))]False
+ end
+ (*oper*)[op1:|(Set_of (Sigma S))|]
+ [l1:(LTERM (ap (Arity S) op1))][t2:TERM]
+ <Prop>Case t2 of
+ (*var*)[v2:|(Set_of Var)|]False
+ (*oper*)[op2:|(Set_of (Sigma S))|]
+ [l2:(LTERM (ap (Arity S) op2))]
+ ((op1=%S op2)/\ (EqListT (ap (Arity S) op1) l1 (ap (Arity S) op2) l2))
+ end
+end
+with EqListT [n1:posint;l1:(LTERM n1)]: (n2:posint)(LTERM n2)->Prop :=
+<[_:posint](n2:posint)(LTERM n2)->Prop>Case l1 of
+ (*nil*) [n2:posint][l2:(LTERM n2)]
+ <[_:posint]Prop>Case l2 of
+ (*nil*)True
+ (*cons*)[t2:TERM][n2':posint][l2':(LTERM n2')]False
+ end
+ (*cons*)[t1:TERM][n1':posint][l1':(LTERM n1')]
+ [n2:posint][l2:(LTERM n2)]
+ <[_:posint]Prop>Case l2 of
+ (*nil*) False
+ (*cons*)[t2:TERM][n2':posint][l2':(LTERM n2')]
+ ((equalT t1 t2) /\ (EqListT n1' l1' n2' l2'))
+ end
+end.
+
+
+(* ---------------------------------------------------------------- *)
+(* Version with simple patterns *)
+(* ---------------------------------------------------------------- *)
+Reset equalT.
+
+Fixpoint equalT [t1:TERM]:TERM->Prop :=
+Cases t1 of
+ (var v1) => [t2:TERM]
+ Cases t2 of
+ (var v2) => (v1 =%S v2)
+ | (oper op2 _) =>False
+ end
+| (oper op1 l1) => [t2:TERM]
+ Cases t2 of
+ (var _) => False
+ | (oper op2 l2) => (op1=%S op2)
+ /\ (EqListT (ap (Arity S) op1) l1 (ap (Arity S) op2) l2)
+ end
+end
+with EqListT [n1:posint;l1:(LTERM n1)]: (n2:posint)(LTERM n2)->Prop :=
+<[_:posint](n2:posint)(LTERM n2)->Prop>Cases l1 of
+ nil => [n2:posint][l2:(LTERM n2)]
+ Cases l2 of
+ nil => True
+ | _ => False
+ end
+| (cons t1 n1' l1') => [n2:posint][l2:(LTERM n2)]
+ Cases l2 of
+ nil =>False
+ | (cons t2 n2' l2') => (equalT t1 t2)
+ /\ (EqListT n1' l1' n2' l2')
+ end
+end.
+
+
+Reset equalT.
+
+Fixpoint equalT [t1:TERM]:TERM->Prop :=
+Cases t1 of
+ (var v1) => [t2:TERM]
+ Cases t2 of
+ (var v2) => (v1 =%S v2)
+ | (oper op2 _) =>False
+ end
+| (oper op1 l1) => [t2:TERM]
+ Cases t2 of
+ (var _) => False
+ | (oper op2 l2) => (op1=%S op2)
+ /\ (EqListT (ap (Arity S) op1) l1 (ap (Arity S) op2) l2)
+ end
+end
+with EqListT [n1:posint;l1:(LTERM n1)]: (n2:posint)(LTERM n2)->Prop :=
+[n2:posint][l2:(LTERM n2)]
+Cases l1 of
+ nil =>
+ Cases l2 of
+ nil => True
+ | _ => False
+ end
+| (cons t1 n1' l1') => Cases l2 of
+ nil =>False
+ | (cons t2 n2' l2') => (equalT t1 t2)
+ /\ (EqListT n1' l1' n2' l2')
+ end
+end.
+
+(* ---------------------------------------------------------------- *)
+(* Version with multiple patterns *)
+(* ---------------------------------------------------------------- *)
+Reset equalT.
+
+Fixpoint equalT [t1:TERM]:TERM->Prop :=
+[t2:TERM]
+ Cases t1 t2 of
+ (var v1) (var v2) => (v1 =%S v2)
+
+ | (oper op1 l1) (oper op2 l2) =>
+ (op1=%S op2) /\ (EqListT (ap (Arity S) op1) l1 (ap (Arity S) op2) l2)
+
+ | _ _ => False
+ end
+
+with EqListT [n1:posint;l1:(LTERM n1)]: (n2:posint)(LTERM n2)->Prop :=
+[n2:posint][l2:(LTERM n2)]
+ Cases l1 l2 of
+ nil nil => True
+ | (cons t1 n1' l1') (cons t2 n2' l2') => (equalT t1 t2)
+ /\ (EqListT n1' l1' n2' l2')
+ | _ _ => False
+end.
+
+
+(* ------------------------------------------------------------------ *)
+
+End Sig.
+
+(* Exemple soumis par Bruno *)
+
+Definition bProp [b:bool] : Prop :=
+ if b then True else False.
+
+Definition f0 [F:False;ty:bool]: (bProp ty) :=
+ <[_:bool][ty:bool](bProp ty)>Cases ty ty of
+ true true => I
+ | _ false => F
+ | _ true => I
+ end.
diff --git a/test-suite/success/Check.v b/test-suite/success/Check.v
new file mode 100644
index 00000000..5d183528
--- /dev/null
+++ b/test-suite/success/Check.v
@@ -0,0 +1,14 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Compiling the theories allows to test parsing and typing but not printing *)
+(* This file tests that pretty-printing does not fail *)
+(* Test of exact output is not specified *)
+
+Check O.
+Check S.
+Check nat.
diff --git a/test-suite/success/Conjecture.v b/test-suite/success/Conjecture.v
new file mode 100644
index 00000000..6db5859b
--- /dev/null
+++ b/test-suite/success/Conjecture.v
@@ -0,0 +1,13 @@
+(* Check keywords Conjecture and Admitted are recognized *)
+
+Conjecture c : (n:nat)n=O.
+
+Check c.
+
+Theorem d : (n:nat)n=O.
+Proof.
+ NewInduction n.
+ Reflexivity.
+ Assert H:False.
+ 2:NewDestruct H.
+Admitted.
diff --git a/test-suite/success/DHyp.v b/test-suite/success/DHyp.v
new file mode 100644
index 00000000..73907bc4
--- /dev/null
+++ b/test-suite/success/DHyp.v
@@ -0,0 +1,14 @@
+V7only [
+HintDestruct Hypothesis h1 (le ? O) 3 [Fun I -> Inversion I ].
+
+Lemma lem1 : ~(le (S O) O).
+Intro H.
+DHyp H.
+Qed.
+
+HintDestruct Conclusion h2 (le O ?) 3 [Constructor].
+
+Lemma lem2 : (le O O).
+DConcl.
+Qed.
+].
diff --git a/test-suite/success/Decompose.v b/test-suite/success/Decompose.v
new file mode 100644
index 00000000..21a3ab5d
--- /dev/null
+++ b/test-suite/success/Decompose.v
@@ -0,0 +1,7 @@
+(* This was a Decompose bug reported by Randy Pollack (29 Mar 2000) *)
+
+Goal (O=O/\((x:nat)(x=x)->(x=x)/\((y:nat)y=y->y=y)))-> True.
+Intro H.
+Decompose [and] H. (* Was failing *)
+
+Abort.
diff --git a/test-suite/success/Destruct.v b/test-suite/success/Destruct.v
new file mode 100644
index 00000000..fdd929bb
--- /dev/null
+++ b/test-suite/success/Destruct.v
@@ -0,0 +1,13 @@
+(* Submitted by Robert Schneck *)
+
+Parameter A,B,C,D : Prop.
+Axiom X : A->B->C/\D.
+
+Lemma foo : A->B->C.
+Proof.
+Intros.
+NewDestruct X. (* Should find axiom X and should handle arguments of X *)
+Assumption.
+Assumption.
+Assumption.
+Qed.
diff --git a/test-suite/success/DiscrR.v b/test-suite/success/DiscrR.v
new file mode 100644
index 00000000..5d12098f
--- /dev/null
+++ b/test-suite/success/DiscrR.v
@@ -0,0 +1,41 @@
+Require Reals.
+Require DiscrR.
+
+Lemma ex0: ``1<>0``.
+Proof.
+ DiscrR.
+Save.
+
+Lemma ex1: ``0<>2``.
+Proof.
+ DiscrR.
+Save.
+Lemma ex2: ``4<>3``.
+Proof.
+ DiscrR.
+Save.
+
+Lemma ex3: ``3<>5``.
+Proof.
+ DiscrR.
+Save.
+
+Lemma ex4: ``-1<>0``.
+Proof.
+ DiscrR.
+Save.
+
+Lemma ex5: ``-2<>-3``.
+Proof.
+ DiscrR.
+Save.
+
+Lemma ex6: ``8<>-3``.
+Proof.
+ DiscrR.
+Save.
+
+Lemma ex7: ``-8<>3``.
+Proof.
+ DiscrR.
+Save.
diff --git a/test-suite/success/Discriminate.v b/test-suite/success/Discriminate.v
new file mode 100644
index 00000000..39d2f4bb
--- /dev/null
+++ b/test-suite/success/Discriminate.v
@@ -0,0 +1,11 @@
+(* Check the behaviour of Discriminate *)
+
+(* Check that Discriminate tries Intro until *)
+
+Lemma l1 : O=(S O)->False.
+Discriminate 1.
+Qed.
+
+Lemma l2 : (H:O=(S O))H==H.
+Discriminate H.
+Qed.
diff --git a/test-suite/success/Field.v b/test-suite/success/Field.v
new file mode 100644
index 00000000..c203b739
--- /dev/null
+++ b/test-suite/success/Field.v
@@ -0,0 +1,71 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+(* $Id: Field.v,v 1.1.16.1 2004/07/16 19:30:58 herbelin Exp $ *)
+
+(**** Tests of Field with real numbers ****)
+
+Require Reals.
+
+(* Example 1 *)
+Goal (eps:R)``eps*1/(2+2)+eps*1/(2+2) == eps*1/2``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 2 *)
+Goal (f,g:(R->R); x0,x1:R)
+ ``((f x1)-(f x0))*1/(x1-x0)+((g x1)-(g x0))*1/(x1-x0) == ((f x1)+
+ (g x1)-((f x0)+(g x0)))*1/(x1-x0)``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 3 *)
+Goal (a,b:R)``1/(a*b)*1/1/b == 1/a``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 4 *)
+Goal (a,b:R)``a <> 0``->``b <> 0``->``1/(a*b)/1/b == 1/a``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 5 *)
+Goal (a:R)``1 == 1*1/a*a``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 6 *)
+Goal (a,b:R)``b == b*/a*a``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 7 *)
+Goal (a,b:R)``b == b*1/a*a``.
+Proof.
+ Intros.
+ Field.
+Abort.
+
+(* Example 8 *)
+Goal (x,y:R)``x*((1/x)+x/(x+y)) == -(1/y)*y*(-(x*x/(x+y))-1)``.
+Proof.
+ Intros.
+ Field.
+Abort.
diff --git a/test-suite/success/Fourier.v b/test-suite/success/Fourier.v
new file mode 100644
index 00000000..f1f7ae08
--- /dev/null
+++ b/test-suite/success/Fourier.v
@@ -0,0 +1,16 @@
+Require Rfunctions.
+Require Fourier.
+
+Lemma l1:
+ (x, y, z : R)
+ ``(Rabsolu x-z) <= (Rabsolu x-y)+(Rabsolu y-z)``.
+Intros; SplitAbsolu; Fourier.
+Qed.
+
+Lemma l2:
+ (x, y : R)
+ ``x < (Rabsolu y)`` ->
+ ``y < 1`` -> ``x >= 0`` -> ``-y <= 1`` -> ``(Rabsolu x) <= 1``.
+Intros.
+SplitAbsolu; Fourier.
+Qed.
diff --git a/test-suite/success/Funind.v b/test-suite/success/Funind.v
new file mode 100644
index 00000000..819da259
--- /dev/null
+++ b/test-suite/success/Funind.v
@@ -0,0 +1,440 @@
+
+Definition iszero [n:nat] : bool := Cases n of
+ | O => true
+ | _ => false
+ end.
+
+Functional Scheme iszer_ind := Induction for iszero.
+
+Lemma toto : (n:nat) n = 0 -> (iszero n) = true.
+Intros x eg.
+Functional Induction iszero x; Simpl.
+Trivial.
+Subst x.
+Inversion H_eq_.
+Qed.
+
+(* We can even reuse the proof as a scheme: *)
+
+Functional Scheme toto_ind := Induction for iszero.
+
+
+
+
+
+Definition ftest [n, m:nat] : nat :=
+ Cases n of
+ | O => Cases m of
+ | O => 0
+ | _ => 1
+ end
+ | (S p) => 0
+ end.
+
+Functional Scheme ftest_ind := Induction for ftest.
+
+Lemma test1 : (n,m:nat) (le (ftest n m) 2).
+Intros n m.
+Functional Induction ftest n m;Auto.
+Save.
+
+
+Lemma test11 : (m:nat) (le (ftest 0 m) 2).
+Intros m.
+Functional Induction ftest 0 m.
+Auto.
+Auto.
+Qed.
+
+
+Definition lamfix :=
+[m:nat ]
+(Fix trivfun {trivfun [n:nat] : nat := Cases n of
+ | O => m
+ | (S p) => (trivfun p)
+ end}).
+
+(* Parameter v1 v2 : nat. *)
+
+Lemma lamfix_lem : (v1,v2:nat) (lamfix v1 v2) = v1.
+Intros v1 v2.
+Functional Induction lamfix v1 v2.
+Trivial.
+Assumption.
+Defined.
+
+
+
+(* polymorphic function *)
+Require PolyList.
+
+Functional Scheme app_ind := Induction for app.
+
+Lemma appnil : (A:Set)(l,l':(list A)) l'=(nil A) -> l = (app l l').
+Intros A l l'.
+Functional Induction app A l l';Intuition.
+Rewrite <- H1;Trivial.
+Save.
+
+
+
+
+
+Require Export Arith.
+
+
+Fixpoint trivfun [n:nat] : nat :=
+ Cases n of
+ | O => 0
+ | (S m) => (trivfun m)
+ end.
+
+
+(* essaie de parametre variables non locaux:*)
+
+Parameter varessai : nat.
+
+Lemma first_try : (trivfun varessai) = 0.
+Functional Induction trivfun varessai.
+Trivial.
+Simpl.
+Assumption.
+Defined.
+
+
+Functional Scheme triv_ind := Induction for trivfun.
+
+Lemma bisrepetita : (n':nat) (trivfun n') = 0.
+Intros n'.
+Functional Induction trivfun n'.
+Trivial.
+Simpl .
+Assumption.
+Qed.
+
+
+
+
+
+
+
+Fixpoint iseven [n:nat] : bool :=
+ Cases n of
+ | O => true
+ | (S (S m)) => (iseven m)
+ | _ => false
+ end.
+
+Fixpoint funex [n:nat] : nat :=
+ Cases (iseven n) of
+ | true => n
+ | false => Cases n of
+ | O => 0
+ | (S r) => (funex r)
+ end
+ end.
+
+Fixpoint nat_equal_bool [n:nat] : nat -> bool :=
+[m:nat]
+ Cases n of
+ | O => Cases m of
+ | O => true
+ | _ => false
+ end
+ | (S p) => Cases m of
+ | O => false
+ | (S q) => (nat_equal_bool p q)
+ end
+ end.
+
+
+Require Export Div2.
+
+Lemma div2_inf : (n:nat) (le (div2 n) n).
+Intros n.
+Functional Induction div2 n.
+Auto.
+Auto.
+
+Apply le_S.
+Apply le_n_S.
+Exact H.
+Qed.
+
+(* reuse this lemma as a scheme:*)
+
+Functional Scheme div2_ind := Induction for div2_inf.
+
+Fixpoint nested_lam [n:nat] : nat -> nat :=
+ Cases n of
+ | O => [m:nat ] 0
+ | (S n') => [m:nat ] (plus m (nested_lam n' m))
+ end.
+
+Functional Scheme nested_lam_ind := Induction for nested_lam.
+
+Lemma nest : (n, m:nat) (nested_lam n m) = (mult n m).
+Intros n m.
+Functional Induction nested_lam n m; Auto.
+Qed.
+
+Lemma nest2 : (n, m:nat) (nested_lam n m) = (mult n m).
+Intros n m. Pattern n m .
+Apply nested_lam_ind; Simpl ; Intros; Auto.
+Qed.
+
+
+Fixpoint essai [x : nat] : nat * nat -> nat :=
+ [p : nat * nat] ( Case p of [n, m : ?] Cases n of
+ O => O
+ | (S q) =>
+ Cases x of
+ O => (S O)
+ | (S r) => (S (essai r (q, m)))
+ end
+ end end ).
+
+Lemma essai_essai:
+ (x : nat)
+ (p : nat * nat) ( Case p of [n, m : ?] (lt O n) -> (lt O (essai x p)) end ).
+Intros x p.
+(Functional Induction essai x p); Intros.
+Inversion H.
+Simpl; Try Abstract ( Auto with arith ).
+Simpl; Try Abstract ( Auto with arith ).
+Qed.
+
+
+Fixpoint plus_x_not_five'' [n : nat] : nat -> nat :=
+ [m : nat] let x = (nat_equal_bool m (S (S (S (S (S O)))))) in
+ let y = O in
+ Cases n of
+ O => y
+ | (S q) =>
+ let recapp = (plus_x_not_five'' q m) in
+ Cases x of true => (S recapp) | false => (S recapp) end
+ end.
+
+Lemma notplusfive'':
+ (x, y : nat) y = (S (S (S (S (S O))))) -> (plus_x_not_five'' x y) = x.
+Intros a b.
+Unfold plus_x_not_five''.
+(Functional Induction plus_x_not_five'' a b); Intros hyp; Simpl; Auto.
+Qed.
+
+Lemma iseq_eq: (n, m : nat) n = m -> (nat_equal_bool n m) = true.
+Intros n m.
+Unfold nat_equal_bool.
+(Functional Induction nat_equal_bool n m); Simpl; Intros hyp; Auto.
+Inversion hyp.
+Inversion hyp.
+Qed.
+
+Lemma iseq_eq': (n, m : nat) (nat_equal_bool n m) = true -> n = m.
+Intros n m.
+Unfold nat_equal_bool.
+(Functional Induction nat_equal_bool n m); Simpl; Intros eg; Auto.
+Inversion eg.
+Inversion eg.
+Qed.
+
+
+Inductive istrue : bool -> Prop :=
+ istrue0: (istrue true) .
+
+Lemma inf_x_plusxy': (x, y : nat) (le x (plus x y)).
+Intros n m.
+(Functional Induction plus n m); Intros.
+Auto with arith.
+Auto with arith.
+Qed.
+
+
+Lemma inf_x_plusxy'': (x : nat) (le x (plus x O)).
+Intros n.
+Unfold plus.
+(Functional Induction plus n O); Intros.
+Auto with arith.
+Apply le_n_S.
+Assumption.
+Qed.
+
+Lemma inf_x_plusxy''': (x : nat) (le x (plus O x)).
+Intros n.
+(Functional Induction plus O n); Intros;Auto with arith.
+Qed.
+
+Fixpoint mod2 [n : nat] : nat :=
+ Cases n of O => O
+ | (S (S m)) => (S (mod2 m))
+ | _ => O end.
+
+Lemma princ_mod2: (n : nat) (le (mod2 n) n).
+Intros n.
+(Functional Induction mod2 n); Simpl; Auto with arith.
+Qed.
+
+Definition isfour : nat -> bool :=
+ [n : nat] Cases n of (S (S (S (S O)))) => true | _ => false end.
+
+Definition isononeorfour : nat -> bool :=
+ [n : nat] Cases n of (S O) => true
+ | (S (S (S (S O)))) => true
+ | _ => false end.
+
+Lemma toto'': (n : nat) (istrue (isfour n)) -> (istrue (isononeorfour n)).
+Intros n.
+(Functional Induction isononeorfour n); Intros istr; Simpl; Inversion istr.
+Apply istrue0.
+Qed.
+
+Lemma toto': (n, m : nat) n = (S (S (S (S O)))) -> (istrue (isononeorfour n)).
+Intros n.
+(Functional Induction isononeorfour n); Intros m istr; Inversion istr.
+Apply istrue0.
+Qed.
+
+Definition ftest4 : nat -> nat -> nat :=
+ [n, m : nat] Cases n of
+ O =>
+ Cases m of O => O | (S q) => (S O) end
+ | (S p) =>
+ Cases m of O => O | (S r) => (S O) end
+ end.
+
+Lemma test4: (n, m : nat) (le (ftest n m) (S (S O))).
+Intros n m.
+(Functional Induction ftest n m); Auto with arith.
+Qed.
+
+Lemma test4': (n, m : nat) (le (ftest4 (S n) m) (S (S O))).
+Intros n m.
+(Functional Induction ftest4 (S n) m).
+Auto with arith.
+Auto with arith.
+Qed.
+
+Definition ftest44 : nat * nat -> nat -> nat -> nat :=
+ [x : nat * nat]
+ [n, m : nat]
+ ( Case x of [p, q : ?] Cases n of
+ O =>
+ Cases m of O => O | (S q) => (S O) end
+ | (S p) =>
+ Cases m of O => O | (S r) => (S O) end
+ end end ).
+
+Lemma test44:
+ (pq : nat * nat) (n, m, o, r, s : nat) (le (ftest44 pq n (S m)) (S (S O))).
+Intros pq n m o r s.
+(Functional Induction ftest44 pq n (S m)).
+Auto with arith.
+Auto with arith.
+Auto with arith.
+Auto with arith.
+Qed.
+
+Fixpoint ftest2 [n : nat] : nat -> nat :=
+ [m : nat] Cases n of
+ O =>
+ Cases m of O => O | (S q) => O end
+ | (S p) => (ftest2 p m)
+ end.
+
+Lemma test2: (n, m : nat) (le (ftest2 n m) (S (S O))).
+Intros n m.
+(Functional Induction ftest2 n m) ; Simpl; Intros; Auto.
+Qed.
+
+Fixpoint ftest3 [n : nat] : nat -> nat :=
+ [m : nat] Cases n of
+ O => O
+ | (S p) =>
+ Cases m of O => (ftest3 p O) | (S r) => O end
+ end.
+
+Lemma test3: (n, m : nat) (le (ftest3 n m) (S (S O))).
+Intros n m.
+(Functional Induction ftest3 n m).
+Intros.
+Auto.
+Intros.
+Auto.
+Intros.
+Simpl.
+Auto.
+Qed.
+
+Fixpoint ftest5 [n : nat] : nat -> nat :=
+ [m : nat] Cases n of
+ O => O
+ | (S p) =>
+ Cases m of O => (ftest5 p O) | (S r) => (ftest5 p r) end
+ end.
+
+Lemma test5: (n, m : nat) (le (ftest5 n m) (S (S O))).
+Intros n m.
+(Functional Induction ftest5 n m).
+Intros.
+Auto.
+Intros.
+Auto.
+Intros.
+Simpl.
+Auto.
+Qed.
+
+Definition ftest7 : (n : nat) nat :=
+ [n : nat] Cases (ftest5 n O) of O => O | (S r) => O end.
+
+Lemma essai7:
+ (Hrec : (n : nat) (ftest5 n O) = O -> (le (ftest7 n) (S (S O))))
+ (Hrec0 : (n, r : nat) (ftest5 n O) = (S r) -> (le (ftest7 n) (S (S O))))
+ (n : nat) (le (ftest7 n) (S (S O))).
+Intros hyp1 hyp2 n.
+Unfold ftest7.
+(Functional Induction ftest7 n); Auto.
+Qed.
+
+Fixpoint ftest6 [n : nat] : nat -> nat :=
+ [m : nat]
+ Cases n of
+ O => O
+ | (S p) =>
+ Cases (ftest5 p O) of O => (ftest6 p O) | (S r) => (ftest6 p r) end
+ end.
+
+
+Lemma princ6:
+ ((n, m : nat) n = O -> (le (ftest6 O m) (S (S O)))) ->
+ ((n, m, p : nat)
+ (le (ftest6 p O) (S (S O))) ->
+ (ftest5 p O) = O -> n = (S p) -> (le (ftest6 (S p) m) (S (S O)))) ->
+ ((n, m, p, r : nat)
+ (le (ftest6 p r) (S (S O))) ->
+ (ftest5 p O) = (S r) -> n = (S p) -> (le (ftest6 (S p) m) (S (S O)))) ->
+ (x, y : nat) (le (ftest6 x y) (S (S O))).
+Intros hyp1 hyp2 hyp3 n m.
+Generalize hyp1 hyp2 hyp3.
+Clear hyp1 hyp2 hyp3.
+(Functional Induction ftest6 n m);Auto.
+Qed.
+
+Lemma essai6: (n, m : nat) (le (ftest6 n m) (S (S O))).
+Intros n m.
+Unfold ftest6.
+(Functional Induction ftest6 n m); Simpl; Auto.
+Qed.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test-suite/success/Generalize.v b/test-suite/success/Generalize.v
new file mode 100644
index 00000000..0dc73991
--- /dev/null
+++ b/test-suite/success/Generalize.v
@@ -0,0 +1,7 @@
+(* Check Generalize Dependent *)
+
+Lemma l1 : [a:=O;b:=a](c:b=b;d:(True->b=b))d=d.
+Intros.
+Generalize Dependent a.
+Intros a b c d.
+Abort.
diff --git a/test-suite/success/Hints.v b/test-suite/success/Hints.v
new file mode 100644
index 00000000..f32753e0
--- /dev/null
+++ b/test-suite/success/Hints.v
@@ -0,0 +1,48 @@
+(* Checks syntax of Hints commands *)
+(* Checks that qualified names are accepted *)
+
+(* New-style syntax *)
+Hint h1 : core arith := Resolve Logic.refl_equal.
+Hint h2 := Immediate Logic.trans_equal.
+Hint h3 : core := Unfold Logic.sym_equal.
+Hint h4 : foo bar := Constructors Logic.eq.
+Hint h5 : foo bar := Extern 3 (eq ? ? ?) Apply Logic.refl_equal.
+
+(* Old-style syntax *)
+Hints Resolve Coq.Init.Logic.refl_equal Coq.Init.Logic.sym_equal.
+Hints Resolve Coq.Init.Logic.refl_equal Coq.Init.Logic.sym_equal : foo.
+Hints Immediate Coq.Init.Logic.refl_equal Coq.Init.Logic.sym_equal.
+Hints Immediate Coq.Init.Logic.refl_equal Coq.Init.Logic.sym_equal : foo.
+Hints Unfold Coq.Init.Datatypes.fst Coq.Init.Logic.sym_equal.
+Hints Unfold Coq.Init.Datatypes.fst Coq.Init.Logic.sym_equal : foo.
+
+(* What's this stranged syntax ? *)
+HintDestruct Conclusion h6 (le ? ?) 4 [ Fun H -> Apply H ].
+HintDestruct Discardable Hypothesis h7 (le ? ?) 4 [ Fun H -> Apply H ].
+HintDestruct Hypothesis h8 (le ? ?) 4 [ Fun H -> Apply H ].
+
+(* Checks that local names are accepted *)
+Section A.
+ Remark Refl : (A:Set)(x:A)x=x.
+ Proof refl_equal.
+ Definition Sym := sym_equal.
+ Local Trans := trans_equal.
+
+ Hint h1 : foo := Resolve Refl.
+ Hint h2 : bar := Resolve Sym.
+ Hint h3 : foo2 := Resolve Trans.
+
+ Hint h2 := Immediate Refl.
+ Hint h2 := Immediate Sym.
+ Hint h2 := Immediate Trans.
+
+ Hint h3 := Unfold Refl.
+ Hint h3 := Unfold Sym.
+ Hint h3 := Unfold Trans.
+
+ Hints Resolve Sym Trans Refl.
+ Hints Immediate Sym Trans Refl.
+ Hints Unfold Sym Trans Refl.
+
+End A.
+
diff --git a/test-suite/success/Inductive.v b/test-suite/success/Inductive.v
new file mode 100644
index 00000000..87431a75
--- /dev/null
+++ b/test-suite/success/Inductive.v
@@ -0,0 +1,34 @@
+(* Check local definitions in context of inductive types *)
+Inductive A [C,D:Prop; E:=C; F:=D; x,y:E->F] : E -> Set :=
+ I : (z:E)(A C D x y z).
+
+Check
+ [C,D:Prop; E:=C; F:=D; x,y:(E ->F);
+ P:((c:C)(A C D x y c) ->Type);
+ f:((z:C)(P z (I C D x y z)));
+ y0:C; a:(A C D x y y0)]
+ <[y1:C; a0:(A C D x y y1)](P y1 a0)>Cases a of (I x0) => (f x0) end.
+
+Record B [C,D:Set; E:=C; F:=D; x,y:E->F] : Set := { p : C; q : E }.
+
+Check
+ [C,D:Set; E:=C; F:=D; x,y:(E ->F);
+ P:((B C D x y) ->Type);
+ f:((p0,q0:C)(P (Build_B C D x y p0 q0)));
+ b:(B C D x y)]
+ <[b0:(B C D x y)](P b0)>Cases b of (Build_B x0 x1) => (f x0 x1) end.
+
+(* Check implicit parameters of inductive types (submitted by Pierre
+ Casteran and also implicit in #338) *)
+
+Set Implicit Arguments.
+
+CoInductive LList [A:Set] : Set :=
+ | LNil : (LList A)
+ | LCons : A -> (LList A) -> (LList A).
+
+Implicits LNil [1].
+
+Inductive Finite [A:Set] : (LList A) -> Prop :=
+ | Finite_LNil : (Finite LNil)
+ | Finite_LCons : (a:A) (l:(LList A)) (Finite l) -> (Finite (LCons a l)).
diff --git a/test-suite/success/Injection.v b/test-suite/success/Injection.v
new file mode 100644
index 00000000..fd80cec6
--- /dev/null
+++ b/test-suite/success/Injection.v
@@ -0,0 +1,34 @@
+(* Check the behaviour of Injection *)
+
+(* Check that Injection tries Intro until *)
+
+Lemma l1 : (x:nat)(S x)=(S (S x))->False.
+Injection 1.
+Apply n_Sn.
+Qed.
+
+Lemma l2 : (x:nat)(H:(S x)=(S (S x)))H==H->False.
+Injection H.
+Intros.
+Apply (n_Sn x H0).
+Qed.
+
+(* Check that no tuple needs to be built *)
+Lemma l3 : (x,y:nat)
+ (existS ? [n:nat]({n=n}+{n=n}) x (left ? ? (refl_equal nat x)))=
+ (existS ? [n:nat]({n=n}+{n=n}) y (left ? ? (refl_equal nat y)))
+ -> x=y.
+Intros x y H.
+Injection H.
+Exact [H]H.
+Qed.
+
+(* Check that a tuple is built (actually the same as the initial one) *)
+Lemma l4 : (p1,p2:{O=O}+{O=O})
+ (existS ? [n:nat]({n=n}+{n=n}) O p1)=(existS ? [n:nat]({n=n}+{n=n}) O p2)
+ ->(existS ? [n:nat]({n=n}+{n=n}) O p1)=(existS ? [n:nat]({n=n}+{n=n}) O p2).
+Intros.
+Injection H.
+Exact [H]H.
+Qed.
+
diff --git a/test-suite/success/Inversion.v b/test-suite/success/Inversion.v
new file mode 100644
index 00000000..a9e4a843
--- /dev/null
+++ b/test-suite/success/Inversion.v
@@ -0,0 +1,85 @@
+Axiom magic:False.
+
+(* Submitted by Dachuan Yu (bug #220) *)
+Fixpoint T[n:nat] : Type :=
+ Cases n of
+ | O => (nat -> Prop)
+ | (S n') => (T n')
+ end.
+Inductive R : (n:nat)(T n) -> nat -> Prop :=
+ | RO : (Psi:(T O); l:nat)
+ (Psi l) -> (R O Psi l)
+ | RS : (n:nat; Psi:(T (S n)); l:nat)
+ (R n Psi l) -> (R (S n) Psi l).
+Definition Psi00 : (nat -> Prop) := [n:nat] False.
+Definition Psi0 : (T O) := Psi00.
+Lemma Inversion_RO : (l:nat)(R O Psi0 l) -> (Psi00 l).
+Inversion 1.
+Abort.
+
+(* Submitted by Pierre Casteran (bug #540) *)
+
+Set Implicit Arguments.
+Parameter rule: Set -> Type.
+
+Inductive extension [I:Set]:Type :=
+ NL : (extension I)
+|add_rule : (rule I) -> (extension I) -> (extension I).
+
+
+Inductive in_extension [I :Set;r: (rule I)] : (extension I) -> Type :=
+ in_first : (e:?)(in_extension r (add_rule r e))
+|in_rest : (e,r':?)(in_extension r e) -> (in_extension r (add_rule r' e)).
+
+Implicits NL [1].
+
+Inductive super_extension [I:Set;e :(extension I)] : (extension I) -> Type :=
+ super_NL : (super_extension e NL)
+| super_add : (r:?)(e': (extension I))
+ (in_extension r e) ->
+ (super_extension e e') ->
+ (super_extension e (add_rule r e')).
+
+
+
+Lemma super_def : (I :Set)(e1, e2: (extension I))
+ (super_extension e2 e1) ->
+ (ru:?)
+ (in_extension ru e1) ->
+ (in_extension ru e2).
+Proof.
+ Induction 1.
+ Inversion 1; Auto.
+ Elim magic.
+Qed.
+
+(* Example from Norbert Schirmer on Coq-Club, Sep 2000 *)
+
+Unset Implicit Arguments.
+Definition Q[n,m:nat;prf:(le n m)]:=True.
+Goal (n,m:nat;H:(le (S n) m))(Q (S n) m H)==True.
+Intros.
+Dependent Inversion_clear H.
+Elim magic.
+Elim magic.
+Qed.
+
+(* Submitted by Boris Yakobowski (bug #529) *)
+(* Check that Inversion does not fail due to unnormalized evars *)
+
+Set Implicit Arguments.
+Require Import Bvector.
+
+Inductive I : nat -> Set :=
+| C1 : (I (S O))
+| C2 : (k,i:nat)(vector (I i) k) -> (I i).
+
+Inductive SI : (k:nat)(I k) -> (vector nat k) -> nat -> Prop :=
+| SC2 : (k,i,vf:nat) (v:(vector (I i) k))(xi:(vector nat i))(SI (C2 v) xi vf).
+
+Theorem SUnique : (k:nat)(f:(I k))(c:(vector nat k))
+(v,v':?) (SI f c v) -> (SI f c v') -> v=v'.
+Proof.
+NewInduction 1.
+Intros H ; Inversion H.
+Admitted.
diff --git a/test-suite/success/LetIn.v b/test-suite/success/LetIn.v
new file mode 100644
index 00000000..0e0b4435
--- /dev/null
+++ b/test-suite/success/LetIn.v
@@ -0,0 +1,11 @@
+(* Simple let-in's *)
+Definition l1 := [P := O]P.
+Definition l2 := [P := nat]P.
+Definition l3 := [P := True]P.
+Definition l4 := [P := Prop]P.
+Definition l5 := [P := Type]P.
+
+(* Check casting of let-in *)
+Definition l6 := [P := O : nat]P.
+Definition l7 := [P := True : Prop]P.
+Definition l8 := [P := True : Type]P.
diff --git a/test-suite/success/MatchFail.v b/test-suite/success/MatchFail.v
new file mode 100644
index 00000000..d89ee3be
--- /dev/null
+++ b/test-suite/success/MatchFail.v
@@ -0,0 +1,28 @@
+Require Export ZArith.
+Require Export ZArithRing.
+
+(* Cette tactique a pour objectif de remplacer toute instance
+ de (POS (xI e)) ou de (POS (xO e)) par
+ 2*(POS e)+1 ou 2*(POS e), pour rendre les expressions plus
+ à même d'être utilisées par Ring, lorsque ces expressions contiennent
+ des variables de type positive. *)
+Tactic Definition compute_POS :=
+ (Match Context With
+ | [|- [(POS (xI ?1))]] -> Let v = ?1 In
+ (Match v With
+ | [xH] ->
+ (Fail 1)
+ |_->
+ Rewrite (POS_xI v))
+ | [ |- [(POS (xO ?1))]] -> Let v = ?1 In
+ Match v With
+ |[xH]->
+ (Fail 1)
+ |[?]->
+ Rewrite (POS_xO v)).
+
+Goal (x:positive)(POS (xI (xI x)))=`4*(POS x)+3`.
+Intros.
+Repeat compute_POS.
+Ring.
+Qed.
diff --git a/test-suite/success/Mod_ltac.v b/test-suite/success/Mod_ltac.v
new file mode 100644
index 00000000..1a9f6fc5
--- /dev/null
+++ b/test-suite/success/Mod_ltac.v
@@ -0,0 +1,20 @@
+(* Submitted by Houda Anoun *)
+
+Module toto.
+Tactic Definition titi:=Auto.
+End toto.
+
+Module ti.
+Import toto.
+Tactic Definition equal:=
+Match Context With
+[ |- ?1=?1]-> titi
+| [ |- ?]-> Idtac.
+
+End ti.
+
+Import ti.
+Definition simple:(a:nat) a=a.
+Intro.
+equal.
+Qed.
diff --git a/test-suite/success/Mod_params.v b/test-suite/success/Mod_params.v
new file mode 100644
index 00000000..098de3cf
--- /dev/null
+++ b/test-suite/success/Mod_params.v
@@ -0,0 +1,78 @@
+(* Syntax test - all possible kinds of module parameters *)
+
+Module Type SIG.
+End SIG.
+
+Module Type FSIG[X:SIG].
+End FSIG.
+
+Module F[X:SIG].
+End F.
+
+Module Q.
+End Q.
+
+(*
+#trace Nametab.push;;
+#trace Nametab.push_short_name;;
+#trace Nametab.freeze;;
+#trace Nametab.unfreeze;;
+#trace Nametab.exists_cci;;
+*)
+
+Module M.
+Reset M.
+Module M[X:SIG].
+Reset M.
+Module M[X,Y:SIG].
+Reset M.
+Module M[X:SIG;Y:SIG].
+Reset M.
+Module M[X,Y:SIG;Z1,Z:SIG].
+Reset M.
+Module M[X:SIG][Y:SIG].
+Reset M.
+Module M[X,Y:SIG][Z1,Z:SIG].
+Reset M.
+Module M:SIG.
+Reset M.
+Module M[X:SIG]:SIG.
+Reset M.
+Module M[X,Y:SIG]:SIG.
+Reset M.
+Module M[X:SIG;Y:SIG]:SIG.
+Reset M.
+Module M[X,Y:SIG;Z1,Z:SIG]:SIG.
+Reset M.
+Module M[X:SIG][Y:SIG]:SIG.
+Reset M.
+Module M[X,Y:SIG][Z1,Z:SIG]:SIG.
+Reset M.
+Module M:=(F Q).
+Reset M.
+Module M[X:FSIG]:=(X Q).
+Reset M.
+Module M[X,Y:FSIG]:=(X Q).
+Reset M.
+Module M[X:FSIG;Y:SIG]:=(X Y).
+Reset M.
+Module M[X,Y:FSIG;Z1,Z:SIG]:=(X Z).
+Reset M.
+Module M[X:FSIG][Y:SIG]:=(X Y).
+Reset M.
+Module M[X,Y:FSIG][Z1,Z:SIG]:=(X Z).
+Reset M.
+Module M:SIG:=(F Q).
+Reset M.
+Module M[X:FSIG]:SIG:=(X Q).
+Reset M.
+Module M[X,Y:FSIG]:SIG:=(X Q).
+Reset M.
+Module M[X:FSIG;Y:SIG]:SIG:=(X Y).
+Reset M.
+Module M[X,Y:FSIG;Z1,Z:SIG]:SIG:=(X Z).
+Reset M.
+Module M[X:FSIG][Y:SIG]:SIG:=(X Y).
+Reset M.
+Module M[X,Y:FSIG][Z1,Z:SIG]:SIG:=(X Z).
+Reset M.
diff --git a/test-suite/success/Mod_strengthen.v b/test-suite/success/Mod_strengthen.v
new file mode 100644
index 00000000..a472e698
--- /dev/null
+++ b/test-suite/success/Mod_strengthen.v
@@ -0,0 +1,64 @@
+Module Type Sub.
+ Axiom Refl1 : (x:nat)(x=x).
+ Axiom Refl2 : (x:nat)(x=x).
+ Axiom Refl3 : (x:nat)(x=x).
+ Inductive T : Set := A : T.
+End Sub.
+
+Module Type Main.
+ Declare Module M:Sub.
+End Main.
+
+
+Module A <: Main.
+ Module M <: Sub.
+ Lemma Refl1 : (x:nat) x=x.
+ Intros;Reflexivity.
+ Qed.
+ Axiom Refl2 : (x:nat) x=x.
+ Lemma Refl3 : (x:nat) x=x.
+ Intros;Reflexivity.
+ Defined.
+ Inductive T : Set := A : T.
+ End M.
+End A.
+
+
+
+(* first test *)
+
+Module F[S:Sub].
+ Module M:=S.
+End F.
+
+Module B <: Main with Module M:=A.M := F A.M.
+
+
+
+(* second test *)
+
+Lemma r1 : (A.M.Refl1 == B.M.Refl1).
+Proof.
+ Reflexivity.
+Qed.
+
+Lemma r2 : (A.M.Refl2 == B.M.Refl2).
+Proof.
+ Reflexivity.
+Qed.
+
+Lemma r3 : (A.M.Refl3 == B.M.Refl3).
+Proof.
+ Reflexivity.
+Qed.
+
+Lemma t : (A.M.T == B.M.T).
+Proof.
+ Reflexivity.
+Qed.
+
+Lemma a : (A.M.A == B.M.A).
+Proof.
+ Reflexivity.
+Qed.
+
diff --git a/test-suite/success/NatRing.v b/test-suite/success/NatRing.v
new file mode 100644
index 00000000..6a1eeccc
--- /dev/null
+++ b/test-suite/success/NatRing.v
@@ -0,0 +1,10 @@
+Require ArithRing.
+
+Lemma l1 : (S (S O))=(plus (S O) (S O)).
+NatRing.
+Qed.
+
+Lemma l2 : (x:nat)(S (S x))=(plus (S O) (S x)).
+Intro.
+NatRing.
+Qed. \ No newline at end of file
diff --git a/test-suite/success/Omega.v b/test-suite/success/Omega.v
new file mode 100644
index 00000000..c324919f
--- /dev/null
+++ b/test-suite/success/Omega.v
@@ -0,0 +1,89 @@
+
+Require Omega.
+
+(* Submitted by Xavier Urbain 18 Jan 2002 *)
+
+Lemma lem1 : (x,y:Z)
+ `-5 < x < 5` ->
+ `-5 < y` ->
+ `-5 < x+y+5`.
+Proof.
+Intros x y.
+Omega.
+Qed.
+
+(* Proposed by Pierre Crégut *)
+
+Lemma lem2 : (x:Z) `x < 4` -> `x > 2` -> `x=3`.
+Intro.
+Omega.
+Qed.
+
+(* Proposed by Jean-Christophe Filliâtre *)
+
+Lemma lem3 : (x,y:Z) `x = y` -> `x+x = y+y`.
+Proof.
+Intros.
+Omega.
+Qed.
+
+(* Proposed by Jean-Christophe Filliâtre: confusion between an Omega *)
+(* internal variable and a section variable (June 2001) *)
+
+Section A.
+Variable x,y : Z.
+Hypothesis H : `x > y`.
+Lemma lem4 : `x > y`.
+Omega.
+Qed.
+End A.
+
+(* Proposed by Yves Bertot: because a section var, L was wrongly renamed L0 *)
+(* May 2002 *)
+
+Section B.
+Variables R1,R2,S1,S2,H,S:Z.
+Hypothesis I:`R1 < 0`->`R2 = R1+(2*S1-1)`.
+Hypothesis J:`R1 < 0`->`S2 = S1-1`.
+Hypothesis K:`R1 >= 0`->`R2 = R1`.
+Hypothesis L:`R1 >= 0`->`S2 = S1`.
+Hypothesis M:`H <= 2*S`.
+Hypothesis N:`S < H`.
+Lemma lem5 : `H > 0`.
+Omega.
+Qed.
+End B.
+
+(* From Nicolas Oury (bug #180): handling -> on Set (fixed Oct 2002) *)
+Lemma lem6: (A: Set) (i:Z) `i<= 0` -> (`i<= 0` -> A) -> `i<=0`.
+Intros.
+Omega.
+Qed.
+
+(* Adapted from an example in Nijmegen/FTA/ftc/RefSeparating (Oct 2002) *)
+Require Omega.
+Section C.
+Parameter g:(m:nat)~m=O->Prop.
+Parameter f:(m:nat)(H:~m=O)(g m H).
+Variable n:nat.
+Variable ap_n:~n=O.
+Local delta:=(f n ap_n).
+Lemma lem7 : n=n.
+Omega.
+Qed.
+End C.
+
+(* Problem of dependencies *)
+Require Omega.
+Lemma lem8 : (H:O=O->O=O) H=H -> O=O.
+Intros; Omega.
+Qed.
+
+(* Bug that what caused by the use of intro_using in Omega *)
+Require Omega.
+Lemma lem9 : (p,q:nat)
+ ~((le p q)/\(lt p q)\/(le q p)/\(lt p q))
+ -> (lt p p)\/(le p p).
+Intros; Omega.
+Qed.
+
diff --git a/test-suite/success/PPFix.v8 b/test-suite/success/PPFix.v8
new file mode 100644
index 00000000..1ecbae3a
--- /dev/null
+++ b/test-suite/success/PPFix.v8
@@ -0,0 +1,8 @@
+
+(* To test PP of fixpoints *)
+Require Import Arith.
+Check fix a(n: nat): n<5 -> nat :=
+ match n return n<5 -> nat with
+ | 0 => fun _ => 0
+ | S n => fun h => S (a n (lt_S_n _ _ (lt_S _ _ h)))
+ end.
diff --git a/test-suite/success/Print.v b/test-suite/success/Print.v
new file mode 100644
index 00000000..4554a843
--- /dev/null
+++ b/test-suite/success/Print.v
@@ -0,0 +1,20 @@
+Print Tables.
+Print ML Path.
+Print ML Modules.
+Print LoadPath.
+Print Graph.
+Print Coercions.
+Print Classes.
+Print nat.
+Print Proof O.
+Print All.
+Print Grammar constr constr.
+Inspect 10.
+
+Section A.
+Coercion f := [x]True : nat -> Prop.
+Print Coercion Paths nat SORTCLASS.
+
+Print Section A.
+Print.
+
diff --git a/test-suite/success/Projection.v b/test-suite/success/Projection.v
new file mode 100644
index 00000000..7f5cd800
--- /dev/null
+++ b/test-suite/success/Projection.v
@@ -0,0 +1,45 @@
+Structure S : Type :=
+ {Dom : Type;
+ Op : Dom -> Dom -> Dom}.
+
+Check [s:S](Dom s).
+Check [s:S](Op s).
+Check [s:S;a,b:(Dom s)](Op s a b).
+
+(* v8
+Check fun s:S => s.(Dom).
+Check fun s:S => s.(Op).
+Check fun (s:S) (a b:s.(Dom)) => s.(Op) a b.
+*)
+
+Set Implicit Arguments.
+Unset Strict Implicits.
+
+Structure S' [A:Set] : Type :=
+ {Dom' : Type;
+ Op' : A -> Dom' -> Dom'}.
+
+Check [s:(S' nat)](Dom' s).
+Check [s:(S' nat)](Op' 2!s).
+Check [s:(S' nat)](!Op' nat s).
+Check [s:(S' nat);a:nat;b:(Dom' s)](Op' a b).
+Check [s:(S' nat);a:nat;b:(Dom' s)](!Op' nat s a b).
+
+(* v8
+Check fun s:S' => s.(Dom').
+Check fun s:S' => s.(Op').
+Check fun (s:S') (a b:s.(Dom')) => _.(Op') a b.
+Check fun (s:S') (a b:s.(Dom')) => s.(Op') a b.
+
+Set Implicit Arguments.
+Unset Strict Implicits.
+
+Structure S' (A:Set) : Type :=
+ {Dom' : Type;
+ Op' : A -> Dom' -> Dom'}.
+
+Check fun s:S' nat => s.(Dom').
+Check fun s:S' nat => s.(Op').
+Check fun (s:S' nat) (a:nat) (b:s.(Dom')) => _.(@Op' nat) a b.
+Check fun (s:S' nat) (a:nat) (b:s.(Dom')) => s.(Op') a b.
+*)
diff --git a/test-suite/success/Record.v b/test-suite/success/Record.v
new file mode 100644
index 00000000..f3a13634
--- /dev/null
+++ b/test-suite/success/Record.v
@@ -0,0 +1,3 @@
+(* Nijmegen expects redefinition of sorts *)
+Definition CProp := Prop.
+Record test : CProp := { n:nat }.
diff --git a/test-suite/success/Reg.v b/test-suite/success/Reg.v
new file mode 100644
index 00000000..eaa0690c
--- /dev/null
+++ b/test-suite/success/Reg.v
@@ -0,0 +1,136 @@
+Require Reals.
+
+Axiom y : R->R.
+Axiom d_y : (derivable y).
+Axiom n_y : (x:R)``(y x)<>0``.
+Axiom dy_0 : (derive_pt y R0 (d_y R0)) == R1.
+
+Lemma essai0 : (continuity_pt [x:R]``(x+2)/(y x)+x/(y x)`` R0).
+Assert H := d_y.
+Assert H0 := n_y.
+Reg.
+Qed.
+
+Lemma essai1 : (derivable_pt [x:R]``/2*(sin x)`` ``1``).
+Reg.
+Qed.
+
+Lemma essai2 : (continuity [x:R]``(Rsqr x)*(cos (x*x))+x``).
+Reg.
+Qed.
+
+Lemma essai3 : (derivable_pt [x:R]``x*((Rsqr x)+3)`` R0).
+Reg.
+Qed.
+
+Lemma essai4 : (derivable [x:R]``(x+x)*(sin x)``).
+Reg.
+Qed.
+
+Lemma essai5 : (derivable [x:R]``1+(sin (2*x+3))*(cos (cos x))``).
+Reg.
+Qed.
+
+Lemma essai6 : (derivable [x:R]``(cos (x+3))``).
+Reg.
+Qed.
+
+Lemma essai7 : (derivable_pt [x:R]``(cos (/(sqrt x)))*(Rsqr ((sin x)+1))`` R1).
+Reg.
+Apply Rlt_R0_R1.
+Red; Intro; Rewrite sqrt_1 in H; Assert H0 := R1_neq_R0; Elim H0; Assumption.
+Qed.
+
+Lemma essai8 : (derivable_pt [x:R]``(sqrt ((Rsqr x)+(sin x)+1))`` R0).
+Reg.
+Rewrite sin_0.
+Rewrite Rsqr_O.
+Replace ``0+0+1`` with ``1``; [Apply Rlt_R0_R1 | Ring].
+Qed.
+
+Lemma essai9 : (derivable_pt (plus_fct id sin) R1).
+Reg.
+Qed.
+
+Lemma essai10 : (derivable_pt [x:R]``x+2`` R0).
+Reg.
+Qed.
+
+Lemma essai11 : (derive_pt [x:R]``x+2`` R0 essai10)==R1.
+Reg.
+Qed.
+
+Lemma essai12 : (derivable [x:R]``x+(Rsqr (x+2))``).
+Reg.
+Qed.
+
+Lemma essai13 : (derive_pt [x:R]``x+(Rsqr (x+2))`` R0 (essai12 R0)) == ``5``.
+Reg.
+Qed.
+
+Lemma essai14 : (derivable_pt [x:R]``2*x+x`` ``2``).
+Reg.
+Qed.
+
+Lemma essai15 : (derive_pt [x:R]``2*x+x`` ``2`` essai14) == ``3``.
+Reg.
+Qed.
+
+Lemma essai16 : (derivable_pt [x:R]``x+(sin x)`` R0).
+Reg.
+Qed.
+
+Lemma essai17 : (derive_pt [x:R]``x+(sin x)`` R0 essai16)==``2``.
+Reg.
+Rewrite cos_0.
+Reflexivity.
+Qed.
+
+Lemma essai18 : (derivable_pt [x:R]``x+(y x)`` ``0``).
+Assert H := d_y.
+Reg.
+Qed.
+
+Lemma essai19 : (derive_pt [x:R]``x+(y x)`` ``0`` essai18) == ``2``.
+Assert H := dy_0.
+Assert H0 := d_y.
+Reg.
+Qed.
+
+Axiom z:R->R.
+Axiom d_z: (derivable z).
+
+Lemma essai20 : (derivable_pt [x:R]``(z (y x))`` R0).
+Reg.
+Apply d_y.
+Apply d_z.
+Qed.
+
+Lemma essai21 : (derive_pt [x:R]``(z (y x))`` R0 essai20) == R1.
+Assert H := dy_0.
+Reg.
+Abort.
+
+Lemma essai22 : (derivable [x:R]``(sin (z x))+(Rsqr (z x))/(y x)``).
+Assert H := d_y.
+Reg.
+Apply n_y.
+Apply d_z.
+Qed.
+
+(* Pour tester la continuite de sqrt en 0 *)
+Lemma essai23 : (continuity_pt [x:R]``(sin (sqrt (x-1)))+(exp (Rsqr ((sqrt x)+3)))`` R1).
+Reg.
+Left; Apply Rlt_R0_R1.
+Right; Unfold Rminus; Rewrite Rplus_Ropp_r; Reflexivity.
+Qed.
+
+Lemma essai24 : (derivable [x:R]``(sqrt (x*x+2*x+2))+(Rabsolu (x*x+1))``).
+Reg.
+Replace ``x*x+2*x+2`` with ``(Rsqr (x+1))+1``.
+Apply ge0_plus_gt0_is_gt0; [Apply pos_Rsqr | Apply Rlt_R0_R1].
+Unfold Rsqr; Ring.
+Red; Intro; Cut ``0<x*x+1``.
+Intro; Rewrite H in H0; Elim (Rlt_antirefl ? H0).
+Apply ge0_plus_gt0_is_gt0; [Replace ``x*x`` with (Rsqr x); [Apply pos_Rsqr | Reflexivity] | Apply Rlt_R0_R1].
+Qed.
diff --git a/test-suite/success/Remark.v b/test-suite/success/Remark.v
new file mode 100644
index 00000000..2dd6a211
--- /dev/null
+++ b/test-suite/success/Remark.v
@@ -0,0 +1,12 @@
+(* Test obsolete, Remark est maintenant global
+Section A.
+Section B.
+Section C.
+Remark t : True. Proof I.
+End C.
+Locate C.t.
+End B.
+Locate B.C.t.
+End A.
+Locate A.B.C.t.
+*)
diff --git a/test-suite/success/Rename.v b/test-suite/success/Rename.v
new file mode 100644
index 00000000..edb20a81
--- /dev/null
+++ b/test-suite/success/Rename.v
@@ -0,0 +1,5 @@
+Goal (n:nat)(n=O)->(n=O).
+Intros.
+Rename n into p.
+NewInduction p; Auto.
+Qed.
diff --git a/test-suite/success/Require.v b/test-suite/success/Require.v
new file mode 100644
index 00000000..654808fc
--- /dev/null
+++ b/test-suite/success/Require.v
@@ -0,0 +1,3 @@
+Require Coq.Arith.Plus.
+Read Module Coq.Arith.Minus.
+Locate Library Coq.Arith.Minus.
diff --git a/test-suite/success/Scopes.v b/test-suite/success/Scopes.v
new file mode 100644
index 00000000..55d8343e
--- /dev/null
+++ b/test-suite/success/Scopes.v
@@ -0,0 +1,8 @@
+(* Check exportation of Argument Scopes even without import of modules *)
+
+Require Import ZArith.
+
+Module A.
+Definition opp := Zopp.
+End A.
+Check (A.opp 3).
diff --git a/test-suite/success/Simplify_eq.v b/test-suite/success/Simplify_eq.v
new file mode 100644
index 00000000..41aa77ef
--- /dev/null
+++ b/test-suite/success/Simplify_eq.v
@@ -0,0 +1,13 @@
+(* Check the behaviour of Simplify_eq *)
+
+(* Check that Simplify_eq tries Intro until *)
+
+Lemma l1 : O=(S O)->False.
+Simplify_eq 1.
+Qed.
+
+Lemma l2 : (x:nat)(H:(S x)=(S (S x)))H==H->False.
+Simplify_eq H.
+Intros.
+Apply (n_Sn x H0).
+Qed.
diff --git a/test-suite/success/Tauto.v b/test-suite/success/Tauto.v
new file mode 100644
index 00000000..883a82ab
--- /dev/null
+++ b/test-suite/success/Tauto.v
@@ -0,0 +1,240 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+(* $Id: Tauto.v,v 1.10.8.1 2004/07/16 19:30:59 herbelin Exp $ *)
+
+(**** Tactics Tauto and Intuition ****)
+
+(**** Tauto:
+ Tactic for automating proof in Intuionnistic Propositional Calculus, based on
+ the contraction-free LJT* of Dickhoff ****)
+
+(**** Intuition:
+ Simplifications of goals, based on LJT* calcul ****)
+
+(**** Examples of intuitionistic tautologies ****)
+Parameter A,B,C,D,E,F:Prop.
+Parameter even:nat -> Prop.
+Parameter P:nat -> Prop.
+
+Lemma Ex_Wallen:(A->(B/\C)) -> ((A->B)\/(A->C)).
+Proof.
+ Tauto.
+Save.
+
+Lemma Ex_Klenne:~(~(A \/ ~A)).
+Proof.
+ Tauto.
+Save.
+
+Lemma Ex_Klenne':(n:nat)(~(~((even n) \/ ~(even n)))).
+Proof.
+ Tauto.
+Save.
+
+Lemma Ex_Klenne'':~(~(((n:nat)(even n)) \/ ~((m:nat)(even m)))).
+Proof.
+ Tauto.
+Save.
+
+Lemma tauto:((x:nat)(P x)) -> ((y:nat)(P y)).
+Proof.
+ Tauto.
+Save.
+
+Lemma tauto1:(A -> A).
+Proof.
+ Tauto.
+Save.
+
+Lemma tauto2:(A -> B -> C) -> (A -> B) -> A -> C.
+Proof.
+ Tauto.
+Save.
+
+Lemma a:(x0: (A \/ B))(x1:(B /\ C))(A -> B).
+Proof.
+ Tauto.
+Save.
+
+Lemma a2:((A -> (B /\ C)) -> ((A -> B) \/ (A -> C))).
+Proof.
+ Tauto.
+Save.
+
+Lemma a4:(~A -> ~A).
+Proof.
+ Tauto.
+Save.
+
+Lemma e2:~(~(A \/ ~A)).
+Proof.
+ Tauto.
+Save.
+
+Lemma e4:~(~((A \/ B) -> (A \/ B))).
+Proof.
+ Tauto.
+Save.
+
+Lemma y0:(x0:A)(x1: ~A)(x2:(A -> B))(x3:(A \/ B))(x4:(A /\ B))(A -> False).
+Proof.
+ Tauto.
+Save.
+
+Lemma y1:(x0:((A /\ B) /\ C))B.
+Proof.
+ Tauto.
+Save.
+
+Lemma y2:(x0:A)(x1:B)(C \/ B).
+Proof.
+ Tauto.
+Save.
+
+Lemma y3:(x0:(A /\ B))(B /\ A).
+Proof.
+ Tauto.
+Save.
+
+Lemma y5:(x0:(A \/ B))(B \/ A).
+Proof.
+ Tauto.
+Save.
+
+Lemma y6:(x0:(A -> B))(x1:A) B.
+Proof.
+ Tauto.
+Save.
+
+Lemma y7:(x0 : ((A /\ B) -> C))(x1 : B)(x2 : A) C.
+Proof.
+ Tauto.
+Save.
+
+Lemma y8:(x0 : ((A \/ B) -> C))(x1 : A) C.
+Proof.
+ Tauto.
+Save.
+
+Lemma y9:(x0 : ((A \/ B) -> C))(x1 : B) C.
+Proof.
+ Tauto.
+Save.
+
+Lemma y10:(x0 : ((A -> B) -> C))(x1 : B) C.
+Proof.
+ Tauto.
+Save.
+
+(* This example took much time with the old version of Tauto *)
+Lemma critical_example0:(~~B->B)->(A->B)->~~A->B.
+Proof.
+ Tauto.
+Save.
+
+(* Same remark as previously *)
+Lemma critical_example1:(~~B->B)->(~B->~A)->~~A->B.
+Proof.
+ Tauto.
+Save.
+
+(* This example took very much time (about 3mn on a PIII 450MHz in bytecode)
+ with the old Tauto. Now, it's immediate (less than 1s). *)
+Lemma critical_example2:(~A<->B)->(~B<->A)->(~~A<->A).
+Proof.
+ Tauto.
+Save.
+
+(* This example was a bug *)
+Lemma old_bug0:(~A<->B)->(~(C\/E)<->D/\F)->~(C\/A\/E)<->D/\B/\F.
+Proof.
+ Tauto.
+Save.
+
+(* Another bug *)
+Lemma old_bug1:((A->B->False)->False) -> (B->False) -> False.
+Proof.
+ Tauto.
+Save.
+
+(* A bug again *)
+Lemma old_bug2:
+ ((((C->False)->A)->((B->False)->A)->False)->False) ->
+ (((C->B->False)->False)->False) ->
+ ~A->A.
+Proof.
+ Tauto.
+Save.
+
+(* A bug from CNF form *)
+Lemma old_bug3:
+ ((~A\/B)/\(~B\/B)/\(~A\/~B)/\(~B\/~B)->False)->~((A->B)->B)->False.
+Proof.
+ Tauto.
+Save.
+
+(* sometimes, the behaviour of Tauto depends on the order of the hyps *)
+Lemma old_bug3bis:
+ ~((A->B)->B)->((~B\/~B)/\(~B\/~A)/\(B\/~B)/\(B\/~A)->False)->False.
+Proof.
+ Tauto.
+Save.
+
+(* A bug found by Freek Wiedijk <freek@cs.kun.nl> *)
+Lemma new_bug:
+ ((A<->B)->(B<->C)) ->
+ ((B<->C)->(C<->A)) ->
+ ((C<->A)->(A<->B)) ->
+ (A<->B).
+Proof.
+ Tauto.
+Save.
+
+
+(* A private club has the following rules :
+ *
+ * . rule 1 : Every non-scottish member wears red socks
+ * . rule 2 : Every member wears a kilt or doesn't wear red socks
+ * . rule 3 : The married members don't go out on sunday
+ * . rule 4 : A member goes out on sunday if and only if he is scottish
+ * . rule 5 : Every member who wears a kilt is scottish and married
+ * . rule 6 : Every scottish member wears a kilt
+ *
+ * Actually, no one can be accepted !
+ *)
+
+Section club.
+
+Variable Scottish, RedSocks, WearKilt, Married, GoOutSunday : Prop.
+
+Hypothesis rule1 : ~Scottish -> RedSocks.
+Hypothesis rule2 : WearKilt \/ ~RedSocks.
+Hypothesis rule3 : Married -> ~GoOutSunday.
+Hypothesis rule4 : GoOutSunday <-> Scottish.
+Hypothesis rule5 : WearKilt -> (Scottish /\ Married).
+Hypothesis rule6 : Scottish -> WearKilt.
+
+Lemma NoMember : False.
+Tauto.
+Save.
+
+End club.
+
+(**** Use of Intuition ****)
+Lemma intu0:(((x:nat)(P x)) /\ B) ->
+ (((y:nat)(P y)) /\ (P O)) \/ (B /\ (P O)).
+Proof.
+ Intuition.
+Save.
+
+Lemma intu1:((A:Prop)A\/~A)->(x,y:nat)(x=y\/~x=y).
+Proof.
+ Intuition.
+Save.
+
diff --git a/test-suite/success/Try.v b/test-suite/success/Try.v
new file mode 100644
index 00000000..05cab1e6
--- /dev/null
+++ b/test-suite/success/Try.v
@@ -0,0 +1,8 @@
+(* To shorten interactive scripts, it is better that Try catches
+ non-existent names in Unfold [cf bug #263] *)
+
+Lemma lem1 : True.
+Try (Unfold i_dont_exist).
+Trivial.
+Qed.
+
diff --git a/test-suite/success/cc.v b/test-suite/success/cc.v
new file mode 100644
index 00000000..4d898da9
--- /dev/null
+++ b/test-suite/success/cc.v
@@ -0,0 +1,83 @@
+
+Theorem t1: (A:Set)(a:A)(f:A->A)
+ (f a)=a->(f (f a))=a.
+Intros.
+Congruence.
+Save.
+
+Theorem t2: (A:Set)(a,b:A)(f:A->A)(g:A->A->A)
+ a=(f a)->(g b (f a))=(f (f a))->(g a b)=(f (g b a))->
+ (g a b)=a.
+Intros.
+Congruence.
+Save.
+
+(* 15=0 /\ 10=0 /\ 6=0 -> 0=1 *)
+
+Theorem t3: (N:Set)(o:N)(s:N->N)(d:N->N)
+ (s(s(s(s(s(s(s(s(s(s(s(s(s(s(s o)))))))))))))))=o->
+ (s (s (s (s (s (s (s (s (s (s o))))))))))=o->
+ (s (s (s (s (s (s o))))))=o->
+ o=(s o).
+Intros.
+Congruence.
+Save.
+
+(* Examples that fail due to dependencies *)
+
+(* yields transitivity problem *)
+
+Theorem dep:(A:Set)(P:A->Set)(f,g:(x:A)(P x))(x,y:A)
+ (e:x=y)(e0:(f y)=(g y))(f x)=(g x).
+Intros;Dependent Rewrite -> e;Exact e0.
+Save.
+
+(* yields congruence problem *)
+
+Theorem dep2:(A,B:Set)(f:(A:Set)(b:bool)if b then unit else A->unit)(e:A==B)
+ (f A true)=(f B true).
+Intros;Rewrite e;Reflexivity.
+Save.
+
+
+(* example that Congruence. can solve
+ (dependent function applied to the same argument)*)
+
+Theorem dep3:(A:Set)(P:(A->Set))(f,g:(x:A)(P x))f=g->(x:A)(f x)=(g x). Intros.
+Congruence.
+Save.
+
+(* Examples with injection rule *)
+
+Theorem inj1 : (A:Set;a,b,c,d:A)(a,c)=(b,d)->a=b/\c=d.
+Intros.
+Split;Congruence.
+Save.
+
+Theorem inj2 : (A:Set;a,c,d:A;f:A->A*A) (f=(pair A A a))->
+ (Some ? (f c))=(Some ? (f d))->c=d.
+Intros.
+Congruence.
+Save.
+
+(* Examples with discrimination rule *)
+
+Theorem discr1 : true=false->False.
+Intros.
+Congruence.
+Save.
+
+Theorem discr2 : (Some ? true)=(Some ? false)->False.
+Intros.
+Congruence.
+Save.
+
+(* example with Congruence.Solve (requires CCSolve.v)*)
+
+Require CCSolve.
+
+Theorem t4 : (A:Set; P:(A->Prop); a,b,c,d:A)a=b->c=d->
+ (P a)->((P b)->(P c))->(P d).
+Intros.
+CCsolve.
+Save.
diff --git a/test-suite/success/coercions.v b/test-suite/success/coercions.v
new file mode 100644
index 00000000..98b613ba
--- /dev/null
+++ b/test-suite/success/coercions.v
@@ -0,0 +1,11 @@
+(* Interaction between coercions and casts *)
+(* Example provided by Eduardo Gimenez *)
+
+Parameter Z,S:Set.
+
+Parameter f: S -> Z.
+Coercion f: S >-> Z.
+
+Parameter g : Z -> Z.
+
+Check [s](g (s::S)).
diff --git a/test-suite/success/coqbugs0181.v b/test-suite/success/coqbugs0181.v
new file mode 100644
index 00000000..21f906a6
--- /dev/null
+++ b/test-suite/success/coqbugs0181.v
@@ -0,0 +1,7 @@
+
+(* test the strength of pretyping unification *)
+
+Require PolyList.
+Definition listn := [A,n] {l:(list A)|(length l)=n}.
+Definition make_ln [A,n;l:(list A); h:([l](length l)=n l)] :=
+ (exist ?? l h).
diff --git a/test-suite/success/eauto.v b/test-suite/success/eauto.v
new file mode 100644
index 00000000..97f7ccf0
--- /dev/null
+++ b/test-suite/success/eauto.v
@@ -0,0 +1,49 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+Require PolyList.
+
+Parameter in_list : (list nat*nat)->nat->Prop.
+Definition not_in_list : (list nat*nat)->nat->Prop
+ := [l,n]~(in_list l n).
+
+(* Hints Unfold not_in_list. *)
+
+Axiom lem1 : (l1,l2:(list nat*nat))(n:nat)
+ (not_in_list (app l1 l2) n)->(not_in_list l1 n).
+
+Axiom lem2 : (l1,l2:(list nat*nat))(n:nat)
+ (not_in_list (app l1 l2) n)->(not_in_list l2 n).
+
+Axiom lem3 : (l:(list nat*nat))(n,p,q:nat)
+ (not_in_list (cons (p,q) l) n)->(not_in_list l n).
+
+Axiom lem4 : (l1,l2:(list nat*nat))(n:nat)
+ (not_in_list l1 n)->(not_in_list l2 n)->(not_in_list (app l1 l2) n).
+
+Hints Resolve lem1 lem2 lem3 lem4: essai.
+
+Goal (l:(list nat*nat))(n,p,q:nat)
+ (not_in_list (cons (p,q) l) n)->(not_in_list l n).
+Intros.
+EAuto with essai.
+Save.
+
+(* Example from Nicolas Magaud on coq-club - Jul 2000 *)
+
+Definition Nat: Set := nat.
+Parameter S':Nat ->Nat.
+Parameter plus':Nat -> Nat ->Nat.
+
+Lemma simpl_plus_l_rr1:
+ ((n0:Nat) ((m, p:Nat) (plus' n0 m)=(plus' n0 p) ->m=p) ->
+ (m, p:Nat) (S' (plus' n0 m))=(S' (plus' n0 p)) ->m=p) ->
+ (n:Nat) ((m, p:Nat) (plus' n m)=(plus' n p) ->m=p) ->
+ (m, p:Nat) (S' (plus' n m))=(S' (plus' n p)) ->m=p.
+Intros.
+EAuto. (* does EApply H *)
+Qed.
diff --git a/test-suite/success/eqdecide.v b/test-suite/success/eqdecide.v
new file mode 100644
index 00000000..f826df9a
--- /dev/null
+++ b/test-suite/success/eqdecide.v
@@ -0,0 +1,29 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+Inductive T : Set := A: T | B :T->T.
+
+Lemma lem1 : (x,y:T){x=y}+{~x=y}.
+Decide Equality.
+Qed.
+
+Lemma lem2 : (x,y:T){x=y}+{~x=y}.
+Intros x y.
+Decide Equality x y.
+Qed.
+
+Lemma lem3 : (x,y:T){x=y}+{~x=y}.
+Intros x y.
+Decide Equality y x.
+Qed.
+
+Lemma lem4 : (x,y:T){x=y}+{~x=y}.
+Intros x y.
+Compare x y; Auto.
+Qed.
+
diff --git a/test-suite/success/evars.v b/test-suite/success/evars.v
new file mode 100644
index 00000000..a7b6d6d8
--- /dev/null
+++ b/test-suite/success/evars.v
@@ -0,0 +1,23 @@
+(* The "?" of cons and eq should be inferred *)
+Variable list:Set -> Set.
+Variable cons:(T:Set) T -> (list T) -> (list T).
+Check (n:(list nat)) (EX l| (EX x| (n = (cons ? x l)))).
+
+(* Examples provided by Eduardo Gimenez *)
+
+Definition c [A;Q:(nat*A->Prop)->Prop;P] :=
+ (Q [p:nat*A]let (i,v) = p in (P i v)).
+
+(* What does this test ? *)
+Require PolyList.
+Definition list_forall_bool [A:Set][p:A->bool][l:(list A)] : bool :=
+ (fold_right ([a][r]if (p a) then r else false) true l).
+
+(* Checks that solvable ? in the lambda prefix of the definition are harmless*)
+Parameter A1,A2,F,B,C : Set.
+Parameter f : F -> A1 -> B.
+Definition f1 [frm0,a1]: B := (f frm0 a1).
+
+(* Checks that solvable ? in the type part of the definition are harmless *)
+Definition f2 : (frm0:?;a1:?)B := [frm0,a1](f frm0 a1).
+
diff --git a/test-suite/success/fix.v b/test-suite/success/fix.v
new file mode 100644
index 00000000..374029bb
--- /dev/null
+++ b/test-suite/success/fix.v
@@ -0,0 +1,51 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Ancien bug signale par Laurent Thery sur la condition de garde *)
+
+Require Import Bool.
+Require Import ZArith.
+
+Definition rNat := positive.
+
+Inductive rBoolOp: Set :=
+ rAnd: rBoolOp
+ | rEq: rBoolOp .
+
+Definition rlt: rNat -> rNat ->Prop := [a, b:rNat](compare a b EGAL)=INFERIEUR.
+
+Definition rltDec: (m, n:rNat){(rlt m n)}+{(rlt n m) \/ m=n}.
+Intros n m; Generalize (compare_convert_INFERIEUR n m);
+ Generalize (compare_convert_SUPERIEUR n m);
+ Generalize (compare_convert_EGAL n m); Case (compare n m EGAL).
+Intros H' H'0 H'1; Right; Right; Auto.
+Intros H' H'0 H'1; Left; Unfold rlt.
+Apply convert_compare_INFERIEUR; Auto.
+Intros H' H'0 H'1; Right; Left; Unfold rlt.
+Apply convert_compare_INFERIEUR; Auto.
+Apply H'0; Auto.
+Defined.
+
+
+Definition rmax: rNat -> rNat ->rNat.
+Intros n m; Case (rltDec n m); Intros Rlt0.
+Exact m.
+Exact n.
+Defined.
+
+Inductive rExpr: Set :=
+ rV: rNat ->rExpr
+ | rN: rExpr ->rExpr
+ | rNode: rBoolOp -> rExpr -> rExpr ->rExpr .
+
+Fixpoint maxVar[e:rExpr]: rNat :=
+ Cases e of
+ (rV n) => n
+ | (rN p) => (maxVar p)
+ | (rNode n p q) => (rmax (maxVar p) (maxVar q))
+ end.
+
diff --git a/test-suite/success/if.v b/test-suite/success/if.v
new file mode 100644
index 00000000..85cd1f11
--- /dev/null
+++ b/test-suite/success/if.v
@@ -0,0 +1,5 @@
+(* The synthesis of the elimination predicate may fail if algebric *)
+(* universes are not cautiously treated *)
+
+Check [b:bool]if b then Type else nat.
+
diff --git a/test-suite/success/implicit.v b/test-suite/success/implicit.v
new file mode 100644
index 00000000..c597f9bf
--- /dev/null
+++ b/test-suite/success/implicit.v
@@ -0,0 +1,31 @@
+(* Implicit on section variables *)
+
+Set Implicit Arguments.
+
+(* Example submitted by David Nowak *)
+
+Section Spec.
+Variable A:Set.
+Variable op : (A:Set)A->A->Set.
+Infix 6 "#" op V8only (at level 70).
+Check (x:A)(x # x).
+
+(* Example submitted by Christine *)
+Record stack : Type := {type : Set; elt : type;
+ empty : type -> bool; proof : (empty elt)=true }.
+
+Check (type:Set; elt:type; empty:(type->bool))(empty elt)=true->stack.
+
+End Spec.
+
+(* Example submitted by Frédéric (interesting in v8 syntax) *)
+
+Parameter f : nat -> nat * nat.
+Notation lhs := fst.
+Check [x](lhs ? ? (f x)).
+Check [x](!lhs ? ? (f x)).
+Notation "'rhs'" := snd.
+Check [x](rhs ? ? (f x)).
+(* V8 seulement
+Check (fun x => @ rhs ? ? (f x)).
+*)
diff --git a/test-suite/success/import_lib.v b/test-suite/success/import_lib.v
new file mode 100644
index 00000000..d031691d
--- /dev/null
+++ b/test-suite/success/import_lib.v
@@ -0,0 +1,202 @@
+Definition le_trans:=O.
+
+
+Module Test_Read.
+ Module M.
+ Read Module Le. (* Reading without importing *)
+
+ Check Le.le_trans.
+
+ Lemma th0 : le_trans = O.
+ Reflexivity.
+ Qed.
+ End M.
+
+ Check Le.le_trans.
+
+ Lemma th0 : le_trans = O.
+ Reflexivity.
+ Qed.
+
+ Import M.
+
+ Lemma th1 : le_trans = O.
+ Reflexivity.
+ Qed.
+End Test_Read.
+
+
+(****************************************************************)
+
+Definition le_decide := (S O). (* from Arith/Compare *)
+Definition min := O. (* from Arith/Min *)
+
+Module Test_Require.
+
+ Module M.
+ Require Compare. (* Imports Min as well *)
+
+ Lemma th1 : le_decide = Compare.le_decide.
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : min = Min.min.
+ Reflexivity.
+ Qed.
+
+ End M.
+
+ (* Checks that Compare and List are loaded *)
+ Check Compare.le_decide.
+ Check Min.min.
+
+
+ (* Checks that Compare and List are _not_ imported *)
+ Lemma th1 : le_decide = (S O).
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : min = O.
+ Reflexivity.
+ Qed.
+
+ (* It should still be the case after Import M *)
+ Import M.
+
+ Lemma th3 : le_decide = (S O).
+ Reflexivity.
+ Qed.
+
+ Lemma th4 : min = O.
+ Reflexivity.
+ Qed.
+
+End Test_Require.
+
+(****************************************************************)
+
+Module Test_Import.
+ Module M.
+ Import Compare. (* Imports Min as well *)
+
+ Lemma th1 : le_decide = Compare.le_decide.
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : min = Min.min.
+ Reflexivity.
+ Qed.
+
+ End M.
+
+ (* Checks that Compare and List are loaded *)
+ Check Compare.le_decide.
+ Check Min.min.
+
+
+ (* Checks that Compare and List are _not_ imported *)
+ Lemma th1 : le_decide = (S O).
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : min = O.
+ Reflexivity.
+ Qed.
+
+ (* It should still be the case after Import M *)
+ Import M.
+
+ Lemma th3 : le_decide = (S O).
+ Reflexivity.
+ Qed.
+
+ Lemma th4 : min = O.
+ Reflexivity.
+ Qed.
+End Test_Import.
+
+(************************************************************************)
+
+Module Test_Export.
+ Module M.
+ Export Compare. (* Exports Min as well *)
+
+ Lemma th1 : le_decide = Compare.le_decide.
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : min = Min.min.
+ Reflexivity.
+ Qed.
+
+ End M.
+
+
+ (* Checks that Compare and List are _not_ imported *)
+ Lemma th1 : le_decide = (S O).
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : min = O.
+ Reflexivity.
+ Qed.
+
+
+ (* After Import M they should be imported as well *)
+
+ Import M.
+
+ Lemma th3 : le_decide = Compare.le_decide.
+ Reflexivity.
+ Qed.
+
+ Lemma th4 : min = Min.min.
+ Reflexivity.
+ Qed.
+End Test_Export.
+
+
+(************************************************************************)
+
+Module Test_Require_Export.
+
+ Definition mult_sym:=(S O). (* from Arith/Mult *)
+ Definition plus_sym:=O. (* from Arith/Plus *)
+
+ Module M.
+ Require Export Mult. (* Exports Plus as well *)
+
+ Lemma th1 : mult_sym = Mult.mult_sym.
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : plus_sym = Plus.plus_sym.
+ Reflexivity.
+ Qed.
+
+ End M.
+
+
+ (* Checks that Mult and Plus are _not_ imported *)
+ Lemma th1 : mult_sym = (S O).
+ Reflexivity.
+ Qed.
+
+ Lemma th2 : plus_sym = O.
+ Reflexivity.
+ Qed.
+
+
+ (* After Import M they should be imported as well *)
+
+ Import M.
+
+ Lemma th3 : mult_sym = Mult.mult_sym.
+ Reflexivity.
+ Qed.
+
+ Lemma th4 : plus_sym = Plus.plus_sym.
+ Reflexivity.
+ Qed.
+
+End Test_Require_Export.
diff --git a/test-suite/success/import_mod.v b/test-suite/success/import_mod.v
new file mode 100644
index 00000000..b4a8af46
--- /dev/null
+++ b/test-suite/success/import_mod.v
@@ -0,0 +1,75 @@
+
+Definition p:=O.
+Definition m:=O.
+
+Module Test_Import.
+ Module P.
+ Definition p:=(S O).
+ End P.
+
+ Module M.
+ Import P.
+ Definition m:=p.
+ End M.
+
+ Module N.
+ Import M.
+
+ Lemma th0 : p=O.
+ Reflexivity.
+ Qed.
+
+ End N.
+
+
+ (* M and P should be closed *)
+ Lemma th1 : m=O /\ p=O.
+ Split; Reflexivity.
+ Qed.
+
+
+ Import N.
+
+ (* M and P should still be closed *)
+ Lemma th2 : m=O /\ p=O.
+ Split; Reflexivity.
+ Qed.
+End Test_Import.
+
+
+(********************************************************************)
+
+
+Module Test_Export.
+ Module P.
+ Definition p:=(S O).
+ End P.
+
+ Module M.
+ Export P.
+ Definition m:=p.
+ End M.
+
+ Module N.
+ Export M.
+
+ Lemma th0 : p=(S O).
+ Reflexivity.
+ Qed.
+
+ End N.
+
+
+ (* M and P should be closed *)
+ Lemma th1 : m=O /\ p=O.
+ Split; Reflexivity.
+ Qed.
+
+
+ Import N.
+
+ (* M and P should now be opened *)
+ Lemma th2 : m=(S O) /\ p=(S O).
+ Split; Reflexivity.
+ Qed.
+End Test_Export.
diff --git a/test-suite/success/inds_type_sec.v b/test-suite/success/inds_type_sec.v
new file mode 100644
index 00000000..a391b804
--- /dev/null
+++ b/test-suite/success/inds_type_sec.v
@@ -0,0 +1,10 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+Section S.
+Inductive T [U:Type] : Type := c : U -> (T U).
+End S.
diff --git a/test-suite/success/induct.v b/test-suite/success/induct.v
new file mode 100644
index 00000000..9ae498d2
--- /dev/null
+++ b/test-suite/success/induct.v
@@ -0,0 +1,17 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Teste des definitions inductives imbriquees *)
+
+Require PolyList.
+
+Inductive X : Set :=
+ cons1 : (list X)->X.
+
+Inductive Y : Set :=
+ cons2 : (list Y*Y)->Y.
+
diff --git a/test-suite/success/ltac.v b/test-suite/success/ltac.v
new file mode 100644
index 00000000..55aa110d
--- /dev/null
+++ b/test-suite/success/ltac.v
@@ -0,0 +1,70 @@
+(* The tactic language *)
+
+(* Submitted by Pierre Crégut *)
+(* Checks substitution of x *)
+Tactic Definition f x := Unfold x; Idtac.
+
+Lemma lem1 : (plus O O) = O.
+f plus.
+Reflexivity.
+Qed.
+
+(* Submitted by Pierre Crégut *)
+(* Check syntactic correctness *)
+Recursive Tactic Definition F x := Idtac; (G x)
+And G y := Idtac; (F y).
+
+(* Check that Match Context keeps a closure *)
+Tactic Definition U := Let a = 'I In Match Context With [ |- ? ] -> Apply a.
+
+Lemma lem2 : True.
+U.
+Qed.
+
+(* Check that Match giving non-tactic arguments are evaluated at Let-time *)
+
+Tactic Definition B :=
+ Let y = (Match Context With [ z:? |- ? ] -> z) In
+ Intro H1; Exact y.
+
+Lemma lem3 : True -> False -> True -> False.
+Intros H H0.
+B. (* y is H0 if at let-time, H1 otherwise *)
+Qed.
+
+(* Checks the matching order of hypotheses *)
+Tactic Definition Y := Match Context With [ x:?; y:? |- ? ] -> Apply x.
+Tactic Definition Z := Match Context With [ y:?; x:? |- ? ] -> Apply x.
+
+Lemma lem4 : (True->False) -> (False->False) -> False.
+Intros H H0.
+Z. (* Apply H0 *)
+Y. (* Apply H *)
+Exact I.
+Qed.
+
+(* Check backtracking *)
+Lemma back1 : (0)=(1)->(0)=(0)->(1)=(1)->(0)=(0).
+Intros; Match Context With [_:(O)=?1;_:(1)=(1)|-? ] -> Exact (refl_equal ? ?1).
+Qed.
+
+Lemma back2 : (0)=(0)->(0)=(1)->(1)=(1)->(0)=(0).
+Intros; Match Context With [_:(O)=?1;_:(1)=(1)|-? ] -> Exact (refl_equal ? ?1).
+Qed.
+
+Lemma back3 : (0)=(0)->(1)=(1)->(0)=(1)->(0)=(0).
+Intros; Match Context With [_:(O)=?1;_:(1)=(1)|-? ] -> Exact (refl_equal ? ?1).
+Qed.
+
+(* Check context binding *)
+Tactic Definition sym t := Match t With [C[?1=?2]] -> Inst C[?1=?2].
+
+Lemma sym : ~(0)=(1)->~(1)=(0).
+Intro H.
+Let t = (sym (Check H)) In Assert t.
+Exact H.
+Intro H1.
+Apply H.
+Symmetry.
+Assumption.
+Qed.
diff --git a/test-suite/success/mutual_ind.v b/test-suite/success/mutual_ind.v
new file mode 100644
index 00000000..e932f50c
--- /dev/null
+++ b/test-suite/success/mutual_ind.v
@@ -0,0 +1,41 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Definition mutuellement inductive et dependante *)
+
+Require Export PolyList.
+
+ Record signature : Type := {
+ sort : Set;
+ sort_beq : sort->sort->bool;
+ sort_beq_refl : (f:sort)true=(sort_beq f f);
+ sort_beq_eq : (f1,f2:sort)true=(sort_beq f1 f2)->f1=f2;
+ fsym :> Set;
+ fsym_type : fsym->(list sort)*sort;
+ fsym_beq : fsym->fsym->bool;
+ fsym_beq_refl : (f:fsym)true=(fsym_beq f f);
+ fsym_beq_eq : (f1,f2:fsym)true=(fsym_beq f1 f2)->f1=f2
+ }.
+
+
+ Variable F : signature.
+
+ Definition vsym := (sort F)*nat.
+
+ Definition vsym_sort := (fst (sort F) nat).
+ Definition vsym_nat := (snd (sort F) nat).
+
+
+ Mutual Inductive term : (sort F)->Set :=
+ | term_var : (v:vsym)(term (vsym_sort v))
+ | term_app : (f:F)(list_term (Fst (fsym_type F f)))
+ ->(term (Snd (fsym_type F f)))
+ with list_term : (list (sort F)) -> Set :=
+ | term_nil : (list_term (nil (sort F)))
+ | term_cons : (s:(sort F);l:(list (sort F)))
+ (term s)->(list_term l)->(list_term (cons s l)).
+
diff --git a/test-suite/success/options.v b/test-suite/success/options.v
new file mode 100644
index 00000000..9e9af4fa
--- /dev/null
+++ b/test-suite/success/options.v
@@ -0,0 +1,34 @@
+(* Check that the syntax for options works *)
+Set Implicit Arguments.
+Unset Implicit Arguments.
+Test Implicit Arguments.
+
+Set Printing Coercions.
+Unset Printing Coercions.
+Test Printing Coercions.
+
+Set Silent.
+Unset Silent.
+Test Silent.
+
+Set Printing Depth 100.
+Print Table Printing Depth.
+
+Parameter i : bool -> nat.
+Coercion i : bool >-> nat.
+Set Printing Coercion i.
+Unset Printing Coercion i.
+Test Printing Coercion i.
+
+Print Table Printing Let.
+Print Table Printing If.
+Remove Printing Let sig.
+Remove Printing If bool.
+
+Unset Printing Synth.
+Set Printing Synth.
+Test Printing Synth.
+
+Unset Printing Wildcard.
+Set Printing Wildcard.
+Test Printing Wildcard.
diff --git a/test-suite/success/refine.v b/test-suite/success/refine.v
new file mode 100644
index 00000000..ad4eed5a
--- /dev/null
+++ b/test-suite/success/refine.v
@@ -0,0 +1,30 @@
+
+(* Refine and let-in's *)
+
+Goal (EX x:nat | x=O).
+Refine let y = (plus O O) in ?.
+Exists y; Auto.
+Save test1.
+
+Goal (EX x:nat | x=O).
+Refine let y = (plus O O) in (ex_intro ? ? (plus y y) ?).
+Auto.
+Save test2.
+
+Goal nat.
+Refine let y = O in (plus O ?).
+Exact (S O).
+Save test3.
+
+(* Example submitted by Yves on coqdev *)
+
+Require PolyList.
+
+Goal (l:(list nat))l=l.
+Proof.
+Refine [l]<[l]l=l>
+ Cases l of
+ | nil => ?
+ | (cons O l0) => ?
+ | (cons (S _) l0) => ?
+ end.
diff --git a/test-suite/success/setoid_test.v b/test-suite/success/setoid_test.v
new file mode 100644
index 00000000..2d2b2af8
--- /dev/null
+++ b/test-suite/success/setoid_test.v
@@ -0,0 +1,104 @@
+Require Setoid.
+
+Parameter A : Set.
+
+Axiom eq_dec : (a,b :A) {a=b}+{~a=b}.
+
+Inductive set : Set :=
+|Empty : set
+|Add : A -> set -> set.
+
+Fixpoint In [a:A; s:set] : Prop :=
+Cases s of
+|Empty => False
+|(Add b s') => a=b \/ (In a s')
+end.
+
+Definition same [s,t:set] : Prop :=
+(a:A) (In a s) <-> (In a t).
+
+Lemma setoid_set : (Setoid_Theory set same).
+
+Unfold same; Split.
+Red; Auto.
+
+Red.
+Intros.
+Elim (H a); Auto.
+
+Intros.
+Elim (H a); Elim (H0 a).
+Split; Auto.
+Save.
+
+Add Setoid set same setoid_set.
+
+Add Morphism In : In_ext.
+Unfold same; Intros a s t H; Elim (H a); Auto.
+Save.
+
+Lemma add_aux : (s,t:set) (same s t) ->
+ (a,b:A)(In a (Add b s)) -> (In a (Add b t)).
+Unfold same; Induction 2; Intros.
+Rewrite H1.
+Simpl; Left; Reflexivity.
+
+Elim (H a).
+Intros.
+Simpl; Right.
+Apply (H2 H1).
+Save.
+
+Add Morphism Add : Add_ext.
+Split; Apply add_aux.
+Assumption.
+
+Rewrite H.
+Apply Seq_refl.
+Exact setoid_set.
+Save.
+
+Fixpoint remove [a:A; s:set] : set :=
+Cases s of
+|Empty => Empty
+|(Add b t) => Cases (eq_dec a b) of
+ |(left _) => (remove a t)
+ |(right _) => (Add b (remove a t))
+ end
+end.
+
+Lemma in_rem_not : (a:A)(s:set) ~(In a (remove a (Add a Empty))).
+
+Intros.
+Setoid_replace (remove a (Add a Empty)) with Empty.
+Unfold same.
+Split.
+Simpl.
+Intro H; Elim H.
+
+Simpl.
+Case (eq_dec a a).
+Intros e ff; Elim ff.
+
+Intros; Absurd a=a; Trivial.
+
+Auto.
+Save.
+
+Parameter P :set -> Prop.
+Parameter P_ext : (s,t:set) (same s t) -> (P s) -> (P t).
+
+Add Morphism P : P_extt.
+Exact P_ext.
+Save.
+
+Lemma test_rewrite : (a:A)(s,t:set)(same s t) -> (P (Add a s)) -> (P (Add a t)).
+Intros.
+Rewrite <- H.
+Rewrite H.
+Setoid_rewrite <- H.
+Setoid_rewrite H.
+Setoid_rewrite <- H.
+Trivial.
+Save.
+
diff --git a/test-suite/success/unfold.v b/test-suite/success/unfold.v
new file mode 100644
index 00000000..de75dfce
--- /dev/null
+++ b/test-suite/success/unfold.v
@@ -0,0 +1,15 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Test le Hint Unfold sur des var locales *)
+
+Section toto.
+Local EQ:=eq.
+Goal (EQ nat O O).
+Hints Unfold EQ.
+Auto.
+Save.
diff --git a/test-suite/success/univers.v b/test-suite/success/univers.v
new file mode 100644
index 00000000..0a4b284f
--- /dev/null
+++ b/test-suite/success/univers.v
@@ -0,0 +1,19 @@
+(* This requires cumulativity *)
+
+Definition Type2 := Type.
+Definition Type1 := Type : Type2.
+
+Lemma lem1 : (True->Type1)->Type2.
+Intro H.
+Apply H.
+Exact I.
+Qed.
+
+Lemma lem2 : (A:Type)(P:A->Type)(x:A)((y:A)(x==y)->(P y))->(P x).
+Auto.
+Qed.
+
+Lemma lem3 : (P:Prop)P.
+Intro P ; Pattern P.
+Apply lem2.
+Abort.