src/HOL/UNITY/Union.ML
changeset 7878 43b03d412b82
parent 7826 c6a8b73b6c2a
child 7915 c7fd7eb3b0ef
equal deleted inserted replaced
7877:e5e019d60f71 7878:43b03d412b82
   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);