src/HOL/MicroJava/BV/Kildall.thy
changeset 10774 4de3a0d3ae28
parent 10661 fcd8d4e7d758
child 11175 56ab6a5ba351
equal deleted inserted replaced
10773:0deff0197496 10774:4de3a0d3ae28
    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) &