src/HOL/UNITY/Lift_prog.ML
changeset 7537 875754b599df
parent 7525 2a75abcf30e0
child 7547 a72a551b6d79
equal deleted inserted replaced
7536:5c094aec523d 7537:875754b599df
    98 	      simpset() addsimps [SKIP_def, lift_prog_def]));
    98 	      simpset() addsimps [SKIP_def, lift_prog_def]));
    99 qed "lift_prog_SKIP";
    99 qed "lift_prog_SKIP";
   100 
   100 
   101 Goal "lift_prog i (F Join G) = (lift_prog i F) Join (lift_prog i G)";
   101 Goal "lift_prog i (F Join G) = (lift_prog i F) Join (lift_prog i G)";
   102 by (rtac program_equalityI 1);
   102 by (rtac program_equalityI 1);
   103 by (auto_tac (claset(), simpset() addsimps [Acts_Join]));
   103 by Auto_tac;
   104 qed "lift_prog_Join";
   104 qed "lift_prog_Join";
   105 
   105 
   106 Goal "lift_prog i (JOIN J F) = (JN j:J. lift_prog i (F j))";
   106 Goal "lift_prog i (JOIN J F) = (JN j:J. lift_prog i (F j))";
   107 by (rtac program_equalityI 1);
   107 by (rtac program_equalityI 1);
   108 by (auto_tac (claset(), simpset() addsimps [Acts_JN]));
   108 by Auto_tac;
   109 qed "lift_prog_JN";
   109 qed "lift_prog_JN";
   110 
   110 
   111 Goal "drop_prog i SKIP = SKIP";
   111 Goal "drop_prog i SKIP = SKIP";
   112 by (auto_tac (claset() addSIs [program_equalityI],
   112 by (auto_tac (claset() addSIs [program_equalityI],
   113 	      simpset() addsimps [SKIP_def, drop_set_def, drop_prog_def]));
   113 	      simpset() addsimps [SKIP_def, drop_set_def, drop_prog_def]));
   159 qed "inj_lift_act";
   159 qed "inj_lift_act";
   160 
   160 
   161 Goal "drop_prog i (lift_prog i F) = F";
   161 Goal "drop_prog i (lift_prog i F) = F";
   162 by (simp_tac (simpset() addsimps [lift_prog_def, drop_prog_def]) 1);
   162 by (simp_tac (simpset() addsimps [lift_prog_def, drop_prog_def]) 1);
   163 by (rtac program_equalityI 1);
   163 by (rtac program_equalityI 1);
   164 by (simp_tac (simpset() addsimps [image_compose RS sym, o_def]) 2);
   164 by (simp_tac (simpset() addsimps [image_image_eq_UN]) 2);
   165 by (Simp_tac 1);
   165 by (Simp_tac 1);
   166 qed "lift_prog_inverse";
   166 qed "lift_prog_inverse";
   167 Addsimps [lift_prog_inverse];
   167 Addsimps [lift_prog_inverse];
   168 
   168 
   169 Goal "inj (lift_prog i)";
   169 Goal "inj (lift_prog i)";
   222 by (auto_tac (claset(), simpset() addsimps [extend_act_def, lift_map_def]));
   222 by (auto_tac (claset(), simpset() addsimps [extend_act_def, lift_map_def]));
   223 by (rtac bexI 1);
   223 by (rtac bexI 1);
   224 by (auto_tac (claset() addSIs [exI], simpset()));
   224 by (auto_tac (claset() addSIs [exI], simpset()));
   225 qed "lift_act_correct";
   225 qed "lift_act_correct";
   226 
   226 
   227 Goal "drop_act i = project_act (lift_map i)";
   227 Goal "drop_act i = project_act UNIV (lift_map i)";
   228 by (rtac ext 1);
   228 by (rtac ext 1);
   229 by (rewrite_goals_tac [project_act_def, drop_act_def, lift_map_def]);
   229 by (rewrite_goals_tac [project_act_def, drop_act_def, lift_map_def]);
   230 by Auto_tac;
   230 by Auto_tac;
   231 by (rtac image_eqI 2);
   231 by (rtac image_eqI 2);
   232 by (REPEAT (rtac exI 1 ORELSE stac (refl RS fun_upd_idem) 1));
   232 by (REPEAT (rtac exI 1 ORELSE stac (refl RS fun_upd_idem) 1));
   239 by (simp_tac (simpset() 
   239 by (simp_tac (simpset() 
   240 	      addsimps [lift_export Acts_extend, 
   240 	      addsimps [lift_export Acts_extend, 
   241 			lift_act_correct]) 1);
   241 			lift_act_correct]) 1);
   242 qed "lift_prog_correct";
   242 qed "lift_prog_correct";
   243 
   243 
   244 Goal "drop_prog i F = project (lift_map i) F";
   244 Goal "drop_prog i F = project UNIV (lift_map i) F";
   245 by (rtac program_equalityI 1);
   245 by (rtac program_equalityI 1);
   246 by (simp_tac (simpset() addsimps [drop_set_correct]) 1);
   246 by (simp_tac (simpset() addsimps [drop_set_correct]) 1);
   247 by (simp_tac (simpset() 
   247 by (simp_tac (simpset() 
   248 	      addsimps [lift_export Acts_project,
   248 	      addsimps [lift_export Acts_project,
   249 			drop_act_correct]) 1);
   249 			drop_act_correct]) 1);
   406 (*** Programs of the form lift_prog i F Join G
   406 (*** Programs of the form lift_prog i F Join G
   407      in other words programs containing a replicated component ***)
   407      in other words programs containing a replicated component ***)
   408 
   408 
   409 Goal "drop_prog i ((lift_prog i F) Join G) = F Join (drop_prog i G)";
   409 Goal "drop_prog i ((lift_prog i F) Join G) = F Join (drop_prog i G)";
   410 by (rtac program_equalityI 1);
   410 by (rtac program_equalityI 1);
   411 by (simp_tac (simpset() addsimps [Acts_Join, image_Un,
   411 by (simp_tac (simpset() addsimps [image_Un, image_image_eq_UN]) 2);
   412 				  image_compose RS sym, o_def]) 2);
       
   413 by (simp_tac (simpset() addsimps [drop_set_Int_lift_set]) 1);
   412 by (simp_tac (simpset() addsimps [drop_set_Int_lift_set]) 1);
   414 qed "drop_prog_lift_prog_Join";
   413 qed "drop_prog_lift_prog_Join";
   415 
   414 
   416 Goal "(lift_prog i F) Join G = lift_prog i H \
   415 Goal "(lift_prog i F) Join G = lift_prog i H \
   417 \     ==> H = F Join (drop_prog i G)";
   416 \     ==> H = F Join (drop_prog i G)";
   424 \     ==> f i : reachable (F Join drop_prog i G)";
   423 \     ==> f i : reachable (F Join drop_prog i G)";
   425 by (etac reachable.induct 1);
   424 by (etac reachable.induct 1);
   426 by (force_tac (claset() addIs [reachable.Init, drop_set_I], simpset()) 1);
   425 by (force_tac (claset() addIs [reachable.Init, drop_set_I], simpset()) 1);
   427 (*By case analysis on whether the action is of lift_prog i F  or  G*)
   426 (*By case analysis on whether the action is of lift_prog i F  or  G*)
   428 by (force_tac (claset() addIs [reachable.Acts, drop_act_I], 
   427 by (force_tac (claset() addIs [reachable.Acts, drop_act_I], 
   429 	       simpset() addsimps [Acts_Join, image_iff]) 1);
   428 	       simpset() addsimps [image_iff]) 1);
   430 qed "reachable_lift_prog_Join_D";
   429 qed "reachable_lift_prog_Join_D";
   431 
   430 
   432 (*Opposite inclusion fails, even for the initial state: lift_set i includes
   431 (*Opposite inclusion fails, even for the initial state: lift_set i includes
   433   ALL functions determined only by their value at i.*)
   432   ALL functions determined only by their value at i.*)
   434 Goal "reachable (lift_prog i F Join G) <= \
   433 Goal "reachable (lift_prog i F Join G) <= \