aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/Lists
diff options
context:
space:
mode:
authorGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2009-06-06 18:08:25 +0000
committerGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2009-06-06 18:08:25 +0000
commit2d564c9581466b58f476565eb28df7005e26f8df (patch)
treea425ce7ccccda467d709a4a9db4a1cb649a2aa44 /theories/Lists
parentec8de15f6800677b0a469f64e7ff5b6a85dee62b (diff)
Very-small-step policy changes to the library.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12166 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/Lists')
-rw-r--r--theories/Lists/List.v65
1 files changed, 39 insertions, 26 deletions
diff --git a/theories/Lists/List.v b/theories/Lists/List.v
index c873338ac..34a972347 100644
--- a/theories/Lists/List.v
+++ b/theories/Lists/List.v
@@ -178,9 +178,9 @@ Section Facts.
Defined.
- (*************************)
+ (**************************)
(** *** Facts about [app] *)
- (*************************)
+ (**************************)
(** Discrimination *)
Theorem app_cons_not_nil : forall (x y:list A) (a:A), nil <> x ++ a :: y.
@@ -193,26 +193,33 @@ Section Facts.
(** Concat with [nil] *)
+ Theorem app_nil_l : forall l:list A, nil ++ l = l.
+ Proof.
+ reflexivity.
+ Qed.
- Theorem app_nil_end : forall l:list A, l = l ++ nil.
+ Theorem app_nil_r : forall l:list A, l ++ nil = l.
Proof.
- induction l; simpl in |- *; auto.
- rewrite <- IHl; auto.
+ induction l; simpl; f_equal; auto.
Qed.
+ (* begin hide *)
+ (* Compatibility *)
+ Theorem app_nil_end : forall (l:list A), l = l ++ nil.
+ Proof. symmetry; apply app_nil_r. Qed.
+ (* end hide *)
+
(** [app] is associative *)
- Theorem app_ass : forall l m n:list A, (l ++ m) ++ n = l ++ m ++ n.
+ Theorem app_assoc : forall l m n:list A, l ++ m ++ n = (l ++ m) ++ n.
Proof.
- intros. induction l; simpl in |- *; auto.
- now_show (a :: (l ++ m) ++ n = a :: l ++ m ++ n).
- rewrite <- IHl; auto.
+ intros l m n; induction l; simpl; f_equal; auto.
Qed.
- Hint Resolve app_ass.
- Theorem ass_app : forall l m n:list A, l ++ m ++ n = (l ++ m) ++ n.
+ Theorem app_assoc_reverse : forall l m n:list A, (l ++ m) ++ n = l ++ m ++ n.
Proof.
- auto using app_ass.
+ auto using app_assoc.
Qed.
+ Hint Resolve app_assoc_reverse.
(** [app] commutes with [cons] *)
Theorem app_comm_cons : forall (x y:list A) (a:A), a :: (x ++ y) = (a :: x) ++ y.
@@ -220,8 +227,6 @@ Section Facts.
auto.
Qed.
-
-
(** Facts deduced from the result of a concatenation *)
Theorem app_eq_nil : forall l l':list A, l ++ l' = nil -> l = nil /\ l' = nil.
@@ -241,8 +246,8 @@ Section Facts.
left; split; auto.
right; split; auto.
generalize H.
- generalize (app_nil_end l); intros E.
- rewrite <- E; auto.
+ generalize (app_nil_r l); intros E.
+ rewrite -> E; auto.
intros.
injection H.
intro.
@@ -335,7 +340,7 @@ Section Facts.
End Facts.
-Hint Resolve app_nil_end ass_app app_ass: datatypes v62.
+Hint Resolve app_assoc app_assoc_reverse: datatypes v62.
Hint Resolve app_comm_cons app_cons_not_nil: datatypes v62.
Hint Immediate app_eq_nil: datatypes v62.
Hint Resolve app_eq_unit app_inj_tail: datatypes v62.
@@ -638,12 +643,12 @@ Section ListOps.
auto.
simpl in |- *.
- apply app_nil_end; auto.
+ rewrite app_nil_r; auto.
intro y.
simpl in |- *.
rewrite (IHl y).
- apply (app_ass (rev y) (rev l) (a :: nil)).
+ rewrite app_assoc; trivial.
Qed.
Remark rev_unit : forall (l:list A) (a:A), rev (l ++ a :: nil) = a :: rev l.
@@ -725,7 +730,7 @@ Section ListOps.
Lemma rev_append_rev : forall l l', rev_acc l l' = rev l ++ l'.
Proof.
induction l; simpl; auto; intros.
- rewrite <- ass_app; firstorder.
+ rewrite <- app_assoc; firstorder.
Qed.
Notation rev_acc_rev := rev_append_rev (only parsing).
@@ -733,7 +738,7 @@ Section ListOps.
Lemma rev_alt : forall l, rev l = rev_append l nil.
Proof.
intros; rewrite rev_append_rev.
- apply app_nil_end.
+ rewrite app_nil_r; trivial.
Qed.
@@ -855,9 +860,9 @@ Section ListOps.
Theorem Permutation_app_swap : forall (l l' : list A), Permutation (l++l') (l'++l).
Proof.
induction l as [|x l].
- simpl; intro l'; rewrite <- app_nil_end; trivial.
+ simpl; intro l'; rewrite app_nil_r; trivial.
induction l' as [|y l'].
- simpl; rewrite <- app_nil_end; trivial.
+ simpl; rewrite app_nil_r; trivial.
simpl; apply Permutation_trans with (l' := x :: y :: l' ++ l).
constructor; rewrite app_comm_cons; apply IHl.
apply Permutation_trans with (l' := y :: x :: l' ++ l); constructor.
@@ -990,7 +995,7 @@ Section ListOps.
forall l l1 l2, Permutation (l1 ++ l) (l2 ++ l) -> Permutation l1 l2.
Proof.
induction l.
- intros l1 l2; do 2 rewrite <- app_nil_end; auto.
+ intros l1 l2; do 2 rewrite app_nil_r; auto.
intros.
apply IHl.
apply Permutation_app_inv with a; auto.
@@ -1858,9 +1863,17 @@ Hint Rewrite
rev_length (* length (rev l) = length l *)
: list.
-Hint Rewrite <-
- app_nil_end (* l = l ++ nil *)
+Hint Rewrite ->
+ app_nil_r (* l ++ nil = l *)
: list.
Ltac simpl_list := autorewrite with list.
Ltac ssimpl_list := autorewrite with list using simpl.
+
+(* begin hide *)
+(* Compatibility *)
+Notation ass_app := app_assoc (only parsing).
+Notation app_ass := app_assoc_reverse (only parsing).
+Hint Resolve app_nil_end : datatypes v62.
+(* end hide *)
+