src/HOL/UNITY/ELT.thy
changeset 13819 78f5885b76a9
parent 13812 91713a1915ee
child 13836 6d0392fc6dc5
equal deleted inserted replaced
13818:274fda8cca4b 13819:78f5885b76a9
   125 
   125 
   126 
   126 
   127 (*Useful with cancellation, disjunction*)
   127 (*Useful with cancellation, disjunction*)
   128 lemma leadsETo_Un_duplicate:
   128 lemma leadsETo_Un_duplicate:
   129      "F : A leadsTo[CC] (A' Un A') ==> F : A leadsTo[CC] A'"
   129      "F : A leadsTo[CC] (A' Un A') ==> F : A leadsTo[CC] A'"
   130 apply (simp add: Un_ac)
   130 by (simp add: Un_ac)
   131 done
       
   132 
   131 
   133 lemma leadsETo_Un_duplicate2:
   132 lemma leadsETo_Un_duplicate2:
   134      "F : A leadsTo[CC] (A' Un C Un C) ==> F : A leadsTo[CC] (A' Un C)"
   133      "F : A leadsTo[CC] (A' Un C Un C) ==> F : A leadsTo[CC] (A' Un C)"
   135 by (simp add: Un_ac)
   134 by (simp add: Un_ac)
   136 
   135 
   193 apply (blast intro: leadsETo_Union)
   192 apply (blast intro: leadsETo_Union)
   194 done
   193 done
   195 
   194 
   196 lemma single_leadsETo_I:
   195 lemma single_leadsETo_I:
   197      "(!!x. x : A ==> F : {x} leadsTo[CC] B) ==> F : A leadsTo[CC] B"
   196      "(!!x. x : A ==> F : {x} leadsTo[CC] B) ==> F : A leadsTo[CC] B"
   198 apply (subst UN_singleton [symmetric], rule leadsETo_UN, blast)
   197 by (subst UN_singleton [symmetric], rule leadsETo_UN, blast)
   199 done
       
   200 
   198 
   201 
   199 
   202 lemma subset_imp_leadsETo: "A<=B ==> F : A leadsTo[CC] B"
   200 lemma subset_imp_leadsETo: "A<=B ==> F : A leadsTo[CC] B"
   203 by (simp add: subset_imp_ensures [THEN leadsETo_Basis] Diff_eq_empty_iff [THEN iffD2])
   201 by (simp add: subset_imp_ensures [THEN leadsETo_Basis] 
       
   202               Diff_eq_empty_iff [THEN iffD2])
   204 
   203 
   205 lemmas empty_leadsETo = empty_subsetI [THEN subset_imp_leadsETo, simp]
   204 lemmas empty_leadsETo = empty_subsetI [THEN subset_imp_leadsETo, simp]
   206 
   205 
   207 
   206 
   208 
   207 
   209 (** Weakening laws **)
   208 (** Weakening laws **)
   210 
   209 
   211 lemma leadsETo_weaken_R:
   210 lemma leadsETo_weaken_R:
   212      "[| F : A leadsTo[CC] A';  A'<=B' |] ==> F : A leadsTo[CC] B'"
   211      "[| F : A leadsTo[CC] A';  A'<=B' |] ==> F : A leadsTo[CC] B'"
   213 apply (blast intro: subset_imp_leadsETo leadsETo_Trans)
   212 by (blast intro: subset_imp_leadsETo leadsETo_Trans)
   214 done
       
   215 
   213 
   216 lemma leadsETo_weaken_L [rule_format]:
   214 lemma leadsETo_weaken_L [rule_format]:
   217      "[| F : A leadsTo[CC] A'; B<=A |] ==> F : B leadsTo[CC] A'"
   215      "[| F : A leadsTo[CC] A'; B<=A |] ==> F : B leadsTo[CC] A'"
   218 apply (blast intro: leadsETo_Trans subset_imp_leadsETo)
   216 by (blast intro: leadsETo_Trans subset_imp_leadsETo)
   219 done
       
   220 
   217 
   221 (*Distributes over binary unions*)
   218 (*Distributes over binary unions*)
   222 lemma leadsETo_Un_distrib:
   219 lemma leadsETo_Un_distrib:
   223      "F : (A Un B) leadsTo[CC] C  =   
   220      "F : (A Un B) leadsTo[CC] C  =   
   224       (F : A leadsTo[CC] C & F : B leadsTo[CC] C)"
   221       (F : A leadsTo[CC] C & F : B leadsTo[CC] C)"
   225 apply (blast intro: leadsETo_Un leadsETo_weaken_L)
   222 by (blast intro: leadsETo_Un leadsETo_weaken_L)
   226 done
       
   227 
   223 
   228 lemma leadsETo_UN_distrib:
   224 lemma leadsETo_UN_distrib:
   229      "F : (UN i:I. A i) leadsTo[CC] B  =   
   225      "F : (UN i:I. A i) leadsTo[CC] B  =   
   230       (ALL i : I. F : (A i) leadsTo[CC] B)"
   226       (ALL i : I. F : (A i) leadsTo[CC] B)"
   231 apply (blast intro: leadsETo_UN leadsETo_weaken_L)
   227 by (blast intro: leadsETo_UN leadsETo_weaken_L)
   232 done
       
   233 
   228 
   234 lemma leadsETo_Union_distrib:
   229 lemma leadsETo_Union_distrib:
   235      "F : (Union S) leadsTo[CC] B  =  (ALL A : S. F : A leadsTo[CC] B)"
   230      "F : (Union S) leadsTo[CC] B  =  (ALL A : S. F : A leadsTo[CC] B)"
   236 apply (blast intro: leadsETo_Union leadsETo_weaken_L)
   231 by (blast intro: leadsETo_Union leadsETo_weaken_L)
   237 done
       
   238 
   232 
   239 lemma leadsETo_weaken:
   233 lemma leadsETo_weaken:
   240      "[| F : A leadsTo[CC'] A'; B<=A; A'<=B';  CC' <= CC |]  
   234      "[| F : A leadsTo[CC'] A'; B<=A; A'<=B';  CC' <= CC |]  
   241       ==> F : B leadsTo[CC] B'"
   235       ==> F : B leadsTo[CC] B'"
   242 apply (drule leadsETo_mono [THEN subsetD], assumption)
   236 apply (drule leadsETo_mono [THEN subsetD], assumption)
   243 apply (blast del: subsetCE intro: leadsETo_weaken_R leadsETo_weaken_L leadsETo_Trans)
   237 apply (blast del: subsetCE 
       
   238              intro: leadsETo_weaken_R leadsETo_weaken_L leadsETo_Trans)
   244 done
   239 done
   245 
   240 
   246 lemma leadsETo_givenBy:
   241 lemma leadsETo_givenBy:
   247      "[| F : A leadsTo[CC] A';  CC <= givenBy v |]  
   242      "[| F : A leadsTo[CC] A';  CC <= givenBy v |]  
   248       ==> F : A leadsTo[givenBy v] A'"
   243       ==> F : A leadsTo[givenBy v] A'"
   284  prefer 2 apply assumption
   279  prefer 2 apply assumption
   285 apply simp_all
   280 apply simp_all
   286 done
   281 done
   287 
   282 
   288 
   283 
   289 
       
   290 (** PSP: Progress-Safety-Progress **)
   284 (** PSP: Progress-Safety-Progress **)
   291 
   285 
   292 (*Special case of PSP: Misra's "stable conjunction"*)
   286 (*Special case of PSP: Misra's "stable conjunction"*)
   293 lemma e_psp_stable: 
   287 lemma e_psp_stable: 
   294    "[| F : A leadsTo[CC] A';  F : stable B;  ALL C:CC. C Int B : CC |]  
   288    "[| F : A leadsTo[CC] A';  F : stable B;  ALL C:CC. C Int B : CC |]  
   297 apply (erule leadsETo_induct)
   291 apply (erule leadsETo_induct)
   298 prefer 3 apply (blast intro: leadsETo_Union_Int)
   292 prefer 3 apply (blast intro: leadsETo_Union_Int)
   299 prefer 2 apply (blast intro: leadsETo_Trans)
   293 prefer 2 apply (blast intro: leadsETo_Trans)
   300 apply (rule leadsETo_Basis)
   294 apply (rule leadsETo_Basis)
   301 prefer 2 apply (force simp add: Diff_Int_distrib2 [symmetric])
   295 prefer 2 apply (force simp add: Diff_Int_distrib2 [symmetric])
   302 apply (simp add: ensures_def Diff_Int_distrib2 [symmetric] Int_Un_distrib2 [symmetric])
   296 apply (simp add: ensures_def Diff_Int_distrib2 [symmetric] 
       
   297                  Int_Un_distrib2 [symmetric])
   303 apply (blast intro: transient_strengthen constrains_Int)
   298 apply (blast intro: transient_strengthen constrains_Int)
   304 done
   299 done
   305 
   300 
   306 lemma e_psp_stable2:
   301 lemma e_psp_stable2:
   307      "[| F : A leadsTo[CC] A'; F : stable B;  ALL C:CC. C Int B : CC |]  
   302      "[| F : A leadsTo[CC] A'; F : stable B;  ALL C:CC. C Int B : CC |]  
   337 (*** Special properties involving the parameter [CC] ***)
   332 (*** Special properties involving the parameter [CC] ***)
   338 
   333 
   339 (*??IS THIS NEEDED?? or is it just an example of what's provable??*)
   334 (*??IS THIS NEEDED?? or is it just an example of what's provable??*)
   340 lemma gen_leadsETo_imp_Join_leadsETo:
   335 lemma gen_leadsETo_imp_Join_leadsETo:
   341      "[| F: (A leadsTo[givenBy v] B);  G : preserves v;   
   336      "[| F: (A leadsTo[givenBy v] B);  G : preserves v;   
   342          F Join G : stable C |]  
   337          F\<squnion>G : stable C |]  
   343       ==> F Join G : ((C Int A) leadsTo[(%D. C Int D) ` givenBy v] B)"
   338       ==> F\<squnion>G : ((C Int A) leadsTo[(%D. C Int D) ` givenBy v] B)"
   344 apply (erule leadsETo_induct)
   339 apply (erule leadsETo_induct)
   345   prefer 3
   340   prefer 3
   346   apply (subst Int_Union) 
   341   apply (subst Int_Union) 
   347   apply (blast intro: leadsETo_UN)
   342   apply (blast intro: leadsETo_UN)
   348 prefer 2
   343 prefer 2
   349  apply (blast intro: e_psp_stable2 [THEN leadsETo_weaken_L] leadsETo_Trans)
   344  apply (blast intro: e_psp_stable2 [THEN leadsETo_weaken_L] leadsETo_Trans)
   350 apply (rule leadsETo_Basis)
   345 apply (rule leadsETo_Basis)
   351 apply (auto simp add: Diff_eq_empty_iff [THEN iffD2] Int_Diff ensures_def givenBy_eq_Collect Join_transient)
   346 apply (auto simp add: Diff_eq_empty_iff [THEN iffD2] 
       
   347                       Int_Diff ensures_def givenBy_eq_Collect Join_transient)
   352 prefer 3 apply (blast intro: transient_strengthen)
   348 prefer 3 apply (blast intro: transient_strengthen)
   353 apply (drule_tac [2] P1 = P in preserves_subset_stable [THEN subsetD])
   349 apply (drule_tac [2] P1 = P in preserves_subset_stable [THEN subsetD])
   354 apply (drule_tac P1 = P in preserves_subset_stable [THEN subsetD])
   350 apply (drule_tac P1 = P in preserves_subset_stable [THEN subsetD])
   355 apply (unfold stable_def)
   351 apply (unfold stable_def)
   356 apply (blast intro: constrains_Int [THEN constrains_weaken])+
   352 apply (blast intro: constrains_Int [THEN constrains_weaken])+
   361 (** strong **)
   357 (** strong **)
   362 
   358 
   363 lemma leadsETo_subset_leadsTo: "(A leadsTo[CC] B) <= (A leadsTo B)"
   359 lemma leadsETo_subset_leadsTo: "(A leadsTo[CC] B) <= (A leadsTo B)"
   364 apply safe
   360 apply safe
   365 apply (erule leadsETo_induct)
   361 apply (erule leadsETo_induct)
   366 prefer 3 apply (blast intro: leadsTo_Union)
   362   prefer 3 apply (blast intro: leadsTo_Union)
   367 prefer 2 apply (blast intro: leadsTo_Trans, blast)
   363  prefer 2 apply (blast intro: leadsTo_Trans, blast)
   368 done
   364 done
   369 
   365 
   370 lemma leadsETo_UNIV_eq_leadsTo: "(A leadsTo[UNIV] B) = (A leadsTo B)"
   366 lemma leadsETo_UNIV_eq_leadsTo: "(A leadsTo[UNIV] B) = (A leadsTo B)"
   371 apply safe
   367 apply safe
   372 apply (erule leadsETo_subset_leadsTo [THEN subsetD])
   368 apply (erule leadsETo_subset_leadsTo [THEN subsetD])
   373 (*right-to-left case*)
   369 (*right-to-left case*)
   374 apply (erule leadsTo_induct)
   370 apply (erule leadsTo_induct)
   375 prefer 3 apply (blast intro: leadsETo_Union)
   371   prefer 3 apply (blast intro: leadsETo_Union)
   376 prefer 2 apply (blast intro: leadsETo_Trans, blast)
   372  prefer 2 apply (blast intro: leadsETo_Trans, blast)
   377 done
   373 done
   378 
   374 
   379 (**** weak ****)
   375 (**** weak ****)
   380 
   376 
   381 lemma LeadsETo_eq_leadsETo: 
   377 lemma LeadsETo_eq_leadsETo: 
   418 done
   414 done
   419 
   415 
   420 (*Lets us look at the starting state*)
   416 (*Lets us look at the starting state*)
   421 lemma single_LeadsETo_I:
   417 lemma single_LeadsETo_I:
   422      "(!!s. s : A ==> F : {s} LeadsTo[CC] B) ==> F : A LeadsTo[CC] B"
   418      "(!!s. s : A ==> F : {s} LeadsTo[CC] B) ==> F : A LeadsTo[CC] B"
   423 apply (subst UN_singleton [symmetric], rule LeadsETo_UN, blast)
   419 by (subst UN_singleton [symmetric], rule LeadsETo_UN, blast)
   424 done
       
   425 
   420 
   426 lemma subset_imp_LeadsETo:
   421 lemma subset_imp_LeadsETo:
   427      "A <= B ==> F : A LeadsTo[CC] B"
   422      "A <= B ==> F : A LeadsTo[CC] B"
   428 apply (simp (no_asm) add: LeadsETo_def)
   423 apply (simp (no_asm) add: LeadsETo_def)
   429 apply (blast intro: subset_imp_leadsETo)
   424 apply (blast intro: subset_imp_leadsETo)
   480 done
   475 done
   481 
   476 
   482 
   477 
   483 (**** EXTEND/PROJECT PROPERTIES ****)
   478 (**** EXTEND/PROJECT PROPERTIES ****)
   484 
   479 
   485 lemma (in Extend) givenBy_o_eq_extend_set: "givenBy (v o f) = extend_set h ` (givenBy v)"
   480 lemma (in Extend) givenBy_o_eq_extend_set:
   486 apply (simp (no_asm) add: givenBy_eq_Collect)
   481      "givenBy (v o f) = extend_set h ` (givenBy v)"
   487 apply best 
   482 by (simp add: givenBy_eq_Collect, best)
   488 done
       
   489 
   483 
   490 lemma (in Extend) givenBy_eq_extend_set: "givenBy f = range (extend_set h)"
   484 lemma (in Extend) givenBy_eq_extend_set: "givenBy f = range (extend_set h)"
   491 apply (simp (no_asm) add: givenBy_eq_Collect)
   485 apply (simp (no_asm) add: givenBy_eq_Collect)
   492 apply best
   486 apply best
   493 done
   487 done
   513 (*This version's stronger in the "ensures" precondition
   507 (*This version's stronger in the "ensures" precondition
   514   BUT there's no ensures_weaken_L*)
   508   BUT there's no ensures_weaken_L*)
   515 lemma (in Extend) Join_project_ensures_strong:
   509 lemma (in Extend) Join_project_ensures_strong:
   516      "[| project h C G ~: transient (project_set h C Int (A-B)) |  
   510      "[| project h C G ~: transient (project_set h C Int (A-B)) |  
   517            project_set h C Int (A - B) = {};   
   511            project_set h C Int (A - B) = {};   
   518          extend h F Join G : stable C;   
   512          extend h F\<squnion>G : stable C;   
   519          F Join project h C G : (project_set h C Int A) ensures B |]  
   513          F\<squnion>project h C G : (project_set h C Int A) ensures B |]  
   520       ==> extend h F Join G : (C Int extend_set h A) ensures (extend_set h B)"
   514       ==> extend h F\<squnion>G : (C Int extend_set h A) ensures (extend_set h B)"
   521 apply (subst Int_extend_set_lemma [symmetric])
   515 apply (subst Int_extend_set_lemma [symmetric])
   522 apply (rule Join_project_ensures)
   516 apply (rule Join_project_ensures)
   523 apply (auto simp add: Int_Diff)
   517 apply (auto simp add: Int_Diff)
   524 done
   518 done
   525 
   519 
   526 (*NOT WORKING.  MODIFY AS IN Project.thy
   520 (*NOT WORKING.  MODIFY AS IN Project.thy
   527 lemma (in Extend) pld_lemma:
   521 lemma (in Extend) pld_lemma:
   528      "[| extend h F Join G : stable C;   
   522      "[| extend h F\<squnion>G : stable C;   
   529          F Join project h C G : (project_set h C Int A) leadsTo[(%D. project_set h C Int D)`givenBy v] B;   
   523          F\<squnion>project h C G : (project_set h C Int A) leadsTo[(%D. project_set h C Int D)`givenBy v] B;   
   530          G : preserves (v o f) |]  
   524          G : preserves (v o f) |]  
   531       ==> extend h F Join G :  
   525       ==> extend h F\<squnion>G :  
   532             (C Int extend_set h (project_set h C Int A))  
   526             (C Int extend_set h (project_set h C Int A))  
   533             leadsTo[(%D. C Int extend_set h D)`givenBy v]  (extend_set h B)"
   527             leadsTo[(%D. C Int extend_set h D)`givenBy v]  (extend_set h B)"
   534 apply (erule leadsETo_induct)
   528 apply (erule leadsETo_induct)
   535   prefer 3
   529   prefer 3
   536   apply (simp del: UN_simps add: Int_UN_distrib leadsETo_UN extend_set_Union)
   530   apply (simp del: UN_simps add: Int_UN_distrib leadsETo_UN extend_set_Union)
   546 apply (auto intro: project_stable_project_set simp add: Int_left_absorb)
   540 apply (auto intro: project_stable_project_set simp add: Int_left_absorb)
   547 apply (simp (no_asm_simp) add: stable_ensures_Int [THEN ensures_weaken_R] Int_lower2 project_stable_project_set extend_stable_project_set)
   541 apply (simp (no_asm_simp) add: stable_ensures_Int [THEN ensures_weaken_R] Int_lower2 project_stable_project_set extend_stable_project_set)
   548 done
   542 done
   549 
   543 
   550 lemma (in Extend) project_leadsETo_D_lemma:
   544 lemma (in Extend) project_leadsETo_D_lemma:
   551      "[| extend h F Join G : stable C;   
   545      "[| extend h F\<squnion>G : stable C;   
   552          F Join project h C G :  
   546          F\<squnion>project h C G :  
   553              (project_set h C Int A)  
   547              (project_set h C Int A)  
   554              leadsTo[(%D. project_set h C Int D)`givenBy v] B;   
   548              leadsTo[(%D. project_set h C Int D)`givenBy v] B;   
   555          G : preserves (v o f) |]  
   549          G : preserves (v o f) |]  
   556       ==> extend h F Join G : (C Int extend_set h A)  
   550       ==> extend h F\<squnion>G : (C Int extend_set h A)  
   557             leadsTo[(%D. C Int extend_set h D)`givenBy v] (extend_set h B)"
   551             leadsTo[(%D. C Int extend_set h D)`givenBy v] (extend_set h B)"
   558 apply (rule pld_lemma [THEN leadsETo_weaken])
   552 apply (rule pld_lemma [THEN leadsETo_weaken])
   559 apply (auto simp add: split_extended_all)
   553 apply (auto simp add: split_extended_all)
   560 done
   554 done
   561 
   555 
   562 lemma (in Extend) project_leadsETo_D:
   556 lemma (in Extend) project_leadsETo_D:
   563      "[| F Join project h UNIV G : A leadsTo[givenBy v] B;   
   557      "[| F\<squnion>project h UNIV G : A leadsTo[givenBy v] B;   
   564          G : preserves (v o f) |]   
   558          G : preserves (v o f) |]   
   565       ==> extend h F Join G : (extend_set h A)  
   559       ==> extend h F\<squnion>G : (extend_set h A)  
   566             leadsTo[givenBy (v o f)] (extend_set h B)"
   560             leadsTo[givenBy (v o f)] (extend_set h B)"
   567 apply (cut_tac project_leadsETo_D_lemma [of _ _ UNIV], auto) 
   561 apply (cut_tac project_leadsETo_D_lemma [of _ _ UNIV], auto) 
   568 apply (erule leadsETo_givenBy)
   562 apply (erule leadsETo_givenBy)
   569 apply (rule givenBy_o_eq_extend_set [THEN equalityD2])
   563 apply (rule givenBy_o_eq_extend_set [THEN equalityD2])
   570 done
   564 done
   571 
   565 
   572 lemma (in Extend) project_LeadsETo_D:
   566 lemma (in Extend) project_LeadsETo_D:
   573      "[| F Join project h (reachable (extend h F Join G)) G  
   567      "[| F\<squnion>project h (reachable (extend h F\<squnion>G)) G  
   574              : A LeadsTo[givenBy v] B;   
   568              : A LeadsTo[givenBy v] B;   
   575          G : preserves (v o f) |]  
   569          G : preserves (v o f) |]  
   576       ==> extend h F Join G :  
   570       ==> extend h F\<squnion>G :  
   577             (extend_set h A) LeadsTo[givenBy (v o f)] (extend_set h B)"
   571             (extend_set h A) LeadsTo[givenBy (v o f)] (extend_set h B)"
   578 apply (cut_tac subset_refl [THEN stable_reachable, THEN project_leadsETo_D_lemma])
   572 apply (cut_tac subset_refl [THEN stable_reachable, THEN project_leadsETo_D_lemma])
   579 apply (auto simp add: LeadsETo_def)
   573 apply (auto simp add: LeadsETo_def)
   580  apply (erule leadsETo_mono [THEN [2] rev_subsetD])
   574  apply (erule leadsETo_mono [THEN [2] rev_subsetD])
   581  apply (blast intro: extend_set_givenBy_I)
   575  apply (blast intro: extend_set_givenBy_I)
   591 apply (auto simp add: project_leadsETo_D)
   585 apply (auto simp add: project_leadsETo_D)
   592 done
   586 done
   593 
   587 
   594 lemma (in Extend) extending_LeadsETo: 
   588 lemma (in Extend) extending_LeadsETo: 
   595      "(ALL G. extend h F ok G --> G : preserves (v o f))  
   589      "(ALL G. extend h F ok G --> G : preserves (v o f))  
   596       ==> extending (%G. reachable (extend h F Join G)) h F  
   590       ==> extending (%G. reachable (extend h F\<squnion>G)) h F  
   597                 (extend_set h A LeadsTo[givenBy (v o f)] extend_set h B)  
   591                 (extend_set h A LeadsTo[givenBy (v o f)] extend_set h B)  
   598                 (A LeadsTo[givenBy v]  B)"
   592                 (A LeadsTo[givenBy v]  B)"
   599 apply (unfold extending_def)
   593 apply (unfold extending_def)
   600 apply (blast intro: project_LeadsETo_D)
   594 apply (blast intro: project_LeadsETo_D)
   601 done
   595 done
   604 
   598 
   605 (*** leadsETo in the precondition ***)
   599 (*** leadsETo in the precondition ***)
   606 
   600 
   607 (*Lemma for the Trans case*)
   601 (*Lemma for the Trans case*)
   608 lemma (in Extend) pli_lemma:
   602 lemma (in Extend) pli_lemma:
   609      "[| extend h F Join G : stable C;     
   603      "[| extend h F\<squnion>G : stable C;     
   610          F Join project h C G     
   604          F\<squnion>project h C G     
   611            : project_set h C Int project_set h A leadsTo project_set h B |]  
   605            : project_set h C Int project_set h A leadsTo project_set h B |]  
   612       ==> F Join project h C G     
   606       ==> F\<squnion>project h C G     
   613             : project_set h C Int project_set h A leadsTo     
   607             : project_set h C Int project_set h A leadsTo     
   614               project_set h C Int project_set h B"
   608               project_set h C Int project_set h B"
   615 apply (rule psp_stable2 [THEN leadsTo_weaken_L])
   609 apply (rule psp_stable2 [THEN leadsTo_weaken_L])
   616 apply (auto simp add: project_stable_project_set extend_stable_project_set)
   610 apply (auto simp add: project_stable_project_set extend_stable_project_set)
   617 done
   611 done
   618 
   612 
   619 lemma (in Extend) project_leadsETo_I_lemma:
   613 lemma (in Extend) project_leadsETo_I_lemma:
   620      "[| extend h F Join G : stable C;   
   614      "[| extend h F\<squnion>G : stable C;   
   621          extend h F Join G :  
   615          extend h F\<squnion>G :  
   622            (C Int A) leadsTo[(%D. C Int D)`givenBy f]  B |]   
   616            (C Int A) leadsTo[(%D. C Int D)`givenBy f]  B |]   
   623   ==> F Join project h C G   
   617   ==> F\<squnion>project h C G   
   624     : (project_set h C Int project_set h (C Int A)) leadsTo (project_set h B)"
   618     : (project_set h C Int project_set h (C Int A)) leadsTo (project_set h B)"
   625 apply (erule leadsETo_induct)
   619 apply (erule leadsETo_induct)
   626   prefer 3
   620   prefer 3
   627   apply (simp only: Int_UN_distrib project_set_Union)
   621   apply (simp only: Int_UN_distrib project_set_Union)
   628   apply (blast intro: leadsTo_UN)
   622   apply (blast intro: leadsTo_UN)
   631 apply (rule leadsTo_Basis)
   625 apply (rule leadsTo_Basis)
   632 apply (blast intro: ensures_extend_set_imp_project_ensures)
   626 apply (blast intro: ensures_extend_set_imp_project_ensures)
   633 done
   627 done
   634 
   628 
   635 lemma (in Extend) project_leadsETo_I:
   629 lemma (in Extend) project_leadsETo_I:
   636      "extend h F Join G : (extend_set h A) leadsTo[givenBy f] (extend_set h B)
   630      "extend h F\<squnion>G : (extend_set h A) leadsTo[givenBy f] (extend_set h B)
   637       ==> F Join project h UNIV G : A leadsTo B"
   631       ==> F\<squnion>project h UNIV G : A leadsTo B"
   638 apply (rule project_leadsETo_I_lemma [THEN leadsTo_weaken], auto)
   632 apply (rule project_leadsETo_I_lemma [THEN leadsTo_weaken], auto)
   639 done
   633 done
   640 
   634 
   641 lemma (in Extend) project_LeadsETo_I:
   635 lemma (in Extend) project_LeadsETo_I:
   642      "extend h F Join G : (extend_set h A) LeadsTo[givenBy f] (extend_set h B) 
   636      "extend h F\<squnion>G : (extend_set h A) LeadsTo[givenBy f] (extend_set h B) 
   643       ==> F Join project h (reachable (extend h F Join G)) G   
   637       ==> F\<squnion>project h (reachable (extend h F\<squnion>G)) G   
   644            : A LeadsTo B"
   638            : A LeadsTo B"
   645 apply (simp (no_asm_use) add: LeadsTo_def LeadsETo_def)
   639 apply (simp (no_asm_use) add: LeadsTo_def LeadsETo_def)
   646 apply (rule project_leadsETo_I_lemma [THEN leadsTo_weaken])
   640 apply (rule project_leadsETo_I_lemma [THEN leadsTo_weaken])
   647 apply (auto simp add: project_set_reachable_extend_eq [symmetric])
   641 apply (auto simp add: project_set_reachable_extend_eq [symmetric])
   648 done
   642 done
   654 apply (unfold projecting_def)
   648 apply (unfold projecting_def)
   655 apply (force dest: project_leadsETo_I)
   649 apply (force dest: project_leadsETo_I)
   656 done
   650 done
   657 
   651 
   658 lemma (in Extend) projecting_LeadsTo: 
   652 lemma (in Extend) projecting_LeadsTo: 
   659      "projecting (%G. reachable (extend h F Join G)) h F  
   653      "projecting (%G. reachable (extend h F\<squnion>G)) h F  
   660                  (extend_set h A LeadsTo[givenBy f] extend_set h B)  
   654                  (extend_set h A LeadsTo[givenBy f] extend_set h B)  
   661                  (A LeadsTo B)"
   655                  (A LeadsTo B)"
   662 apply (unfold projecting_def)
   656 apply (unfold projecting_def)
   663 apply (force dest: project_LeadsETo_I)
   657 apply (force dest: project_LeadsETo_I)
   664 done
   658 done