author | wenzelm |
Fri, 08 Mar 2002 16:24:06 +0100 | |
changeset 13049 | ce180e5b7fa0 |
parent 8777 | 0c1061ea7559 |
child 13187 | e5434b822a96 |
permissions | -rw-r--r-- |
4832 | 1 |
(* Title: HOL/Lex/RegSet_of_nat_DA.ML |
2 |
ID: $Id$ |
|
3 |
Author: Tobias Nipkow |
|
4 |
Copyright 1998 TUM |
|
5 |
*) |
|
6 |
||
8741
61bc5ed22b62
removal of less_SucI, le_SucI from default simpset
paulson
parents:
8442
diff
changeset
|
7 |
Addsimps [in_set_butlast_appendI, less_SucI]; |
5458
0e26af5975ba
in_set_butlast_appendI supersedes in_set_butlast_appendI1,2
paulson
parents:
5184
diff
changeset
|
8 |
AddIs [in_set_butlast_appendI]; |
4832 | 9 |
Addsimps [image_eqI]; |
10 |
||
11 |
(* Lists *) |
|
12 |
||
5069 | 13 |
Goal "(butlast xs = []) = (case xs of [] => True | y#ys => ys=[])"; |
8442
96023903c2df
case_tac now subsumes both boolean and datatype cases;
wenzelm
parents:
8423
diff
changeset
|
14 |
by (case_tac "xs" 1); |
4832 | 15 |
by (ALLGOALS Asm_simp_tac); |
16 |
qed "butlast_empty"; |
|
17 |
AddIffs [butlast_empty]; |
|
18 |
||
5069 | 19 |
Goal "x:set(butlast xs) --> xs:set xss --> x:set(butlast(concat xss))"; |
4832 | 20 |
by (induct_tac "xss" 1); |
21 |
by (Simp_tac 1); |
|
22 |
by (asm_simp_tac (simpset() addsimps [butlast_append] delsimps ball_simps) 1); |
|
23 |
by (rtac conjI 1); |
|
24 |
by (Clarify_tac 1); |
|
25 |
by (rtac conjI 1); |
|
26 |
by (Blast_tac 1); |
|
27 |
by (Clarify_tac 1); |
|
28 |
by (subgoal_tac "xs=[]" 1); |
|
29 |
by (rotate_tac ~1 1); |
|
30 |
by (Asm_full_simp_tac 1); |
|
31 |
by (Blast_tac 1); |
|
32 |
by (blast_tac (claset() addDs [in_set_butlastD]) 1); |
|
33 |
qed_spec_mp "in_set_butlast_concatI"; |
|
34 |
||
35 |
(* Regular sets *) |
|
36 |
||
37 |
(* The main lemma: |
|
38 |
how to decompose a trace into a prefix, a list of loops and a suffix. |
|
39 |
*) |
|
5069 | 40 |
Goal "!i. k : set(trace d i xs) --> (? pref mids suf. \ |
4832 | 41 |
\ xs = pref @ concat mids @ suf & \ |
42 |
\ deltas d pref i = k & (!n:set(butlast(trace d i pref)). n ~= k) & \ |
|
43 |
\ (!mid:set mids. (deltas d mid k = k) & \ |
|
44 |
\ (!n:set(butlast(trace d k mid)). n ~= k)) & \ |
|
45 |
\ (!n:set(butlast(trace d k suf)). n ~= k))"; |
|
46 |
by (induct_tac "xs" 1); |
|
47 |
by (Simp_tac 1); |
|
48 |
by (rename_tac "a as" 1); |
|
49 |
by (rtac allI 1); |
|
50 |
by (case_tac "d a i = k" 1); |
|
51 |
by (strip_tac 1); |
|
52 |
by (res_inst_tac[("x","[a]")]exI 1); |
|
53 |
by (Asm_full_simp_tac 1); |
|
54 |
by (case_tac "k : set(trace d (d a i) as)" 1); |
|
55 |
by (etac allE 1); |
|
56 |
by (etac impE 1); |
|
57 |
by (assume_tac 1); |
|
58 |
by (REPEAT(etac exE 1)); |
|
59 |
by (res_inst_tac[("x","pref#mids")]exI 1); |
|
60 |
by (res_inst_tac[("x","suf")]exI 1); |
|
61 |
by (Asm_full_simp_tac 1); |
|
62 |
by (res_inst_tac[("x","[]")]exI 1); |
|
63 |
by (res_inst_tac[("x","as")]exI 1); |
|
64 |
by (Asm_full_simp_tac 1); |
|
65 |
by (blast_tac (claset() addDs [in_set_butlastD]) 1); |
|
66 |
by (Asm_simp_tac 1); |
|
67 |
by (rtac conjI 1); |
|
68 |
by (Blast_tac 1); |
|
69 |
by (strip_tac 1); |
|
70 |
by (etac allE 1); |
|
71 |
by (etac impE 1); |
|
72 |
by (assume_tac 1); |
|
73 |
by (REPEAT(etac exE 1)); |
|
74 |
by (res_inst_tac[("x","a#pref")]exI 1); |
|
75 |
by (res_inst_tac[("x","mids")]exI 1); |
|
76 |
by (res_inst_tac[("x","suf")]exI 1); |
|
77 |
by (Asm_simp_tac 1); |
|
78 |
qed_spec_mp "decompose"; |
|
79 |
||
5069 | 80 |
Goal "!i. length(trace d i xs) = length xs"; |
4832 | 81 |
by (induct_tac "xs" 1); |
82 |
by (ALLGOALS Asm_simp_tac); |
|
83 |
qed "length_trace"; |
|
84 |
Addsimps [length_trace]; |
|
85 |
||
5069 | 86 |
Goal "!i. deltas d (xs@ys) i = deltas d ys (deltas d xs i)"; |
4832 | 87 |
by (induct_tac "xs" 1); |
88 |
by (ALLGOALS Asm_simp_tac); |
|
89 |
qed "deltas_append"; |
|
90 |
Addsimps [deltas_append]; |
|
91 |
||
5069 | 92 |
Goal "!i. trace d i (xs@ys) = trace d i xs @ trace d (deltas d xs i) ys"; |
4832 | 93 |
by (induct_tac "xs" 1); |
94 |
by (ALLGOALS Asm_simp_tac); |
|
95 |
qed "trace_append"; |
|
96 |
Addsimps [trace_append]; |
|
97 |
||
5069 | 98 |
Goal "(!xs: set xss. deltas d xs i = i) --> \ |
4832 | 99 |
\ trace d i (concat xss) = concat (map (trace d i) xss)"; |
100 |
by (induct_tac "xss" 1); |
|
101 |
by (ALLGOALS Asm_simp_tac); |
|
102 |
qed_spec_mp "trace_concat"; |
|
103 |
Addsimps [trace_concat]; |
|
104 |
||
5069 | 105 |
Goal "!i. (trace d i xs = []) = (xs = [])"; |
8442
96023903c2df
case_tac now subsumes both boolean and datatype cases;
wenzelm
parents:
8423
diff
changeset
|
106 |
by (case_tac "xs" 1); |
4832 | 107 |
by (ALLGOALS Asm_simp_tac); |
108 |
qed "trace_is_Nil"; |
|
109 |
Addsimps [trace_is_Nil]; |
|
110 |
||
5069 | 111 |
Goal "(trace d i xs = n#ns) = \ |
4832 | 112 |
\ (case xs of [] => False | y#ys => n = d y i & ns = trace d n ys)"; |
8442
96023903c2df
case_tac now subsumes both boolean and datatype cases;
wenzelm
parents:
8423
diff
changeset
|
113 |
by (case_tac "xs" 1); |
4832 | 114 |
by (ALLGOALS Asm_simp_tac); |
115 |
by (Blast_tac 1); |
|
116 |
qed_spec_mp "trace_is_Cons_conv"; |
|
117 |
Addsimps [trace_is_Cons_conv]; |
|
118 |
||
5069 | 119 |
Goal "!i. set(trace d i xs) = \ |
4832 | 120 |
\ (if xs=[] then {} else insert(deltas d xs i)(set(butlast(trace d i xs))))"; |
121 |
by (induct_tac "xs" 1); |
|
122 |
by (Simp_tac 1); |
|
123 |
by (asm_simp_tac (simpset() addsimps [insert_commute]) 1); |
|
124 |
qed "set_trace_conv"; |
|
125 |
||
5069 | 126 |
Goal |
4832 | 127 |
"(!mid:set mids. deltas d mid k = k) --> deltas d (concat mids) k = k"; |
128 |
by (induct_tac "mids" 1); |
|
129 |
by (ALLGOALS Asm_simp_tac); |
|
130 |
qed_spec_mp "deltas_concat"; |
|
131 |
Addsimps [deltas_concat]; |
|
132 |
||
8777 | 133 |
Goal "[| n < Suc k; n ~= k |] ==> n < k"; |
134 |
by (arith_tac 1); |
|
4832 | 135 |
val lemma = result(); |
136 |
||
5069 | 137 |
Goal |
4832 | 138 |
"!i j xs. xs : regset d i j k = \ |
139 |
\ ((!n:set(butlast(trace d i xs)). n < k) & deltas d xs i = j)"; |
|
140 |
by (induct_tac "k" 1); |
|
5184 | 141 |
by (simp_tac (simpset() addcongs [conj_cong] addsplits [list.split]) 1); |
4832 | 142 |
by (strip_tac 1); |
143 |
by (asm_simp_tac (simpset() addsimps [conc_def]) 1); |
|
144 |
by (rtac iffI 1); |
|
145 |
by (etac disjE 1); |
|
146 |
by (Asm_simp_tac 1); |
|
147 |
by (REPEAT(eresolve_tac[exE,conjE] 1)); |
|
148 |
by (Asm_full_simp_tac 1); |
|
149 |
by (subgoal_tac |
|
5184 | 150 |
"(!m:set(butlast(trace d n xsb)). m < Suc n) & deltas d xsb n = n" 1); |
4832 | 151 |
by (asm_simp_tac (simpset() addsimps [set_trace_conv,butlast_append,ball_Un]) 1); |
152 |
by (etac star.induct 1); |
|
153 |
by (Simp_tac 1); |
|
154 |
by (asm_full_simp_tac (simpset() addsimps [set_trace_conv,butlast_append,ball_Un]) 1); |
|
5184 | 155 |
by (case_tac "n : set(butlast(trace d i xs))" 1); |
4832 | 156 |
by (rtac disjI1 2); |
157 |
by (blast_tac (claset() addIs [lemma]) 2); |
|
158 |
by (rtac disjI2 1); |
|
159 |
by (dtac (in_set_butlastD RS decompose) 1); |
|
160 |
by (Clarify_tac 1); |
|
161 |
by (res_inst_tac [("x","pref")] exI 1); |
|
162 |
by (Asm_full_simp_tac 1); |
|
163 |
by (rtac conjI 1); |
|
164 |
by (rtac ballI 1); |
|
165 |
by (rtac lemma 1); |
|
166 |
by (Asm_simp_tac 2); |
|
167 |
by (EVERY[dtac bspec 1, atac 2]); |
|
168 |
by (Asm_simp_tac 1); |
|
169 |
by (res_inst_tac [("x","concat mids")] exI 1); |
|
170 |
by (Simp_tac 1); |
|
171 |
by (rtac conjI 1); |
|
172 |
by (rtac concat_in_star 1); |
|
173 |
by (Asm_simp_tac 1); |
|
174 |
by (rtac ballI 1); |
|
175 |
by (rtac ballI 1); |
|
176 |
by (rtac lemma 1); |
|
177 |
by (Asm_simp_tac 2); |
|
178 |
by (EVERY[dtac bspec 1, atac 2]); |
|
179 |
by (asm_simp_tac (simpset() addsimps [image_eqI,in_set_butlast_concatI]) 1); |
|
180 |
by (rtac ballI 1); |
|
181 |
by (rtac lemma 1); |
|
5521 | 182 |
by (Auto_tac); |
4832 | 183 |
qed_spec_mp "regset_spec"; |
184 |
||
5069 | 185 |
Goalw [bounded_def] |
5118 | 186 |
"bounded d k ==> !i. i < k --> (!n:set(trace d i xs). n < k)"; |
4832 | 187 |
by (induct_tac "xs" 1); |
188 |
by (ALLGOALS Simp_tac); |
|
189 |
by (Blast_tac 1); |
|
190 |
qed_spec_mp "trace_below"; |
|
191 |
||
5118 | 192 |
Goal "[| bounded d k; i < k; j < k |] ==> \ |
193 |
\ regset d i j k = {xs. deltas d xs i = j}"; |
|
4832 | 194 |
by (rtac set_ext 1); |
195 |
by (simp_tac (simpset() addsimps [regset_spec]) 1); |
|
196 |
by (blast_tac (claset() addDs [trace_below,in_set_butlastD]) 1); |
|
197 |
qed "regset_below"; |
|
198 |
||
5069 | 199 |
Goalw [bounded_def] |
5118 | 200 |
"bounded d k ==> !i. i < k --> deltas d w i < k"; |
4832 | 201 |
by (induct_tac "w" 1); |
202 |
by (ALLGOALS Simp_tac); |
|
203 |
by (Blast_tac 1); |
|
204 |
qed_spec_mp "deltas_below"; |
|
205 |
||
5069 | 206 |
Goalw [regset_of_DA_def] |
5118 | 207 |
"[| bounded (next A) k; start A < k; j < k |] ==> \ |
208 |
\ w : regset_of_DA A k = accepts A w"; |
|
5132 | 209 |
by (asm_simp_tac (simpset() addcongs [conj_cong] addsimps |
4832 | 210 |
[regset_below,deltas_below,accepts_def,delta_def]) 1); |
211 |
qed "regset_DA_equiv"; |