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