src/HOL/UNITY/Extend.ML
changeset 8111 68cac7d9d119
parent 8069 19b9f92ca503
child 8122 b43ad07660b9
equal deleted inserted replaced
8110:f7651ede12b7 8111:68cac7d9d119
   480 by (asm_simp_tac (simpset() addsimps [leadsTo_Basis, extend_ensures]) 1);
   480 by (asm_simp_tac (simpset() addsimps [leadsTo_Basis, extend_ensures]) 1);
   481 qed "leadsTo_imp_extend_leadsTo";
   481 qed "leadsTo_imp_extend_leadsTo";
   482 
   482 
   483 (*** Proving the converse takes some doing! ***)
   483 (*** Proving the converse takes some doing! ***)
   484 
   484 
   485 Goalw [slice_def] "slice (Union S) y = (UN x:S. slice x y)";
   485 Goal "(x : slice C y) = (h(x,y) : C)";
       
   486 by (simp_tac (simpset() addsimps [slice_def]) 1);
       
   487 qed "slice_iff";
       
   488 
       
   489 AddIffs [slice_iff];
       
   490 
       
   491 Goal "slice (Union S) y = (UN x:S. slice x y)";
   486 by Auto_tac;
   492 by Auto_tac;
   487 qed "slice_Union";
   493 qed "slice_Union";
   488 
   494 
   489 Goalw [slice_def] "slice (extend_set h A) y = A";
   495 Goal "slice (extend_set h A) y = A";
   490 by Auto_tac;
   496 by Auto_tac;
   491 qed "slice_extend_set";
   497 qed "slice_extend_set";
   492 
   498 
   493 Goalw [slice_def] "project_set h A = (UN y. slice A y)";
   499 Goal "project_set h A = (UN y. slice A y)";
   494 by Auto_tac;
   500 by Auto_tac;
   495 qed "project_set_is_UN_slice";
   501 qed "project_set_is_UN_slice";
   496 
   502 
   497 Goalw [slice_def, transient_def]
   503 Goalw [transient_def] "extend h F : transient A ==> F : transient (slice A y)";
   498     "extend h F : transient A ==> F : transient (slice A y)";
       
   499 by Auto_tac;
   504 by Auto_tac;
   500 by (rtac bexI 1);
   505 by (rtac bexI 1);
   501 by Auto_tac;
   506 by Auto_tac;
   502 by (force_tac (claset(), simpset() addsimps [extend_act_def]) 1);
   507 by (force_tac (claset(), simpset() addsimps [extend_act_def]) 1);
   503 qed "extend_transient_slice";
   508 qed "extend_transient_slice";
   504 
   509 
       
   510 (*Converse?*)
       
   511 Goal "extend h F : A co B ==> F : (slice A y) co (slice B y)";
       
   512 by (auto_tac (claset(), simpset() addsimps [constrains_def]));
       
   513 qed "extend_constrains_slice";
       
   514 
   505 Goal "extend h F : A ensures B ==> F : (slice A y) ensures (project_set h B)";
   515 Goal "extend h F : A ensures B ==> F : (slice A y) ensures (project_set h B)";
   506 by (full_simp_tac
   516 by (auto_tac (claset(), 
   507     (simpset() addsimps [ensures_def, extend_constrains, extend_transient, 
   517 	      simpset() addsimps [ensures_def, extend_constrains, 
   508 			 project_set_eq, image_Un RS sym,
   518 				  extend_transient]));
   509 			 extend_set_Un_distrib RS sym, 
   519 by (etac (extend_transient_slice RS transient_strengthen) 2);
   510 			 extend_set_Diff_distrib RS sym]) 1);
   520 by (etac (extend_constrains_slice RS constrains_weaken) 1);
   511 by Safe_tac;
   521 by Auto_tac;
   512 by (full_simp_tac (simpset() addsimps [constrains_def, extend_act_def, 
       
   513 				       extend_set_def]) 1);
       
   514 by (Clarify_tac 1);
       
   515 by (ball_tac 1); 
       
   516 by (full_simp_tac (simpset() addsimps [slice_def, image_iff, Image_iff]) 1);
       
   517 by (force_tac (claset() addSIs [h_f_g_eq RS sym], simpset()) 1);
       
   518 (*transient*)
       
   519 by (dtac extend_transient_slice 1);
       
   520 by (etac transient_strengthen 1);
       
   521 by (force_tac (claset() addIs [f_h_eq RS sym], 
       
   522 	       simpset() addsimps [slice_def]) 1);
       
   523 qed "extend_ensures_slice";
   522 qed "extend_ensures_slice";
   524 
   523 
   525 Goal "ALL y. F : (slice B y) leadsTo CU ==> F : (project_set h B) leadsTo CU";
   524 Goal "ALL y. F : (slice B y) leadsTo CU ==> F : (project_set h B) leadsTo CU";
   526 by (simp_tac (simpset() addsimps [project_set_is_UN_slice]) 1);
   525 by (simp_tac (simpset() addsimps [project_set_is_UN_slice]) 1);
   527 by (blast_tac (claset() addIs [leadsTo_UN]) 1);
   526 by (blast_tac (claset() addIs [leadsTo_UN]) 1);
   528 qed "leadsTo_slice_image";
   527 qed "leadsTo_slice_project_set";
   529 
       
   530 
   528 
   531 Goal "extend h F : AU leadsTo BU \
   529 Goal "extend h F : AU leadsTo BU \
   532 \     ==> ALL y. F : (slice AU y) leadsTo (project_set h BU)";
   530 \     ==> ALL y. F : (slice AU y) leadsTo (project_set h BU)";
   533 by (etac leadsTo_induct 1);
   531 by (etac leadsTo_induct 1);
   534 by (full_simp_tac (simpset() addsimps [slice_Union]) 3);
   532 by (asm_simp_tac (simpset() addsimps [leadsTo_UN, slice_Union]) 3);
   535 by (blast_tac (claset() addIs [leadsTo_UN]) 3);
   533 by (blast_tac (claset() addIs [leadsTo_slice_project_set, leadsTo_Trans]) 2);
   536 by (blast_tac (claset() addIs [leadsTo_slice_image, leadsTo_Trans]) 2);
       
   537 by (blast_tac (claset() addIs [extend_ensures_slice, leadsTo_Basis]) 1);
   534 by (blast_tac (claset() addIs [extend_ensures_slice, leadsTo_Basis]) 1);
   538 qed_spec_mp "extend_leadsTo_slice";
   535 qed_spec_mp "extend_leadsTo_slice";
   539 
   536 
   540 Goal "(extend h F : (extend_set h A) leadsTo (extend_set h B)) = \
   537 Goal "(extend h F : (extend_set h A) leadsTo (extend_set h B)) = \
   541 \     (F : A leadsTo B)";
   538 \     (F : A leadsTo B)";