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)"; |