src/ZF/UNITY/ListPlus.ML
author kleing
Tue, 13 May 2003 08:59:21 +0200
changeset 14024 213dcc39358f
parent 13339 0f89104dd377
permissions -rw-r--r--
HOL-Real -> HOL-Complex
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12197
d9320fb0a570 New files
ehmety
parents:
diff changeset
     1
(*  Title:      ZF/UNITY/ListPlus.ML
d9320fb0a570 New files
ehmety
parents:
diff changeset
     2
    ID:         $Id$
d9320fb0a570 New files
ehmety
parents:
diff changeset
     3
    Author:     Sidi O Ehmety, Cambridge University Computer Laboratory
d9320fb0a570 New files
ehmety
parents:
diff changeset
     4
    Copyright   2001  University of Cambridge
d9320fb0a570 New files
ehmety
parents:
diff changeset
     5
d9320fb0a570 New files
ehmety
parents:
diff changeset
     6
More about lists 
d9320fb0a570 New files
ehmety
parents:
diff changeset
     7
d9320fb0a570 New files
ehmety
parents:
diff changeset
     8
*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
     9
d9320fb0a570 New files
ehmety
parents:
diff changeset
    10
(*** more theorems about lists ***)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    11
d9320fb0a570 New files
ehmety
parents:
diff changeset
    12
(** td and tl **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    13
d9320fb0a570 New files
ehmety
parents:
diff changeset
    14
(** length **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    15
d9320fb0a570 New files
ehmety
parents:
diff changeset
    16
Goal "xs:list(A) ==> length(xs)=0 <-> xs=Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    17
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    18
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    19
qed "length_is_0_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    20
Addsimps [length_is_0_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    21
d9320fb0a570 New files
ehmety
parents:
diff changeset
    22
Goal "xs:list(A) ==> 0 = length(xs) <-> xs=Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    23
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    24
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    25
qed "length_is_0_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    26
Addsimps [length_is_0_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    27
d9320fb0a570 New files
ehmety
parents:
diff changeset
    28
Goal "xs:list(A) ==> length(tl(xs)) = length(xs) #- 1";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    29
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    30
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    31
qed "length_tl";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    32
Addsimps [length_tl];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    33
d9320fb0a570 New files
ehmety
parents:
diff changeset
    34
Goal "xs:list(A) ==> 0<length(xs) <-> xs ~= Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    35
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    36
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    37
qed "length_greater_0_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    38
d9320fb0a570 New files
ehmety
parents:
diff changeset
    39
Goal "xs:list(A) ==> length(xs)=succ(n) <-> (EX y ys. xs=Cons(y, ys) & length(ys)=n)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    40
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    41
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    42
qed "length_succ_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    43
d9320fb0a570 New files
ehmety
parents:
diff changeset
    44
(** more theorems about append **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    45
Goal "xs:list(A) ==> (xs@ys = Nil) <-> (xs=Nil & ys = Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    46
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    47
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    48
qed "append_is_Nil_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    49
Addsimps [append_is_Nil_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    50
d9320fb0a570 New files
ehmety
parents:
diff changeset
    51
Goal "xs:list(A) ==> (Nil = xs@ys) <-> (xs=Nil & ys = Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    52
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    53
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    54
qed "append_is_Nil_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    55
Addsimps [append_is_Nil_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    56
d9320fb0a570 New files
ehmety
parents:
diff changeset
    57
Goal "xs:list(A) ==> (xs@ys = xs) <-> (ys = Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    58
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    59
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    60
qed "append_left_is_self_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    61
Addsimps [append_left_is_self_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    62
d9320fb0a570 New files
ehmety
parents:
diff changeset
    63
Goal "xs:list(A) ==> (xs = xs@ys) <-> (ys = Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    64
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    65
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    66
qed "append_left_is_self_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    67
Addsimps [append_left_is_self_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    68
d9320fb0a570 New files
ehmety
parents:
diff changeset
    69
Goal "[| xs:list(A); ys:list(A); zs:list(A) |] ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    70
\  length(ys)=length(zs) --> (xs@ys=zs <-> (xs=Nil & ys=zs))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    71
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    72
by (auto_tac (claset(), simpset() addsimps [length_app, length_type]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    73
qed_spec_mp "append_left_is_Nil_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    74
Addsimps [append_left_is_Nil_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    75
d9320fb0a570 New files
ehmety
parents:
diff changeset
    76
Goal "[| xs:list(A); ys:list(A); zs:list(A) |] ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    77
\  length(ys)=length(zs) --> (zs=ys@xs <-> (xs=Nil & ys=zs))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    78
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    79
by (auto_tac (claset(), simpset() addsimps [length_app, length_type]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    80
qed_spec_mp "append_left_is_Nil_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    81
Addsimps [append_left_is_Nil_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    82
d9320fb0a570 New files
ehmety
parents:
diff changeset
    83
Goal "xs:list(A) ==> ALL ys:list(A). \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    84
\     length(xs)=length(ys) --> (xs@us = ys@vs) <-> (xs=ys & us=vs)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    85
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    86
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    87
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    88
by (eres_inst_tac [("a", "ys")] list.elim 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    89
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    90
qed_spec_mp "append_eq_append_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    91
d9320fb0a570 New files
ehmety
parents:
diff changeset
    92
d9320fb0a570 New files
ehmety
parents:
diff changeset
    93
Goal "xs:list(A) ==>  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    94
\  ALL ys:list(A). ALL us:list(A). ALL vs:list(A). \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    95
\  length(us) = length(vs) --> (xs@us = ys@vs) --> (xs=ys & us=vs)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    96
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    97
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    98
by (asm_full_simp_tac (simpset() addsimps [length_type, length_app]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    99
by (eres_inst_tac [("a", "ys")] list.elim 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   100
by (Asm_full_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   101
by (subgoal_tac "Cons(a, l) @ us =vs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   102
by (dtac (rotate_prems 4 (append_left_is_Nil_iff RS iffD1)) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   103
by (ALLGOALS(asm_full_simp_tac (simpset() addsimps [length_type])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   104
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   105
qed_spec_mp "append_eq_append";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   106
d9320fb0a570 New files
ehmety
parents:
diff changeset
   107
Goal "[| xs:list(A); ys:list(A); us:list(A); vs:list(A); length(us)=length(vs) |] \ 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   108
\ ==>  xs@us = ys@vs <-> (xs=ys & us=vs)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   109
by (rtac iffI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   110
by (rtac append_eq_append 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   111
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   112
qed "append_eq_append_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   113
Addsimps [append_eq_append_iff, append_eq_append_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   114
d9320fb0a570 New files
ehmety
parents:
diff changeset
   115
Goal "[| xs:list(A); ys:list(A); zs:list(A) |] ==> xs@ys=xs@zs <-> ys=zs";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   116
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   117
qed "append_self_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   118
Addsimps [append_self_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   119
d9320fb0a570 New files
ehmety
parents:
diff changeset
   120
Goal "[| xs:list(A); ys:list(A); zs:list(A) |] ==> ys@xs=zs@xs <-> ys=zs";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   121
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   122
qed "append_self_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   123
Addsimps [append_self_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   124
d9320fb0a570 New files
ehmety
parents:
diff changeset
   125
(* Can also be proved from append_eq_append_iff2 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   126
   if we add two more hypotheses x:A and y:A *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   127
Goal "xs:list(A) ==> ALL ys:list(A). xs@[x] = ys@[y] <-> (xs = ys & x=y)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   128
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   129
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   130
by (ALLGOALS(eres_inst_tac [("a", "ys")] list.elim));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   131
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   132
qed_spec_mp "append1_eq_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   133
Addsimps [append1_eq_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   134
d9320fb0a570 New files
ehmety
parents:
diff changeset
   135
Goal "[| xs:list(A); ys:list(A) |] ==> (xs@ys = ys) <-> (xs=Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   136
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   137
qed "append_right_is_self_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   138
Addsimps [append_right_is_self_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   139
d9320fb0a570 New files
ehmety
parents:
diff changeset
   140
Goal "[| xs:list(A); ys:list(A) |] ==> (ys = xs@ys) <-> (xs=Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   141
by (rtac iffI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   142
by (dtac sym 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   143
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   144
qed "append_right_is_self_iff2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   145
Addsimps [append_right_is_self_iff2];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   146
d9320fb0a570 New files
ehmety
parents:
diff changeset
   147
Goal "xs:list(A) ==> xs ~= Nil --> hd(xs @ ys) = hd(xs)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   148
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   149
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   150
qed_spec_mp "hd_append";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   151
Addsimps [hd_append];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   152
d9320fb0a570 New files
ehmety
parents:
diff changeset
   153
Goal "xs:list(A) ==> xs~=Nil --> tl(xs @ ys) = tl(xs)@ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   154
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   155
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   156
qed_spec_mp "tl_append";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   157
Addsimps [tl_append];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   158
d9320fb0a570 New files
ehmety
parents:
diff changeset
   159
(** rev **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   160
Goal "xs:list(A) ==> (rev(xs) = Nil <-> xs = Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   161
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   162
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   163
qed "rev_is_Nil_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   164
Addsimps [rev_is_Nil_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   165
d9320fb0a570 New files
ehmety
parents:
diff changeset
   166
Goal "xs:list(A) ==> (Nil = rev(xs) <-> xs = Nil)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   167
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   168
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   169
qed "Nil_is_rev_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   170
Addsimps [Nil_is_rev_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   171
d9320fb0a570 New files
ehmety
parents:
diff changeset
   172
Goal "xs:list(A) ==> ALL ys:list(A). rev(xs)=rev(ys) <-> xs=ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   173
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   174
by (Force_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   175
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   176
by (eres_inst_tac [("a", "ys")] list.elim 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   177
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   178
qed_spec_mp "rev_is_rev_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   179
Addsimps [rev_is_rev_iff];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   180
d9320fb0a570 New files
ehmety
parents:
diff changeset
   181
Goal "xs:list(A) ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   182
\ (xs=Nil --> P) --> (ALL ys:list(A). ALL y:A. xs =ys@[y] -->P)-->P";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   183
by (etac list_append_induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   184
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   185
qed_spec_mp "rev_list_elim_aux";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   186
d9320fb0a570 New files
ehmety
parents:
diff changeset
   187
bind_thm("rev_list_elim", impI RS ballI RS ballI RSN(3, rev_list_elim_aux));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   188
d9320fb0a570 New files
ehmety
parents:
diff changeset
   189
(** more theorems about drop **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   190
Goal "n:nat ==> ALL xs:list(A). length(drop(n, xs)) = length(xs) #- n";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   191
by (etac nat_induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   192
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   193
by (etac list.elim 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   194
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   195
qed_spec_mp "length_drop";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   196
Addsimps [length_drop];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   197
d9320fb0a570 New files
ehmety
parents:
diff changeset
   198
Goal "n:nat ==> ALL xs:list(A). length(xs) le n --> drop(n, xs)=Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   199
by (etac nat_induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   200
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   201
by (etac list.elim 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   202
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   203
qed_spec_mp "drop_all";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   204
Addsimps [drop_all];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   205
d9320fb0a570 New files
ehmety
parents:
diff changeset
   206
(** take **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   207
d9320fb0a570 New files
ehmety
parents:
diff changeset
   208
Goalw [take_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   209
 "xs:list(A) ==> take(0, xs) =  Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   210
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   211
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   212
qed "take_0";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   213
Addsimps [take_0];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   214
d9320fb0a570 New files
ehmety
parents:
diff changeset
   215
Goalw [take_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   216
"n:nat ==> take(succ(n), Cons(a, xs)) = Cons(a, take(n, xs))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   217
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   218
qed "take_succ_Cons";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   219
Addsimps [take_succ_Cons];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   220
d9320fb0a570 New files
ehmety
parents:
diff changeset
   221
(* Needed for proving take_all *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   222
Goalw [take_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   223
 "n:nat ==> take(n, Nil) = Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   224
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   225
qed "take_Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   226
Addsimps [take_Nil];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   227
 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   228
Goal "n:nat ==> ALL xs:list(A). length(xs) le n  --> take(n, xs) = xs";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   229
by (etac nat_induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   230
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   231
by (etac list.elim 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   232
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   233
qed_spec_mp  "take_all";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   234
Addsimps [take_all];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   235
d9320fb0a570 New files
ehmety
parents:
diff changeset
   236
Goal "xs:list(A) ==> ALL n:nat. take(n, xs):list(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   237
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   238
by (Clarify_tac 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   239
by (etac natE 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   240
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   241
qed_spec_mp "take_type";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   242
d9320fb0a570 New files
ehmety
parents:
diff changeset
   243
Goal "xs:list(A) ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   244
\ ALL ys:list(A). ALL n:nat. take(n, xs @ ys) = \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   245
\                           take(n, xs) @ take(n #- length(xs), ys)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   246
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   247
by (Clarify_tac 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   248
by (etac natE 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   249
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   250
qed_spec_mp "take_append";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   251
Addsimps [take_append];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   252
d9320fb0a570 New files
ehmety
parents:
diff changeset
   253
(** nth **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   254
d9320fb0a570 New files
ehmety
parents:
diff changeset
   255
Goalw [nth_def] "nth(0, Cons(a, l))= a";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   256
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   257
qed "nth_0";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   258
AddIffs [nth_0];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   259
d9320fb0a570 New files
ehmety
parents:
diff changeset
   260
Goalw [nth_def]  
d9320fb0a570 New files
ehmety
parents:
diff changeset
   261
   "n:nat ==> nth(succ(n), Cons(a, l)) = nth(n, l)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   262
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   263
qed "nth_Cons";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   264
Addsimps [nth_Cons];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   265
d9320fb0a570 New files
ehmety
parents:
diff changeset
   266
Goal "xs:list(A) ==> ALL n:nat. n < length(xs) --> nth(n, xs):A";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   267
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   268
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   269
by (etac natE 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   270
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   271
qed_spec_mp "nth_type";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   272
d9320fb0a570 New files
ehmety
parents:
diff changeset
   273
Goal 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   274
"xs:list(A) ==> ALL n:nat. \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   275
\ nth(n, xs @ ys) = (if n < length(xs) then nth(n,xs) \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   276
\                      else nth(n #- length(xs),ys))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   277
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   278
by (Clarify_tac 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   279
by (etac natE 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   280
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   281
qed_spec_mp "nth_append";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   282
d9320fb0a570 New files
ehmety
parents:
diff changeset
   283
(* Other theorems about lists *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   284
d9320fb0a570 New files
ehmety
parents:
diff changeset
   285
Goal "xs:list(A) ==> (xs~=Nil) <-> (EX y:A. EX ys:list(A). xs=Cons(y,ys))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   286
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   287
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   288
qed "neq_Nil_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   289
d9320fb0a570 New files
ehmety
parents:
diff changeset
   290
Goalw [Ball_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   291
 "k:nat ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   292
\ ALL xs:list(A). (ALL ys:list(A). k le length(xs) --> k le length(ys) -->  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   293
\     (ALL i:nat. i < k --> nth(i,xs)= nth(i,ys))--> take(k, xs) = take(k,ys))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   294
by (induct_tac "k" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   295
by (ALLGOALS (asm_simp_tac (simpset() addsimps 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   296
             [lt_succ_eq_0_disj, all_conj_distrib])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   297
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   298
(*Both lists must be non-empty*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   299
by (case_tac "xa=Nil" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   300
by (case_tac "xb=Nil" 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   301
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   302
by (ALLGOALS(asm_full_simp_tac (simpset() addsimps [neq_Nil_iff])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   303
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   304
(*prenexing's needed, not miniscoping*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   305
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   306
by (rtac conjI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   307
by (Force_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   308
by (ALLGOALS (full_simp_tac (simpset() addsimps (all_simps RL [iff_sym])  
d9320fb0a570 New files
ehmety
parents:
diff changeset
   309
                                       delsimps (all_simps))));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   310
by (dres_inst_tac [("x", "ys"), ("x1", "ysa")] (spec RS spec) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   311
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   312
qed_spec_mp "nth_take_lemma";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   313
d9320fb0a570 New files
ehmety
parents:
diff changeset
   314
Goal "[| xs:list(A); ys:list(A); length(xs) = length(ys);  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   315
\        ALL i:nat. i < length(xs) --> nth(i,xs) = nth(i,ys) |]  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   316
\     ==> xs = ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   317
by (subgoal_tac "length(xs) le length(ys)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   318
by (forw_inst_tac [("ys", "ys")] (rotate_prems 1 nth_take_lemma) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   319
by (ALLGOALS(Asm_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   320
by (ALLGOALS (asm_full_simp_tac (simpset() addsimps [take_all])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   321
qed_spec_mp "nth_equalityI";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   322
d9320fb0a570 New files
ehmety
parents:
diff changeset
   323
(*The famous take-lemma*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   324
d9320fb0a570 New files
ehmety
parents:
diff changeset
   325
Goal "[| xs:list(A); ys:list(A); (ALL i:nat. take(i, xs) = take(i,ys)) |] ==> xs = ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   326
by (case_tac "length(xs) le length(ys)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   327
by (dres_inst_tac [("x", "length(ys)")] bspec 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   328
by (dtac not_lt_imp_le 3);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   329
by (subgoal_tac "length(ys) le length(xs)" 5);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   330
by (res_inst_tac [("j", "succ(length(ys))")] le_trans 6);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   331
by (rtac leI 6);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   332
by (dres_inst_tac [("x", "length(xs)")] bspec 5);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   333
by (ALLGOALS(asm_full_simp_tac (simpset() addsimps [length_type,take_all])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   334
qed_spec_mp "take_equalityI";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   335
d9320fb0a570 New files
ehmety
parents:
diff changeset
   336
(** More on lists **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   337
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12197
diff changeset
   338
Goal "n:nat ==> ALL i:nat. ALL xs:list(A). n #+ i le length(xs) \
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12197
diff changeset
   339
\               --> nth(i, drop(n, xs)) = nth(n #+ i, xs)";
12197
d9320fb0a570 New files
ehmety
parents:
diff changeset
   340
by (induct_tac "n" 1);
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12197
diff changeset
   341
by (Asm_full_simp_tac 1);
12197
d9320fb0a570 New files
ehmety
parents:
diff changeset
   342
by (Clarify_tac 1);
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12197
diff changeset
   343
by (etac list.elim 1);
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12197
diff changeset
   344
by Auto_tac;  
12197
d9320fb0a570 New files
ehmety
parents:
diff changeset
   345
qed_spec_mp "nth_drop";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   346
d9320fb0a570 New files
ehmety
parents:
diff changeset
   347
d9320fb0a570 New files
ehmety
parents:
diff changeset
   348
d9320fb0a570 New files
ehmety
parents:
diff changeset
   349