286 qed "stable_Join_ensures2"; |
286 qed "stable_Join_ensures2"; |
287 |
287 |
288 |
288 |
289 (** Diff and localTo **) |
289 (** Diff and localTo **) |
290 |
290 |
291 Goalw [Diff_def] "F Join (Diff G (Acts F)) = F Join G"; |
291 Goalw [Diff_def] "F Join (Diff UNIV G (Acts F)) = F Join G"; |
292 by (rtac program_equalityI 1); |
292 by (rtac program_equalityI 1); |
293 by Auto_tac; |
293 by Auto_tac; |
294 qed "Join_Diff2"; |
294 qed "Join_Diff2"; |
295 |
295 |
296 Goalw [Diff_def] |
296 Goalw [Diff_def] |
297 "Diff (F Join G) (Acts H) = (Diff F (Acts H)) Join (Diff G (Acts H))"; |
297 "Diff C (F Join G) (Acts H) = (Diff C F (Acts H)) Join (Diff C G (Acts H))"; |
298 by (rtac program_equalityI 1); |
298 by (rtac program_equalityI 1); |
299 by Auto_tac; |
299 by Auto_tac; |
300 qed "Diff_Join_distrib"; |
300 qed "Diff_Join_distrib"; |
301 |
301 |
302 Goalw [Diff_def, constrains_def] "(Diff F (Acts F) : A co B) = (A <= B)"; |
302 Goalw [Diff_def] "Diff C F (Acts F) = mk_program(Init F, {})"; |
303 by Auto_tac; |
303 by Auto_tac; |
304 qed "Diff_self_constrains"; |
304 qed "Diff_self_eq"; |
305 |
305 |
306 Goalw [Diff_def, Disjoint_def] "Disjoint F (Diff G (Acts F))"; |
306 Goalw [Diff_def, Disjoint_def] "Disjoint C F (Diff C G (Acts F))"; |
307 by Auto_tac; |
307 by (force_tac (claset(), |
|
308 simpset() addsimps [Restrict_imageI, |
|
309 sym RSN (2,Restrict_imageI)]) 1); |
308 qed "Diff_Disjoint"; |
310 qed "Diff_Disjoint"; |
309 |
311 |
310 Goal "[| G : v localTo F; Disjoint F G |] ==> G : stable {s. v s = z}"; |
312 Goalw [Disjoint_def] |
311 by (asm_full_simp_tac |
313 "[| A <= B; Disjoint A F G |] ==> Disjoint B F G"; |
312 (simpset() addsimps [localTo_def, Diff_def, Disjoint_def, |
314 by (blast_tac (claset() addIs [Restrict_eq_mono RSN (2,Restrict_imageI)]) 1); |
313 stable_def, constrains_def]) 1); |
315 qed "Disjoint_mono"; |
314 by (Blast_tac 1); |
316 |
315 qed "localTo_imp_stable"; |
317 (*** localTo ***) |
316 |
318 |
317 Goalw [localTo_def, stable_def, constrains_def] |
319 Goalw [LOCALTO_def, Diff_def, stable_def, constrains_def] |
318 "v localTo F <= (f o v) localTo F"; |
320 "A <= B ==> v localTo[B] F <= v localTo[A] F"; |
|
321 by Auto_tac; |
|
322 by (dres_inst_tac [("x", "v xc")] spec 1); |
|
323 by (dres_inst_tac [("x", "Restrict B xa")] bspec 1); |
|
324 by Auto_tac; |
|
325 by (blast_tac (claset() addIs [Restrict_eq_mono RSN (2,Restrict_imageI)]) 1); |
|
326 qed "localTo_anti_mono"; |
|
327 |
|
328 Goalw [LocalTo_def] |
|
329 "G : v localTo[UNIV] F ==> G : v LocalTo F"; |
|
330 by (blast_tac (claset() addDs [impOfSubs localTo_anti_mono]) 1); |
|
331 qed "localTo_imp_LocalTo"; |
|
332 |
|
333 Goalw [LOCALTO_def, stable_def, constrains_def] |
|
334 "v localTo[C] F <= (f o v) localTo[C] F"; |
319 by (Clarify_tac 1); |
335 by (Clarify_tac 1); |
320 by (force_tac (claset() addSEs [allE, ballE], simpset()) 1); |
336 by (force_tac (claset() addSEs [allE, ballE], simpset()) 1); |
321 qed "localTo_imp_o_localTo"; |
337 qed "localTo_imp_o_localTo"; |
322 |
338 |
323 Goalw [localTo_def, stable_def, constrains_def] |
339 Goalw [LOCALTO_def, stable_def, constrains_def] |
324 "(%s. x) localTo F = UNIV"; |
340 "(%s. x) localTo[C] F = UNIV"; |
325 by (Blast_tac 1); |
341 by (Blast_tac 1); |
326 qed "triv_localTo_eq_UNIV"; |
342 qed "triv_localTo_eq_UNIV"; |
327 |
343 |
328 Goal "(F Join G : v localTo H) = (F : v localTo H & G : v localTo H)"; |
344 Goal "(F Join G : v localTo[C] H) = (F : v localTo[C] H & G : v localTo[C] H)"; |
329 by (asm_full_simp_tac |
345 by (asm_full_simp_tac |
330 (simpset() addsimps [localTo_def, Diff_Join_distrib, |
346 (simpset() addsimps [LOCALTO_def, Diff_Join_distrib, |
331 stable_def, Join_constrains]) 1); |
347 stable_def, Join_constrains]) 1); |
332 by (Blast_tac 1); |
348 by (Blast_tac 1); |
333 qed "Join_localTo"; |
349 qed "Join_localTo"; |
334 |
350 |
335 Goal "F : v localTo F"; |
351 Goal "F : v localTo[C] F"; |
336 by (simp_tac |
352 by (simp_tac |
337 (simpset() addsimps [localTo_def, stable_def, Diff_self_constrains]) 1); |
353 (simpset() addsimps [LOCALTO_def, stable_def, constrains_def, |
|
354 Diff_self_eq]) 1); |
338 qed "self_localTo"; |
355 qed "self_localTo"; |
339 |
356 |
340 |
357 |
341 |
358 |
342 (*** Higher-level rules involving localTo and Join ***) |
359 (*** Higher-level rules involving localTo and Join ***) |
343 |
360 |
344 Goal "[| F : {s. P (v s)} co {s. P' (v s)}; G : v localTo F |] \ |
361 Goal "[| F : {s. P (v s)} co {s. P' (v s)}; G : v localTo[C] F |] \ |
345 \ ==> F Join G : {s. P (v s)} co {s. P' (v s)}"; |
362 \ ==> G : C Int {s. P (v s)} co {s. P' (v s)}"; |
346 by (asm_simp_tac (simpset() addsimps [Join_constrains]) 1); |
363 by (ftac constrains_imp_subset 1); |
347 by (auto_tac (claset(), |
364 by (auto_tac (claset(), |
348 simpset() addsimps [localTo_def, stable_def, constrains_def, |
365 simpset() addsimps [LOCALTO_def, stable_def, constrains_def, |
349 Diff_def])); |
366 Diff_def])); |
350 by (case_tac "act: Acts F" 1); |
367 by (case_tac "Restrict C act: Restrict C `` Acts F" 1); |
351 by (Blast_tac 1); |
368 by (blast_tac (claset() addSEs [equalityE]) 1); |
352 by (dtac bspec 1 THEN rtac Id_in_Acts 1); |
|
353 by (subgoal_tac "v x = v xa" 1); |
369 by (subgoal_tac "v x = v xa" 1); |
|
370 by (Force_tac 1); |
|
371 by (thin_tac "ALL act: ?A. ?P act" 1); |
|
372 by (dtac spec 1); |
|
373 by (dres_inst_tac [("x", "Restrict C act")] bspec 1); |
354 by Auto_tac; |
374 by Auto_tac; |
355 qed "constrains_localTo_constrains"; |
375 qed "constrains_localTo_constrains"; |
356 |
376 |
357 Goalw [localTo_def, stable_def, constrains_def, Diff_def] |
377 Goalw [LOCALTO_def, stable_def, constrains_def, Diff_def] |
358 "[| G : v localTo F; G : w localTo F |] \ |
378 "[| G : v localTo[C] F; G : w localTo[C] F |] \ |
359 \ ==> G : (%s. (v s, w s)) localTo F"; |
379 \ ==> G : (%s. (v s, w s)) localTo[C] F"; |
360 by (Blast_tac 1); |
380 by (Blast_tac 1); |
361 qed "localTo_pairfun"; |
381 qed "localTo_pairfun"; |
362 |
382 |
363 Goal "[| F : {s. P (v s) (w s)} co {s. P' (v s) (w s)}; \ |
383 Goal "[| F : {s. P (v s) (w s)} co {s. P' (v s) (w s)}; \ |
364 \ G : v localTo F; \ |
384 \ G : v localTo[C] F; \ |
365 \ G : w localTo F |] \ |
385 \ G : w localTo[C] F |] \ |
366 \ ==> F Join G : {s. P (v s) (w s)} co {s. P' (v s) (w s)}"; |
386 \ ==> G : C Int {s. P (v s) (w s)} co {s. P' (v s) (w s)}"; |
367 by (res_inst_tac [("A", "{s. (%(x,y). P x y) (v s, w s)}"), |
387 by (res_inst_tac [("A", "C Int {s. (%(x,y). P x y) (v s, w s)}"), |
368 ("A'", "{s. (%(x,y). P' x y) (v s, w s)}")] |
388 ("A'", "{s. (%(x,y). P' x y) (v s, w s)}")] |
369 constrains_weaken 1); |
389 constrains_weaken 1); |
370 by (rtac (localTo_pairfun RSN (2, constrains_localTo_constrains)) 1); |
390 by (rtac (localTo_pairfun RSN (2, constrains_localTo_constrains)) 1); |
371 by Auto_tac; |
391 by Auto_tac; |
372 qed "constrains_localTo_constrains2"; |
392 qed "constrains_localTo_constrains2"; |
373 |
393 |
|
394 (*Used just once, in Client.ML. Having F in the conclusion is silly.*) |
374 Goalw [stable_def] |
395 Goalw [stable_def] |
375 "[| F : stable {s. P (v s) (w s)}; \ |
396 "[| F : stable {s. P (v s) (w s)}; \ |
376 \ G : v localTo F; G : w localTo F |] \ |
397 \ G : v localTo[UNIV] F; G : w localTo[UNIV] F |] \ |
377 \ ==> F Join G : stable {s. P (v s) (w s)}"; |
398 \ ==> F Join G : stable {s. P (v s) (w s)}"; |
378 by (blast_tac (claset() addIs [constrains_localTo_constrains2]) 1); |
399 by (asm_simp_tac (simpset() addsimps [Join_constrains]) 1); |
|
400 by (blast_tac (claset() addIs [constrains_localTo_constrains2 RS |
|
401 constrains_weaken]) 1); |
379 qed "stable_localTo_stable2"; |
402 qed "stable_localTo_stable2"; |
380 |
403 |
|
404 (*Used just in Client.ML. Generalize to arbitrary C?*) |
381 Goal "[| F : stable {s. v s <= w s}; \ |
405 Goal "[| F : stable {s. v s <= w s}; \ |
382 \ G : v localTo F; \ |
406 \ G : v localTo[UNIV] F; \ |
383 \ F Join G : Increasing w |] \ |
407 \ F Join G : Increasing w |] \ |
384 \ ==> F Join G : Stable {s. v s <= w s}"; |
408 \ ==> F Join G : Stable {s. v s <= w s}"; |
385 by (auto_tac (claset(), |
409 by (auto_tac (claset(), |
386 simpset() addsimps [stable_def, Stable_def, Increasing_def, |
410 simpset() addsimps [stable_def, Stable_def, Increasing_def, |
387 Constrains_def, Join_constrains, all_conj_distrib])); |
411 Constrains_def, Join_constrains, all_conj_distrib])); |
388 by (blast_tac (claset() addIs [constrains_weaken]) 1); |
412 by (blast_tac (claset() addIs [constrains_weaken]) 1); |
389 (*The G case remains; proved like constrains_localTo_constrains*) |
413 (*The G case remains; proved like constrains_localTo_constrains*) |
390 by (auto_tac (claset(), |
414 by (auto_tac (claset(), |
391 simpset() addsimps [localTo_def, stable_def, constrains_def, |
415 simpset() addsimps [LOCALTO_def, stable_def, constrains_def, |
392 Diff_def])); |
416 Diff_def])); |
393 by (case_tac "act: Acts F" 1); |
417 by (case_tac "act: Acts F" 1); |
394 by (Blast_tac 1); |
418 by (Blast_tac 1); |
395 by (thin_tac "ALL act:Acts F. ?P act" 1); |
419 by (thin_tac "ALL act:Acts F. ?P act" 1); |
396 by (thin_tac "ALL z. ALL act:Acts F. ?P z act" 1); |
420 by (thin_tac "ALL z. ALL act:Acts F. ?P z act" 1); |
397 by (dres_inst_tac [("x", "v xa")] spec 1 THEN dtac bspec 1 THEN rtac DiffI 1); |
421 by (dres_inst_tac [("x", "v xa")] spec 1 THEN dtac bspec 1 THEN rtac DiffI 1); |