src/ZF/UNITY/WFair.thy
changeset 60770 240563fbf41d
parent 59788 6f7b6adac439
child 61392 331be2820f90
equal deleted inserted replaced
60769:cf7f3465eaf1 60770:240563fbf41d
     1 (*  Title:      ZF/UNITY/WFair.thy
     1 (*  Title:      ZF/UNITY/WFair.thy
     2     Author:     Sidi Ehmety, Computer Laboratory
     2     Author:     Sidi Ehmety, Computer Laboratory
     3     Copyright   1998  University of Cambridge
     3     Copyright   1998  University of Cambridge
     4 *)
     4 *)
     5 
     5 
     6 section{*Progress under Weak Fairness*}
     6 section\<open>Progress under Weak Fairness\<close>
     7 
     7 
     8 theory WFair
     8 theory WFair
     9 imports UNITY Main_ZFC
     9 imports UNITY Main_ZFC
    10 begin
    10 begin
    11 
    11 
    12 text{*This theory defines the operators transient, ensures and leadsTo,
    12 text\<open>This theory defines the operators transient, ensures and leadsTo,
    13 assuming weak fairness. From Misra, "A Logic for Concurrent Programming",
    13 assuming weak fairness. From Misra, "A Logic for Concurrent Programming",
    14 1994.*}
    14 1994.\<close>
    15 
    15 
    16 definition
    16 definition
    17   (* This definition specifies weak fairness.  The rest of the theory
    17   (* This definition specifies weak fairness.  The rest of the theory
    18     is generic to all forms of fairness.*)
    18     is generic to all forms of fairness.*)
    19   transient :: "i=>i"  where
    19   transient :: "i=>i"  where
   284 done
   284 done
   285 
   285 
   286 lemma leadsTo_Union_distrib: "(F \<in> \<Union>(S) leadsTo B) \<longleftrightarrow>  (\<forall>A \<in> S. F \<in> A leadsTo B) & F \<in> program & st_set(B)"
   286 lemma leadsTo_Union_distrib: "(F \<in> \<Union>(S) leadsTo B) \<longleftrightarrow>  (\<forall>A \<in> S. F \<in> A leadsTo B) & F \<in> program & st_set(B)"
   287 by (blast dest: leadsToD2 intro: leadsTo_Union leadsTo_weaken_L)
   287 by (blast dest: leadsToD2 intro: leadsTo_Union leadsTo_weaken_L)
   288 
   288 
   289 text{*Set difference: maybe combine with @{text leadsTo_weaken_L}??*}
   289 text\<open>Set difference: maybe combine with @{text leadsTo_weaken_L}??\<close>
   290 lemma leadsTo_Diff:
   290 lemma leadsTo_Diff:
   291      "[| F: (A-B) leadsTo C; F \<in> B leadsTo C; st_set(C) |]
   291      "[| F: (A-B) leadsTo C; F \<in> B leadsTo C; st_set(C) |]
   292       ==> F \<in> A leadsTo C"
   292       ==> F \<in> A leadsTo C"
   293 by (blast intro: leadsTo_Un leadsTo_weaken dest: leadsToD2)
   293 by (blast intro: leadsTo_Un leadsTo_weaken dest: leadsToD2)
   294 
   294 
   385   "[| F \<in> za leadsTo zb;
   385   "[| F \<in> za leadsTo zb;
   386       P(zb);
   386       P(zb);
   387       !!A B. [| F \<in> A ensures B;  P(B); st_set(A); st_set(B) |] ==> P(A);
   387       !!A B. [| F \<in> A ensures B;  P(B); st_set(A); st_set(B) |] ==> P(A);
   388       !!S. [| \<forall>A \<in> S. P(A); \<forall>A \<in> S. st_set(A) |] ==> P(\<Union>(S))
   388       !!S. [| \<forall>A \<in> S. P(A); \<forall>A \<in> S. st_set(A) |] ==> P(\<Union>(S))
   389    |] ==> P(za)"
   389    |] ==> P(za)"
   390 txt{*by induction on this formula*}
   390 txt\<open>by induction on this formula\<close>
   391 apply (subgoal_tac "P (zb) \<longrightarrow> P (za) ")
   391 apply (subgoal_tac "P (zb) \<longrightarrow> P (za) ")
   392 txt{*now solve first subgoal: this formula is sufficient*}
   392 txt\<open>now solve first subgoal: this formula is sufficient\<close>
   393 apply (blast intro: leadsTo_refl)
   393 apply (blast intro: leadsTo_refl)
   394 apply (erule leadsTo_induct)
   394 apply (erule leadsTo_induct)
   395 apply (blast+)
   395 apply (blast+)
   396 done
   396 done
   397 
   397 
   419 apply (drule bspec, assumption)+
   419 apply (drule bspec, assumption)+
   420 apply blast
   420 apply blast
   421 done
   421 done
   422 declare leadsTo_empty [simp]
   422 declare leadsTo_empty [simp]
   423 
   423 
   424 subsection{*PSP: Progress-Safety-Progress*}
   424 subsection\<open>PSP: Progress-Safety-Progress\<close>
   425 
   425 
   426 text{*Special case of PSP: Misra's "stable conjunction"*}
   426 text\<open>Special case of PSP: Misra's "stable conjunction"\<close>
   427 
   427 
   428 lemma psp_stable:
   428 lemma psp_stable:
   429    "[| F \<in> A leadsTo A'; F \<in> stable(B) |] ==> F:(A \<inter> B) leadsTo (A' \<inter> B)"
   429    "[| F \<in> A leadsTo A'; F \<in> stable(B) |] ==> F:(A \<inter> B) leadsTo (A' \<inter> B)"
   430 apply (unfold stable_def)
   430 apply (unfold stable_def)
   431 apply (frule leadsToD2)
   431 apply (frule leadsToD2)
   454 "[|F \<in> A leadsTo A'; F \<in> B co B'; st_set(B')|]==> F:(A \<inter> B') leadsTo ((A' \<inter> B) \<union> (B' - B))"
   454 "[|F \<in> A leadsTo A'; F \<in> B co B'; st_set(B')|]==> F:(A \<inter> B') leadsTo ((A' \<inter> B) \<union> (B' - B))"
   455 apply (subgoal_tac "F \<in> program & st_set (A) & st_set (A') & st_set (B) ")
   455 apply (subgoal_tac "F \<in> program & st_set (A) & st_set (A') & st_set (B) ")
   456 prefer 2 apply (blast dest!: constrainsD2 leadsToD2)
   456 prefer 2 apply (blast dest!: constrainsD2 leadsToD2)
   457 apply (erule leadsTo_induct)
   457 apply (erule leadsTo_induct)
   458 prefer 3 apply (blast intro: leadsTo_Union_Int)
   458 prefer 3 apply (blast intro: leadsTo_Union_Int)
   459  txt{*Basis case*}
   459  txt\<open>Basis case\<close>
   460  apply (blast intro: psp_ensures leadsTo_Basis)
   460  apply (blast intro: psp_ensures leadsTo_Basis)
   461 txt{*Transitivity case has a delicate argument involving "cancellation"*}
   461 txt\<open>Transitivity case has a delicate argument involving "cancellation"\<close>
   462 apply (rule leadsTo_Un_duplicate2)
   462 apply (rule leadsTo_Un_duplicate2)
   463 apply (erule leadsTo_cancel_Diff1)
   463 apply (erule leadsTo_cancel_Diff1)
   464 apply (simp add: Int_Diff Diff_triv)
   464 apply (simp add: Int_Diff Diff_triv)
   465 apply (blast intro: leadsTo_weaken_L dest: constrains_imp_subset)
   465 apply (blast intro: leadsTo_weaken_L dest: constrains_imp_subset)
   466 done
   466 done
   479 apply (drule psp, assumption, blast)
   479 apply (drule psp, assumption, blast)
   480 apply (blast intro: leadsTo_weaken)
   480 apply (blast intro: leadsTo_weaken)
   481 done
   481 done
   482 
   482 
   483 
   483 
   484 subsection{*Proving the induction rules*}
   484 subsection\<open>Proving the induction rules\<close>
   485 
   485 
   486 (** The most general rule \<in> r is any wf relation; f is any variant function **)
   486 (** The most general rule \<in> r is any wf relation; f is any variant function **)
   487 lemma leadsTo_wf_induct_aux: "[| wf(r);
   487 lemma leadsTo_wf_induct_aux: "[| wf(r);
   488          m \<in> I;
   488          m \<in> I;
   489          field(r)<=I;
   489          field(r)<=I;
   598 (* slightly different from the HOL one \<in> B here is bounded *)
   598 (* slightly different from the HOL one \<in> B here is bounded *)
   599 lemma leadsTo_123: "F \<in> A leadsTo A'
   599 lemma leadsTo_123: "F \<in> A leadsTo A'
   600       ==> \<exists>B \<in> Pow(state). A<=B & F \<in> B leadsTo A' & F \<in> (B-A') co (B \<union> A')"
   600       ==> \<exists>B \<in> Pow(state). A<=B & F \<in> B leadsTo A' & F \<in> (B-A') co (B \<union> A')"
   601 apply (frule leadsToD2)
   601 apply (frule leadsToD2)
   602 apply (erule leadsTo_induct)
   602 apply (erule leadsTo_induct)
   603   txt{*Basis*}
   603   txt\<open>Basis\<close>
   604   apply (blast dest: ensuresD constrainsD2 st_setD)
   604   apply (blast dest: ensuresD constrainsD2 st_setD)
   605  txt{*Trans*}
   605  txt\<open>Trans\<close>
   606  apply clarify
   606  apply clarify
   607  apply (rule_tac x = "Ba \<union> Bb" in bexI)
   607  apply (rule_tac x = "Ba \<union> Bb" in bexI)
   608  apply (blast intro: leadsTo_123_aux leadsTo_Un_Un leadsTo_cancel1 leadsTo_Un_duplicate, blast)
   608  apply (blast intro: leadsTo_123_aux leadsTo_Un_Un leadsTo_cancel1 leadsTo_Un_duplicate, blast)
   609 txt{*Union*}
   609 txt\<open>Union\<close>
   610 apply (clarify dest!: ball_conj_distrib [THEN iffD1])
   610 apply (clarify dest!: ball_conj_distrib [THEN iffD1])
   611 apply (subgoal_tac "\<exists>y. y \<in> Pi (S, %A. {Ba \<in> Pow (state) . A<=Ba & F \<in> Ba leadsTo B & F \<in> Ba - B co Ba \<union> B}) ")
   611 apply (subgoal_tac "\<exists>y. y \<in> Pi (S, %A. {Ba \<in> Pow (state) . A<=Ba & F \<in> Ba leadsTo B & F \<in> Ba - B co Ba \<union> B}) ")
   612 defer 1
   612 defer 1
   613 apply (rule AC_ball_Pi, safe)
   613 apply (rule AC_ball_Pi, safe)
   614 apply (rotate_tac 1)
   614 apply (rotate_tac 1)
   629 prefer 2 apply (blast dest: leadsTo_eq_subset_wlt [THEN iffD1], clarify)
   629 prefer 2 apply (blast dest: leadsTo_eq_subset_wlt [THEN iffD1], clarify)
   630 apply (simp add: wlt_increasing [THEN subset_Un_iff2 [THEN iffD1]])
   630 apply (simp add: wlt_increasing [THEN subset_Un_iff2 [THEN iffD1]])
   631 done
   631 done
   632 
   632 
   633 
   633 
   634 subsection{*Completion: Binary and General Finite versions*}
   634 subsection\<open>Completion: Binary and General Finite versions\<close>
   635 
   635 
   636 lemma completion_aux: "[| W = wlt(F, (B' \<union> C));
   636 lemma completion_aux: "[| W = wlt(F, (B' \<union> C));
   637        F \<in> A leadsTo (A' \<union> C);  F \<in> A' co (A' \<union> C);
   637        F \<in> A leadsTo (A' \<union> C);  F \<in> A' co (A' \<union> C);
   638        F \<in> B leadsTo (B' \<union> C);  F \<in> B' co (B' \<union> C) |]
   638        F \<in> B leadsTo (B' \<union> C);  F \<in> B' co (B' \<union> C) |]
   639     ==> F \<in> (A \<inter> B) leadsTo ((A' \<inter> B') \<union> C)"
   639     ==> F \<in> (A \<inter> B) leadsTo ((A' \<inter> B') \<union> C)"
   655 apply (blast intro: subset_imp_leadsTo dest: leadsToD2 constrainsD2)
   655 apply (blast intro: subset_imp_leadsTo dest: leadsToD2 constrainsD2)
   656 apply (force simp add: st_set_def)
   656 apply (force simp add: st_set_def)
   657 apply (subgoal_tac "A \<inter> B \<subseteq> A \<inter> W")
   657 apply (subgoal_tac "A \<inter> B \<subseteq> A \<inter> W")
   658 prefer 2 apply (blast dest!: leadsTo_subset intro!: subset_refl [THEN Int_mono])
   658 prefer 2 apply (blast dest!: leadsTo_subset intro!: subset_refl [THEN Int_mono])
   659 apply (blast intro: leadsTo_Trans subset_imp_leadsTo)
   659 apply (blast intro: leadsTo_Trans subset_imp_leadsTo)
   660 txt{*last subgoal*}
   660 txt\<open>last subgoal\<close>
   661 apply (rule_tac leadsTo_Un_duplicate2)
   661 apply (rule_tac leadsTo_Un_duplicate2)
   662 apply (rule_tac leadsTo_Un_Un)
   662 apply (rule_tac leadsTo_Un_Un)
   663  prefer 2 apply (blast intro: leadsTo_refl)
   663  prefer 2 apply (blast intro: leadsTo_refl)
   664 apply (rule_tac A'1 = "B' \<union> C" in wlt_leadsTo[THEN psp2, THEN leadsTo_weaken])
   664 apply (rule_tac A'1 = "B' \<union> C" in wlt_leadsTo[THEN psp2, THEN leadsTo_weaken])
   665 apply blast+
   665 apply blast+