57 primrec |
57 primrec |
58 "merges f s [] ss = ss" |
58 "merges f s [] ss = ss" |
59 "merges f s (p#ps) ss = merges f s ps (ss[p := s +_f ss!p])" |
59 "merges f s (p#ps) ss = merges f s ps (ss[p := s +_f ss!p])" |
60 |
60 |
61 |
61 |
62 lemmas [simp] = Let_def le_iff_plus_unchanged [symmetric]; |
62 lemmas [simp] = Let_def le_iff_plus_unchanged [symmetric] |
63 |
63 |
64 |
64 |
65 lemma pres_typeD: |
65 lemma pres_typeD: |
66 "[| pres_type step n A; s:A; p<n |] ==> step p s : A" |
66 "[| pres_type step n A; s:A; p<n |] ==> step p s : A" |
67 by (unfold pres_type_def, blast) |
67 by (unfold pres_type_def, blast) |
204 apply blast |
204 apply blast |
205 done |
205 done |
206 |
206 |
207 (** iter **) |
207 (** iter **) |
208 |
208 |
209 ML_setup {* |
209 recdef_tc iter_wf: iter (1) |
210 let |
210 apply (rule wf_same_fst)+ |
211 val thy = the_context () |
211 apply (simp add: split_tupled_all lesssub_def) |
212 val [iter_wf,iter_tc] = RecdefPackage.tcs_of thy "iter"; |
212 apply (rule wf_lex_prod) |
213 in |
213 prefer 2 |
214 goalw_cterm [] (cterm_of (sign_of thy) (HOLogic.mk_Trueprop iter_wf)); |
214 apply (rule wf_finite_psubset) |
215 by (REPEAT(rtac wf_same_fst 1)); |
215 apply clarify |
216 by (split_all_tac 1); |
216 apply (drule (1) semilatDorderI [THEN acc_le_listI]) |
217 by (asm_full_simp_tac (simpset() addsimps [thm "lesssub_def"]) 1); |
217 apply (simp only: acc_def lesssub_def) |
218 by (REPEAT(rtac wf_same_fst 1)); |
218 done |
219 by (rtac wf_lex_prod 1); |
|
220 by (rtac wf_finite_psubset 2); |
|
221 by (Clarify_tac 1); |
|
222 by (dtac (thm "semilatDorderI" RS (thm "acc_le_listI")) 1); |
|
223 by (assume_tac 1); |
|
224 by (rewrite_goals_tac [thm "acc_def",thm "lesssub_def"]); |
|
225 by (assume_tac 1); |
|
226 qed "iter_wf" |
|
227 end |
|
228 *} |
|
229 |
219 |
230 lemma inter_tc_lemma: |
220 lemma inter_tc_lemma: |
231 "[| semilat(A,r,f); ss : list n A; t:A; ! q:set qs. q < n; p:w |] ==> |
221 "[| semilat(A,r,f); ss : list n A; t:A; ! q:set qs. q < n; p:w |] ==> |
232 ss <[r] merges f t qs ss | |
222 ss <[r] merges f t qs ss | |
233 merges f t qs ss = ss & {q. q:set qs & t +_f ss!q ~= ss!q} Un (w-{p}) < w" |
223 merges f t qs ss = ss & {q. q:set qs & t +_f ss!q ~= ss!q} Un (w-{p}) < w" |
241 apply (simp cong add: conj_cong add: le_iff_plus_unchanged [symmetric]) |
231 apply (simp cong add: conj_cong add: le_iff_plus_unchanged [symmetric]) |
242 apply (blast intro!: psubsetI elim: equalityE) |
232 apply (blast intro!: psubsetI elim: equalityE) |
243 apply simp |
233 apply simp |
244 done |
234 done |
245 |
235 |
246 ML_setup {* |
236 recdef_tc iter_tc: iter (2) |
247 let |
237 apply (simp add: same_fst_def pres_type_def) |
248 val thy = the_context () |
238 apply (clarify del: disjCI) |
249 val [iter_wf,iter_tc] = RecdefPackage.tcs_of thy "iter"; |
239 apply (subgoal_tac "(@p. p:w) : w") |
250 in |
240 prefer 2 |
251 goalw_cterm [] (cterm_of (sign_of thy) (HOLogic.mk_Trueprop iter_tc)); |
241 apply (fast intro: someI) |
252 by (asm_simp_tac (simpset() addsimps [same_fst_def,thm "pres_type_def"]) 1); |
242 apply (subgoal_tac "ss : list (size ss) A") |
253 by (clarify_tac (claset() delrules [disjCI]) 1); |
243 prefer 2 |
254 by (subgoal_tac "(@p. p:w) : w" 1); |
244 apply (blast intro!: listI) |
255 by (fast_tac (claset() addIs [someI]) 2); |
245 apply (subgoal_tac "!q:set(succs (@ p. p : w)). q < size ss") |
256 by (subgoal_tac "ss : list (size ss) A" 1); |
246 prefer 2 |
257 by (blast_tac (claset() addSIs [thm "listI"]) 2); |
247 apply (blast dest: boundedD) |
258 by (subgoal_tac "!q:set(succs (@ p. p : w)). q < size ss" 1); |
248 apply (rotate_tac 1) |
259 by (blast_tac (claset() addDs [thm "boundedD"]) 2); |
249 apply (simp del: listE_length |
260 by (rotate_tac 1 1); |
250 add: decomp_propa finite_psubset_def inter_tc_lemma bounded_nat_set_is_finite) |
261 by (asm_full_simp_tac (simpset() delsimps [thm "listE_length"] |
251 done |
262 addsimps [thm "decomp_propa",finite_psubset_def,thm "inter_tc_lemma", |
|
263 bounded_nat_set_is_finite]) 1); |
|
264 qed "iter_tc" |
|
265 end |
|
266 *} |
|
267 |
252 |
268 lemma iter_induct: |
253 lemma iter_induct: |
269 "(!!A r f step succs ss w. |
254 "(!!A r f step succs ss w. |
270 (!p. p = (@ p. p : w) & w ~= {} & semilat(A,r,f) & acc r & |
255 (!p. p = (@ p. p : w) & w ~= {} & semilat(A,r,f) & acc r & |
271 (!p:w. p < length ss) & bounded succs (length ss) & |
256 (!p:w. p < length ss) & bounded succs (length ss) & |