src/HOLCF/IOA/meta_theory/ShortExecutions.thy
changeset 19741 f65265d71426
parent 17256 526ff7cfd6ea
child 25135 4f8176c940cf
equal deleted inserted replaced
19740:6b38551d0798 19741:f65265d71426
    55   "LastActExtsch A sch ==> LastActExtsch A (TL$(Dropwhile P$sch))"
    55   "LastActExtsch A sch ==> LastActExtsch A (TL$(Dropwhile P$sch))"
    56 
    56 
    57 LastActExtsmall2:
    57 LastActExtsmall2:
    58   "[| Finite sch1; LastActExtsch A (sch1 @@ sch2) |] ==> LastActExtsch A sch2"
    58   "[| Finite sch1; LastActExtsch A (sch1 @@ sch2) |] ==> LastActExtsch A sch2"
    59 
    59 
    60 ML {* use_legacy_bindings (the_context ()) *}
    60 
       
    61 
       
    62 ML {*
       
    63 fun thin_tac' j =
       
    64   rotate_tac (j - 1) THEN'
       
    65   etac thin_rl THEN'
       
    66   rotate_tac (~ (j - 1))
       
    67 *}
       
    68 
       
    69 
       
    70 subsection "oraclebuild rewrite rules"
       
    71 
       
    72 
       
    73 lemma oraclebuild_unfold:
       
    74 "oraclebuild P = (LAM s t. case t of 
       
    75        nil => nil
       
    76     | x##xs => 
       
    77       (case x of
       
    78         UU => UU
       
    79       | Def y => (Takewhile (%a.~ P a)$s)
       
    80                   @@ (y>>(oraclebuild P$(TL$(Dropwhile (%a.~ P a)$s))$xs))
       
    81       )
       
    82     )"
       
    83 apply (rule trans)
       
    84 apply (rule fix_eq2)
       
    85 apply (rule oraclebuild_def)
       
    86 apply (rule beta_cfun)
       
    87 apply simp
       
    88 done
       
    89 
       
    90 lemma oraclebuild_UU: "oraclebuild P$sch$UU = UU"
       
    91 apply (subst oraclebuild_unfold)
       
    92 apply simp
       
    93 done
       
    94 
       
    95 lemma oraclebuild_nil: "oraclebuild P$sch$nil = nil"
       
    96 apply (subst oraclebuild_unfold)
       
    97 apply simp
       
    98 done
       
    99 
       
   100 lemma oraclebuild_cons: "oraclebuild P$s$(x>>t) =  
       
   101           (Takewhile (%a.~ P a)$s)    
       
   102            @@ (x>>(oraclebuild P$(TL$(Dropwhile (%a.~ P a)$s))$t))"
       
   103 apply (rule trans)
       
   104 apply (subst oraclebuild_unfold)
       
   105 apply (simp add: Consq_def)
       
   106 apply (simp add: Consq_def)
       
   107 done
       
   108 
       
   109 
       
   110 subsection "Cut rewrite rules"
       
   111 
       
   112 lemma Cut_nil: 
       
   113 "[| Forall (%a.~ P a) s; Finite s|]  
       
   114             ==> Cut P s =nil"
       
   115 apply (unfold Cut_def)
       
   116 apply (subgoal_tac "Filter P$s = nil")
       
   117 apply (simp (no_asm_simp) add: oraclebuild_nil)
       
   118 apply (rule ForallQFilterPnil)
       
   119 apply assumption+
       
   120 done
       
   121 
       
   122 lemma Cut_UU: 
       
   123 "[| Forall (%a.~ P a) s; ~Finite s|]  
       
   124             ==> Cut P s =UU"
       
   125 apply (unfold Cut_def)
       
   126 apply (subgoal_tac "Filter P$s= UU")
       
   127 apply (simp (no_asm_simp) add: oraclebuild_UU)
       
   128 apply (rule ForallQFilterPUU)
       
   129 apply assumption+
       
   130 done
       
   131 
       
   132 lemma Cut_Cons: 
       
   133 "[| P t;  Forall (%x.~ P x) ss; Finite ss|]  
       
   134             ==> Cut P (ss @@ (t>> rs))  
       
   135                  = ss @@ (t >> Cut P rs)"
       
   136 apply (unfold Cut_def)
       
   137 apply (simp add: ForallQFilterPnil oraclebuild_cons TakewhileConc DropwhileConc)
       
   138 done
       
   139 
       
   140 
       
   141 subsection "Cut lemmas for main theorem"
       
   142 
       
   143 lemma FilterCut: "Filter P$s = Filter P$(Cut P s)"
       
   144 apply (rule_tac A1 = "%x. True" and Q1 = "%x.~ P x" and x1 = "s" in take_lemma_induct [THEN mp])
       
   145 prefer 3 apply (fast)
       
   146 apply (case_tac "Finite s")
       
   147 apply (simp add: Cut_nil ForallQFilterPnil)
       
   148 apply (simp add: Cut_UU ForallQFilterPUU)
       
   149 (* main case *)
       
   150 apply (simp add: Cut_Cons ForallQFilterPnil)
       
   151 done
       
   152 
       
   153 
       
   154 lemma Cut_idemp: "Cut P (Cut P s) = (Cut P s)"
       
   155 apply (rule_tac A1 = "%x. True" and Q1 = "%x.~ P x" and x1 = "s" in
       
   156   take_lemma_less_induct [THEN mp])
       
   157 prefer 3 apply (fast)
       
   158 apply (case_tac "Finite s")
       
   159 apply (simp add: Cut_nil ForallQFilterPnil)
       
   160 apply (simp add: Cut_UU ForallQFilterPUU)
       
   161 (* main case *)
       
   162 apply (simp add: Cut_Cons ForallQFilterPnil)
       
   163 apply (rule take_reduction)
       
   164 apply auto
       
   165 done
       
   166 
       
   167 
       
   168 lemma MapCut: "Map f$(Cut (P o f) s) = Cut P (Map f$s)"
       
   169 apply (rule_tac A1 = "%x. True" and Q1 = "%x.~ P (f x) " and x1 = "s" in
       
   170   take_lemma_less_induct [THEN mp])
       
   171 prefer 3 apply (fast)
       
   172 apply (case_tac "Finite s")
       
   173 apply (simp add: Cut_nil)
       
   174 apply (rule Cut_nil [symmetric])
       
   175 apply (simp add: ForallMap o_def)
       
   176 apply (simp add: Map2Finite)
       
   177 (* csae ~ Finite s *)
       
   178 apply (simp add: Cut_UU)
       
   179 apply (rule Cut_UU)
       
   180 apply (simp add: ForallMap o_def)
       
   181 apply (simp add: Map2Finite)
       
   182 (* main case *)
       
   183 apply (simp add: Cut_Cons MapConc ForallMap FiniteMap1 o_def)
       
   184 apply (rule take_reduction)
       
   185 apply auto
       
   186 done
       
   187 
       
   188 
       
   189 lemma Cut_prefixcl_nFinite [rule_format (no_asm)]: "~Finite s --> Cut P s << s"
       
   190 apply (intro strip)
       
   191 apply (rule take_lemma_less [THEN iffD1])
       
   192 apply (intro strip)
       
   193 apply (rule mp)
       
   194 prefer 2 apply (assumption)
       
   195 apply (tactic "thin_tac' 1 1")
       
   196 apply (rule_tac x = "s" in spec)
       
   197 apply (rule nat_less_induct)
       
   198 apply (intro strip)
       
   199 apply (rename_tac na n s)
       
   200 apply (case_tac "Forall (%x. ~ P x) s")
       
   201 apply (rule take_lemma_less [THEN iffD2, THEN spec])
       
   202 apply (simp add: Cut_UU)
       
   203 (* main case *)
       
   204 apply (drule divide_Seq3)
       
   205 apply (erule exE)+
       
   206 apply (erule conjE)+
       
   207 apply hypsubst
       
   208 apply (simp add: Cut_Cons)
       
   209 apply (rule take_reduction_less)
       
   210 (* auto makes also reasoning about Finiteness of parts of s ! *)
       
   211 apply auto
       
   212 done
       
   213 
       
   214 
       
   215 lemma execThruCut: "!!ex .is_exec_frag A (s,ex) ==> is_exec_frag A (s,Cut P ex)"
       
   216 apply (case_tac "Finite ex")
       
   217 apply (cut_tac s = "ex" and P = "P" in Cut_prefixcl_Finite)
       
   218 apply assumption
       
   219 apply (erule exE)
       
   220 apply (rule exec_prefix2closed)
       
   221 apply (erule_tac s = "ex" and t = "Cut P ex @@ y" in subst)
       
   222 apply assumption
       
   223 apply (erule exec_prefixclosed)
       
   224 apply (erule Cut_prefixcl_nFinite)
       
   225 done
       
   226 
       
   227 
       
   228 subsection "Main Cut Theorem"
       
   229 
       
   230 lemma exists_LastActExtsch: 
       
   231  "[|sch : schedules A ; tr = Filter (%a. a:ext A)$sch|]  
       
   232     ==> ? sch. sch : schedules A &  
       
   233                tr = Filter (%a. a:ext A)$sch & 
       
   234                LastActExtsch A sch"
       
   235 
       
   236 apply (unfold schedules_def has_schedule_def)
       
   237 apply (tactic "safe_tac set_cs")
       
   238 apply (rule_tac x = "filter_act$ (Cut (%a. fst a:ext A) (snd ex))" in exI)
       
   239 apply (simp add: executions_def)
       
   240 apply (tactic {* pair_tac "ex" 1 *})
       
   241 apply (tactic "safe_tac set_cs")
       
   242 apply (rule_tac x = " (x,Cut (%a. fst a:ext A) y) " in exI)
       
   243 apply (simp (no_asm_simp))
       
   244 
       
   245 (* Subgoal 1: Lemma:  propagation of execution through Cut *)
       
   246 
       
   247 apply (simp add: execThruCut)
       
   248 
       
   249 (* Subgoal 2:  Lemma:  Filter P s = Filter P (Cut P s) *)
       
   250 
       
   251 apply (simp (no_asm) add: filter_act_def)
       
   252 apply (subgoal_tac "Map fst$ (Cut (%a. fst a: ext A) y) = Cut (%a. a:ext A) (Map fst$y) ")
       
   253 
       
   254 apply (rule_tac [2] MapCut [unfolded o_def])
       
   255 apply (simp add: FilterCut [symmetric])
       
   256 
       
   257 (* Subgoal 3: Lemma: Cut idempotent  *)
       
   258 
       
   259 apply (simp (no_asm) add: LastActExtsch_def filter_act_def)
       
   260 apply (subgoal_tac "Map fst$ (Cut (%a. fst a: ext A) y) = Cut (%a. a:ext A) (Map fst$y) ")
       
   261 apply (rule_tac [2] MapCut [unfolded o_def])
       
   262 apply (simp add: Cut_idemp)
       
   263 done
       
   264 
       
   265 
       
   266 subsection "Further Cut lemmas"
       
   267 
       
   268 lemma LastActExtimplnil: 
       
   269   "[| LastActExtsch A sch; Filter (%x. x:ext A)$sch = nil |]  
       
   270     ==> sch=nil"
       
   271 apply (unfold LastActExtsch_def)
       
   272 apply (drule FilternPnilForallP)
       
   273 apply (erule conjE)
       
   274 apply (drule Cut_nil)
       
   275 apply assumption
       
   276 apply simp
       
   277 done
       
   278 
       
   279 lemma LastActExtimplUU: 
       
   280   "[| LastActExtsch A sch; Filter (%x. x:ext A)$sch = UU |]  
       
   281     ==> sch=UU"
       
   282 apply (unfold LastActExtsch_def)
       
   283 apply (drule FilternPUUForallP)
       
   284 apply (erule conjE)
       
   285 apply (drule Cut_UU)
       
   286 apply assumption
       
   287 apply simp
       
   288 done
    61 
   289 
    62 end
   290 end