src/HOL/UNITY/WFair.ML
changeset 5069 3ea049f7979d
parent 4776 1f9362e769c1
child 5111 8f4b72f0c15d
equal deleted inserted replaced
5068:fb28eaa07e01 5069:3ea049f7979d
     8 From Misra, "A Logic for Concurrent Programming", 1994
     8 From Misra, "A Logic for Concurrent Programming", 1994
     9 *)
     9 *)
    10 
    10 
    11 open WFair;
    11 open WFair;
    12 
    12 
    13 goal thy "Union(B) Int A = Union((%C. C Int A)``B)";
    13 Goal "Union(B) Int A = Union((%C. C Int A)``B)";
    14 by (Blast_tac 1);
    14 by (Blast_tac 1);
    15 qed "Int_Union_Union";
    15 qed "Int_Union_Union";
    16 
    16 
    17 
    17 
    18 (*** transient ***)
    18 (*** transient ***)
    19 
    19 
    20 goalw thy [stable_def, constrains_def, transient_def]
    20 Goalw [stable_def, constrains_def, transient_def]
    21     "!!A. [| stable Acts A; transient Acts A |] ==> A = {}";
    21     "!!A. [| stable Acts A; transient Acts A |] ==> A = {}";
    22 by (Blast_tac 1);
    22 by (Blast_tac 1);
    23 qed "stable_transient_empty";
    23 qed "stable_transient_empty";
    24 
    24 
    25 goalw thy [transient_def]
    25 Goalw [transient_def]
    26     "!!A. [| transient Acts A; B<=A |] ==> transient Acts B";
    26     "!!A. [| transient Acts A; B<=A |] ==> transient Acts B";
    27 by (Clarify_tac 1);
    27 by (Clarify_tac 1);
    28 by (rtac bexI 1 THEN assume_tac 2);
    28 by (rtac bexI 1 THEN assume_tac 2);
    29 by (Blast_tac 1);
    29 by (Blast_tac 1);
    30 qed "transient_strengthen";
    30 qed "transient_strengthen";
    31 
    31 
    32 goalw thy [transient_def]
    32 Goalw [transient_def]
    33     "!!A. [| act:Acts;  A <= Domain act;  act^^A <= Compl A |] \
    33     "!!A. [| act:Acts;  A <= Domain act;  act^^A <= Compl A |] \
    34 \         ==> transient Acts A";
    34 \         ==> transient Acts A";
    35 by (Blast_tac 1);
    35 by (Blast_tac 1);
    36 qed "transient_mem";
    36 qed "transient_mem";
    37 
    37 
    38 
    38 
    39 (*** ensures ***)
    39 (*** ensures ***)
    40 
    40 
    41 goalw thy [ensures_def]
    41 Goalw [ensures_def]
    42     "!!Acts. [| constrains Acts (A-B) (A Un B); transient Acts (A-B) |] \
    42     "!!Acts. [| constrains Acts (A-B) (A Un B); transient Acts (A-B) |] \
    43 \            ==> ensures Acts A B";
    43 \            ==> ensures Acts A B";
    44 by (Blast_tac 1);
    44 by (Blast_tac 1);
    45 qed "ensuresI";
    45 qed "ensuresI";
    46 
    46 
    47 goalw thy [ensures_def]
    47 Goalw [ensures_def]
    48     "!!Acts. ensures Acts A B  \
    48     "!!Acts. ensures Acts A B  \
    49 \            ==> constrains Acts (A-B) (A Un B) & transient Acts (A-B)";
    49 \            ==> constrains Acts (A-B) (A Un B) & transient Acts (A-B)";
    50 by (Blast_tac 1);
    50 by (Blast_tac 1);
    51 qed "ensuresD";
    51 qed "ensuresD";
    52 
    52 
    53 (*The L-version (precondition strengthening) doesn't hold for ENSURES*)
    53 (*The L-version (precondition strengthening) doesn't hold for ENSURES*)
    54 goalw thy [ensures_def]
    54 Goalw [ensures_def]
    55     "!!Acts. [| ensures Acts A A'; A'<=B' |] ==> ensures Acts A B'";
    55     "!!Acts. [| ensures Acts A A'; A'<=B' |] ==> ensures Acts A B'";
    56 by (blast_tac (claset() addIs [constrains_weaken, transient_strengthen]) 1);
    56 by (blast_tac (claset() addIs [constrains_weaken, transient_strengthen]) 1);
    57 qed "ensures_weaken_R";
    57 qed "ensures_weaken_R";
    58 
    58 
    59 goalw thy [ensures_def, constrains_def, transient_def]
    59 Goalw [ensures_def, constrains_def, transient_def]
    60     "!!Acts. Acts ~= {} ==> ensures Acts A UNIV";
    60     "!!Acts. Acts ~= {} ==> ensures Acts A UNIV";
    61 by (Asm_simp_tac 1);  (*omitting this causes PROOF FAILED, even with Safe_tac*)
    61 by (Asm_simp_tac 1);  (*omitting this causes PROOF FAILED, even with Safe_tac*)
    62 by (Blast_tac 1);
    62 by (Blast_tac 1);
    63 qed "ensures_UNIV";
    63 qed "ensures_UNIV";
    64 
    64 
    65 goalw thy [ensures_def]
    65 Goalw [ensures_def]
    66     "!!Acts. [| stable Acts C; \
    66     "!!Acts. [| stable Acts C; \
    67 \               constrains Acts (C Int (A - A')) (A Un A'); \
    67 \               constrains Acts (C Int (A - A')) (A Un A'); \
    68 \               transient  Acts (C Int (A-A')) |]   \
    68 \               transient  Acts (C Int (A-A')) |]   \
    69 \           ==> ensures Acts (C Int A) (C Int A')";
    69 \           ==> ensures Acts (C Int A) (C Int A')";
    70 by (asm_simp_tac (simpset() addsimps [Int_Un_distrib RS sym,
    70 by (asm_simp_tac (simpset() addsimps [Int_Un_distrib RS sym,
    77 
    77 
    78 (*Synonyms for the theorems produced by the inductive defn package*)
    78 (*Synonyms for the theorems produced by the inductive defn package*)
    79 bind_thm ("leadsTo_Basis", leadsto.Basis);
    79 bind_thm ("leadsTo_Basis", leadsto.Basis);
    80 bind_thm ("leadsTo_Trans", leadsto.Trans);
    80 bind_thm ("leadsTo_Trans", leadsto.Trans);
    81 
    81 
    82 goal thy "!!Acts. act: Acts ==> leadsTo Acts A UNIV";
    82 Goal "!!Acts. act: Acts ==> leadsTo Acts A UNIV";
    83 by (blast_tac (claset() addIs [ensures_UNIV RS leadsTo_Basis]) 1);
    83 by (blast_tac (claset() addIs [ensures_UNIV RS leadsTo_Basis]) 1);
    84 qed "leadsTo_UNIV";
    84 qed "leadsTo_UNIV";
    85 Addsimps [leadsTo_UNIV];
    85 Addsimps [leadsTo_UNIV];
    86 
    86 
    87 (*Useful with cancellation, disjunction*)
    87 (*Useful with cancellation, disjunction*)
    88 goal thy "!!Acts. leadsTo Acts A (A' Un A') ==> leadsTo Acts A A'";
    88 Goal "!!Acts. leadsTo Acts A (A' Un A') ==> leadsTo Acts A A'";
    89 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1);
    89 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1);
    90 qed "leadsTo_Un_duplicate";
    90 qed "leadsTo_Un_duplicate";
    91 
    91 
    92 goal thy "!!Acts. leadsTo Acts A (A' Un C Un C) ==> leadsTo Acts A (A' Un C)";
    92 Goal "!!Acts. leadsTo Acts A (A' Un C Un C) ==> leadsTo Acts A (A' Un C)";
    93 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1);
    93 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1);
    94 qed "leadsTo_Un_duplicate2";
    94 qed "leadsTo_Un_duplicate2";
    95 
    95 
    96 (*The Union introduction rule as we should have liked to state it*)
    96 (*The Union introduction rule as we should have liked to state it*)
    97 val prems = goal thy
    97 val prems = goal thy
   104 by (simp_tac (simpset() addsimps [Union_image_eq RS sym]) 1);
   104 by (simp_tac (simpset() addsimps [Union_image_eq RS sym]) 1);
   105 by (blast_tac (claset() addIs (leadsto.Union::prems)) 1);
   105 by (blast_tac (claset() addIs (leadsto.Union::prems)) 1);
   106 qed "leadsTo_UN";
   106 qed "leadsTo_UN";
   107 
   107 
   108 (*Binary union introduction rule*)
   108 (*Binary union introduction rule*)
   109 goal thy
   109 Goal
   110   "!!C. [| leadsTo Acts A C; leadsTo Acts B C |] ==> leadsTo Acts (A Un B) C";
   110   "!!C. [| leadsTo Acts A C; leadsTo Acts B C |] ==> leadsTo Acts (A Un B) C";
   111 by (stac Un_eq_Union 1);
   111 by (stac Un_eq_Union 1);
   112 by (blast_tac (claset() addIs [leadsTo_Union]) 1);
   112 by (blast_tac (claset() addIs [leadsTo_Union]) 1);
   113 qed "leadsTo_Un";
   113 qed "leadsTo_Un";
   114 
   114 
   124 br (major RS leadsto.induct) 1;
   124 br (major RS leadsto.induct) 1;
   125 by (REPEAT (blast_tac (claset() addIs prems) 1));
   125 by (REPEAT (blast_tac (claset() addIs prems) 1));
   126 qed "leadsTo_induct";
   126 qed "leadsTo_induct";
   127 
   127 
   128 
   128 
   129 goal thy "!!A B. [| A<=B;  id: Acts |] ==> leadsTo Acts A B";
   129 Goal "!!A B. [| A<=B;  id: Acts |] ==> leadsTo Acts A B";
   130 by (rtac leadsTo_Basis 1);
   130 by (rtac leadsTo_Basis 1);
   131 by (rewrite_goals_tac [ensures_def, constrains_def, transient_def]);
   131 by (rewrite_goals_tac [ensures_def, constrains_def, transient_def]);
   132 by (Blast_tac 1);
   132 by (Blast_tac 1);
   133 qed "subset_imp_leadsTo";
   133 qed "subset_imp_leadsTo";
   134 
   134 
   136 Addsimps [empty_leadsTo];
   136 Addsimps [empty_leadsTo];
   137 
   137 
   138 
   138 
   139 (*There's a direct proof by leadsTo_Trans and subset_imp_leadsTo, but it
   139 (*There's a direct proof by leadsTo_Trans and subset_imp_leadsTo, but it
   140   needs the extra premise id:Acts*)
   140   needs the extra premise id:Acts*)
   141 goal thy "!!Acts. leadsTo Acts A A' ==> A'<=B' --> leadsTo Acts A B'";
   141 Goal "!!Acts. leadsTo Acts A A' ==> A'<=B' --> leadsTo Acts A B'";
   142 by (etac leadsTo_induct 1);
   142 by (etac leadsTo_induct 1);
   143 by (Clarify_tac 3);
   143 by (Clarify_tac 3);
   144 by (blast_tac (claset() addIs [leadsTo_Union]) 3);
   144 by (blast_tac (claset() addIs [leadsTo_Union]) 3);
   145 by (blast_tac (claset() addIs [leadsTo_Trans]) 2);
   145 by (blast_tac (claset() addIs [leadsTo_Trans]) 2);
   146 by (blast_tac (claset() addIs [leadsTo_Basis, ensures_weaken_R]) 1);
   146 by (blast_tac (claset() addIs [leadsTo_Basis, ensures_weaken_R]) 1);
   147 qed_spec_mp "leadsTo_weaken_R";
   147 qed_spec_mp "leadsTo_weaken_R";
   148 
   148 
   149 
   149 
   150 goal thy "!!Acts. [| leadsTo Acts A A'; B<=A; id: Acts |] ==>  \
   150 Goal "!!Acts. [| leadsTo Acts A A'; B<=A; id: Acts |] ==>  \
   151 \                 leadsTo Acts B A'";
   151 \                 leadsTo Acts B A'";
   152 by (blast_tac (claset() addIs [leadsTo_Basis, leadsTo_Trans, 
   152 by (blast_tac (claset() addIs [leadsTo_Basis, leadsTo_Trans, 
   153 			       subset_imp_leadsTo]) 1);
   153 			       subset_imp_leadsTo]) 1);
   154 qed_spec_mp "leadsTo_weaken_L";
   154 qed_spec_mp "leadsTo_weaken_L";
   155 
   155 
   156 (*Distributes over binary unions*)
   156 (*Distributes over binary unions*)
   157 goal thy
   157 Goal
   158   "!!C. id: Acts ==> \
   158   "!!C. id: Acts ==> \
   159 \       leadsTo Acts (A Un B) C  =  (leadsTo Acts A C & leadsTo Acts B C)";
   159 \       leadsTo Acts (A Un B) C  =  (leadsTo Acts A C & leadsTo Acts B C)";
   160 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken_L]) 1);
   160 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken_L]) 1);
   161 qed "leadsTo_Un_distrib";
   161 qed "leadsTo_Un_distrib";
   162 
   162 
   163 goal thy
   163 Goal
   164   "!!C. id: Acts ==> \
   164   "!!C. id: Acts ==> \
   165 \       leadsTo Acts (UN i:I. A i) B  =  (ALL i : I. leadsTo Acts (A i) B)";
   165 \       leadsTo Acts (UN i:I. A i) B  =  (ALL i : I. leadsTo Acts (A i) B)";
   166 by (blast_tac (claset() addIs [leadsTo_UN, leadsTo_weaken_L]) 1);
   166 by (blast_tac (claset() addIs [leadsTo_UN, leadsTo_weaken_L]) 1);
   167 qed "leadsTo_UN_distrib";
   167 qed "leadsTo_UN_distrib";
   168 
   168 
   169 goal thy
   169 Goal
   170   "!!C. id: Acts ==> \
   170   "!!C. id: Acts ==> \
   171 \       leadsTo Acts (Union S) B  =  (ALL A : S. leadsTo Acts A B)";
   171 \       leadsTo Acts (Union S) B  =  (ALL A : S. leadsTo Acts A B)";
   172 by (blast_tac (claset() addIs [leadsTo_Union, leadsTo_weaken_L]) 1);
   172 by (blast_tac (claset() addIs [leadsTo_Union, leadsTo_weaken_L]) 1);
   173 qed "leadsTo_Union_distrib";
   173 qed "leadsTo_Union_distrib";
   174 
   174 
   175 
   175 
   176 goal thy
   176 Goal
   177    "!!Acts. [| leadsTo Acts A A'; id: Acts; B<=A; A'<=B' |] \
   177    "!!Acts. [| leadsTo Acts A A'; id: Acts; B<=A; A'<=B' |] \
   178 \           ==> leadsTo Acts B B'";
   178 \           ==> leadsTo Acts B B'";
   179 (*PROOF FAILED: why?*)
   179 (*PROOF FAILED: why?*)
   180 by (blast_tac (claset() addIs [leadsTo_Trans, leadsTo_weaken_R,
   180 by (blast_tac (claset() addIs [leadsTo_Trans, leadsTo_weaken_R,
   181 			       leadsTo_weaken_L]) 1);
   181 			       leadsTo_weaken_L]) 1);
   182 qed "leadsTo_weaken";
   182 qed "leadsTo_weaken";
   183 
   183 
   184 
   184 
   185 (*Set difference: maybe combine with leadsTo_weaken_L??*)
   185 (*Set difference: maybe combine with leadsTo_weaken_L??*)
   186 goal thy
   186 Goal
   187   "!!C. [| leadsTo Acts (A-B) C; leadsTo Acts B C; id: Acts |] \
   187   "!!C. [| leadsTo Acts (A-B) C; leadsTo Acts B C; id: Acts |] \
   188 \       ==> leadsTo Acts A C";
   188 \       ==> leadsTo Acts A C";
   189 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken]) 1);
   189 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken]) 1);
   190 qed "leadsTo_Diff";
   190 qed "leadsTo_Diff";
   191 
   191 
   209 by (blast_tac (claset() addIs [leadsTo_UN_UN] 
   209 by (blast_tac (claset() addIs [leadsTo_UN_UN] 
   210                         addIs prems) 1);
   210                         addIs prems) 1);
   211 qed "leadsTo_UN_UN_noindex";
   211 qed "leadsTo_UN_UN_noindex";
   212 
   212 
   213 (*Version with no index set*)
   213 (*Version with no index set*)
   214 goal thy
   214 Goal
   215    "!!Acts. ALL i. leadsTo Acts (A i) (A' i) \
   215    "!!Acts. ALL i. leadsTo Acts (A i) (A' i) \
   216 \           ==> leadsTo Acts (UN i. A i) (UN i. A' i)";
   216 \           ==> leadsTo Acts (UN i. A i) (UN i. A' i)";
   217 by (blast_tac (claset() addIs [leadsTo_UN_UN]) 1);
   217 by (blast_tac (claset() addIs [leadsTo_UN_UN]) 1);
   218 qed "all_leadsTo_UN_UN";
   218 qed "all_leadsTo_UN_UN";
   219 
   219 
   220 
   220 
   221 (*Binary union version*)
   221 (*Binary union version*)
   222 goal thy "!!Acts. [| leadsTo Acts A A'; leadsTo Acts B B' |] \
   222 Goal "!!Acts. [| leadsTo Acts A A'; leadsTo Acts B B' |] \
   223 \                 ==> leadsTo Acts (A Un B) (A' Un B')";
   223 \                 ==> leadsTo Acts (A Un B) (A' Un B')";
   224 by (blast_tac (claset() addIs [leadsTo_Un, 
   224 by (blast_tac (claset() addIs [leadsTo_Un, 
   225 			       leadsTo_weaken_R]) 1);
   225 			       leadsTo_weaken_R]) 1);
   226 qed "leadsTo_Un_Un";
   226 qed "leadsTo_Un_Un";
   227 
   227 
   228 
   228 
   229 (** The cancellation law **)
   229 (** The cancellation law **)
   230 
   230 
   231 goal thy
   231 Goal
   232    "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts B B'; id: Acts |] \
   232    "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts B B'; id: Acts |] \
   233 \           ==> leadsTo Acts A (A' Un B')";
   233 \           ==> leadsTo Acts A (A' Un B')";
   234 by (blast_tac (claset() addIs [leadsTo_Un_Un, 
   234 by (blast_tac (claset() addIs [leadsTo_Un_Un, 
   235 			       subset_imp_leadsTo, leadsTo_Trans]) 1);
   235 			       subset_imp_leadsTo, leadsTo_Trans]) 1);
   236 qed "leadsTo_cancel2";
   236 qed "leadsTo_cancel2";
   237 
   237 
   238 goal thy
   238 Goal
   239    "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts (B-A') B'; id: Acts |] \
   239    "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts (B-A') B'; id: Acts |] \
   240 \           ==> leadsTo Acts A (A' Un B')";
   240 \           ==> leadsTo Acts A (A' Un B')";
   241 by (rtac leadsTo_cancel2 1);
   241 by (rtac leadsTo_cancel2 1);
   242 by (assume_tac 2);
   242 by (assume_tac 2);
   243 by (ALLGOALS Asm_simp_tac);
   243 by (ALLGOALS Asm_simp_tac);
   244 qed "leadsTo_cancel_Diff2";
   244 qed "leadsTo_cancel_Diff2";
   245 
   245 
   246 goal thy
   246 Goal
   247    "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts B B'; id: Acts |] \
   247    "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts B B'; id: Acts |] \
   248 \           ==> leadsTo Acts A (B' Un A')";
   248 \           ==> leadsTo Acts A (B' Un A')";
   249 by (asm_full_simp_tac (simpset() addsimps [Un_commute]) 1);
   249 by (asm_full_simp_tac (simpset() addsimps [Un_commute]) 1);
   250 by (blast_tac (claset() addSIs [leadsTo_cancel2]) 1);
   250 by (blast_tac (claset() addSIs [leadsTo_cancel2]) 1);
   251 qed "leadsTo_cancel1";
   251 qed "leadsTo_cancel1";
   252 
   252 
   253 goal thy
   253 Goal
   254    "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts (B-A') B'; id: Acts |] \
   254    "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts (B-A') B'; id: Acts |] \
   255 \           ==> leadsTo Acts A (B' Un A')";
   255 \           ==> leadsTo Acts A (B' Un A')";
   256 by (rtac leadsTo_cancel1 1);
   256 by (rtac leadsTo_cancel1 1);
   257 by (assume_tac 2);
   257 by (assume_tac 2);
   258 by (ALLGOALS Asm_simp_tac);
   258 by (ALLGOALS Asm_simp_tac);
   260 
   260 
   261 
   261 
   262 
   262 
   263 (** The impossibility law **)
   263 (** The impossibility law **)
   264 
   264 
   265 goal thy "!!Acts. leadsTo Acts A B ==> B={} --> A={}";
   265 Goal "!!Acts. leadsTo Acts A B ==> B={} --> A={}";
   266 by (etac leadsTo_induct 1);
   266 by (etac leadsTo_induct 1);
   267 by (ALLGOALS Asm_simp_tac);
   267 by (ALLGOALS Asm_simp_tac);
   268 by (rewrite_goals_tac [ensures_def, constrains_def, transient_def]);
   268 by (rewrite_goals_tac [ensures_def, constrains_def, transient_def]);
   269 by (Blast_tac 1);
   269 by (Blast_tac 1);
   270 val lemma = result() RS mp;
   270 val lemma = result() RS mp;
   271 
   271 
   272 goal thy "!!Acts. leadsTo Acts A {} ==> A={}";
   272 Goal "!!Acts. leadsTo Acts A {} ==> A={}";
   273 by (blast_tac (claset() addSIs [lemma]) 1);
   273 by (blast_tac (claset() addSIs [lemma]) 1);
   274 qed "leadsTo_empty";
   274 qed "leadsTo_empty";
   275 
   275 
   276 
   276 
   277 (** PSP: Progress-Safety-Progress **)
   277 (** PSP: Progress-Safety-Progress **)
   278 
   278 
   279 (*Special case of PSP: Misra's "stable conjunction".  Doesn't need id:Acts. *)
   279 (*Special case of PSP: Misra's "stable conjunction".  Doesn't need id:Acts. *)
   280 goalw thy [stable_def]
   280 Goalw [stable_def]
   281    "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \
   281    "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \
   282 \           ==> leadsTo Acts (A Int B) (A' Int B)";
   282 \           ==> leadsTo Acts (A Int B) (A' Int B)";
   283 by (etac leadsTo_induct 1);
   283 by (etac leadsTo_induct 1);
   284 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3);
   284 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3);
   285 by (blast_tac (claset() addIs [leadsTo_Union]) 3);
   285 by (blast_tac (claset() addIs [leadsTo_Union]) 3);
   289     (simpset() addsimps [ensures_def, 
   289     (simpset() addsimps [ensures_def, 
   290 			 Diff_Int_distrib2 RS sym, Int_Un_distrib2 RS sym]) 1);
   290 			 Diff_Int_distrib2 RS sym, Int_Un_distrib2 RS sym]) 1);
   291 by (blast_tac (claset() addIs [transient_strengthen, constrains_Int]) 1);
   291 by (blast_tac (claset() addIs [transient_strengthen, constrains_Int]) 1);
   292 qed "PSP_stable";
   292 qed "PSP_stable";
   293 
   293 
   294 goal thy
   294 Goal
   295    "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \
   295    "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \
   296 \           ==> leadsTo Acts (B Int A) (B Int A')";
   296 \           ==> leadsTo Acts (B Int A) (B Int A')";
   297 by (asm_simp_tac (simpset() addsimps (PSP_stable::Int_ac)) 1);
   297 by (asm_simp_tac (simpset() addsimps (PSP_stable::Int_ac)) 1);
   298 qed "PSP_stable2";
   298 qed "PSP_stable2";
   299 
   299 
   300 
   300 
   301 goalw thy [ensures_def]
   301 Goalw [ensures_def]
   302    "!!Acts. [| ensures Acts A A'; constrains Acts B B' |] \
   302    "!!Acts. [| ensures Acts A A'; constrains Acts B B' |] \
   303 \           ==> ensures Acts (A Int B) ((A' Int B) Un (B' - B))";
   303 \           ==> ensures Acts (A Int B) ((A' Int B) Un (B' - B))";
   304 by Safe_tac;
   304 by Safe_tac;
   305 by (blast_tac (claset() addIs [constrainsI] addDs [constrainsD]) 1);
   305 by (blast_tac (claset() addIs [constrainsI] addDs [constrainsD]) 1);
   306 by (etac transient_strengthen 1);
   306 by (etac transient_strengthen 1);
   307 by (Blast_tac 1);
   307 by (Blast_tac 1);
   308 qed "PSP_ensures";
   308 qed "PSP_ensures";
   309 
   309 
   310 
   310 
   311 goal thy
   311 Goal
   312    "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \
   312    "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \
   313 \           ==> leadsTo Acts (A Int B) ((A' Int B) Un (B' - B))";
   313 \           ==> leadsTo Acts (A Int B) ((A' Int B) Un (B' - B))";
   314 by (etac leadsTo_induct 1);
   314 by (etac leadsTo_induct 1);
   315 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3);
   315 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3);
   316 by (blast_tac (claset() addIs [leadsTo_Union]) 3);
   316 by (blast_tac (claset() addIs [leadsTo_Union]) 3);
   321 by (asm_full_simp_tac (simpset() addsimps [Int_Diff, Diff_triv]) 2);
   321 by (asm_full_simp_tac (simpset() addsimps [Int_Diff, Diff_triv]) 2);
   322 (*Basis case*)
   322 (*Basis case*)
   323 by (blast_tac (claset() addIs [leadsTo_Basis, PSP_ensures]) 1);
   323 by (blast_tac (claset() addIs [leadsTo_Basis, PSP_ensures]) 1);
   324 qed "PSP";
   324 qed "PSP";
   325 
   325 
   326 goal thy
   326 Goal
   327    "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \
   327    "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \
   328 \           ==> leadsTo Acts (B Int A) ((B Int A') Un (B' - B))";
   328 \           ==> leadsTo Acts (B Int A) ((B Int A') Un (B' - B))";
   329 by (asm_simp_tac (simpset() addsimps (PSP::Int_ac)) 1);
   329 by (asm_simp_tac (simpset() addsimps (PSP::Int_ac)) 1);
   330 qed "PSP2";
   330 qed "PSP2";
   331 
   331 
   332 
   332 
   333 goalw thy [unless_def]
   333 Goalw [unless_def]
   334    "!!Acts. [| leadsTo Acts A A'; unless Acts B B'; id: Acts |] \
   334    "!!Acts. [| leadsTo Acts A A'; unless Acts B B'; id: Acts |] \
   335 \           ==> leadsTo Acts (A Int B) ((A' Int B) Un B')";
   335 \           ==> leadsTo Acts (A Int B) ((A' Int B) Un B')";
   336 by (dtac PSP 1);
   336 by (dtac PSP 1);
   337 by (assume_tac 1);
   337 by (assume_tac 1);
   338 by (asm_full_simp_tac (simpset() addsimps [Un_Diff_Diff, Int_Diff_Un]) 2);
   338 by (asm_full_simp_tac (simpset() addsimps [Un_Diff_Diff, Int_Diff_Un]) 2);
   343 qed "PSP_unless";
   343 qed "PSP_unless";
   344 
   344 
   345 
   345 
   346 (*** Proving the induction rules ***)
   346 (*** Proving the induction rules ***)
   347 
   347 
   348 goal thy
   348 Goal
   349    "!!Acts. [| wf r;     \
   349    "!!Acts. [| wf r;     \
   350 \              ALL m. leadsTo Acts (A Int f-``{m})                     \
   350 \              ALL m. leadsTo Acts (A Int f-``{m})                     \
   351 \                                  ((A Int f-``(r^-1 ^^ {m})) Un B);   \
   351 \                                  ((A Int f-``(r^-1 ^^ {m})) Un B);   \
   352 \              id: Acts |] \
   352 \              id: Acts |] \
   353 \           ==> leadsTo Acts (A Int f-``{m}) B";
   353 \           ==> leadsTo Acts (A Int f-``{m}) B";
   359 by (blast_tac (claset() addIs [leadsTo_cancel1, leadsTo_Un_duplicate]) 1);
   359 by (blast_tac (claset() addIs [leadsTo_cancel1, leadsTo_Un_duplicate]) 1);
   360 val lemma = result();
   360 val lemma = result();
   361 
   361 
   362 
   362 
   363 (** Meta or object quantifier ????? **)
   363 (** Meta or object quantifier ????? **)
   364 goal thy
   364 Goal
   365    "!!Acts. [| wf r;     \
   365    "!!Acts. [| wf r;     \
   366 \              ALL m. leadsTo Acts (A Int f-``{m})                     \
   366 \              ALL m. leadsTo Acts (A Int f-``{m})                     \
   367 \                                  ((A Int f-``(r^-1 ^^ {m})) Un B);   \
   367 \                                  ((A Int f-``(r^-1 ^^ {m})) Un B);   \
   368 \              id: Acts |] \
   368 \              id: Acts |] \
   369 \           ==> leadsTo Acts A B";
   369 \           ==> leadsTo Acts A B";
   373 by (REPEAT (assume_tac 2));
   373 by (REPEAT (assume_tac 2));
   374 by (Fast_tac 1);    (*Blast_tac: Function unknown's argument not a parameter*)
   374 by (Fast_tac 1);    (*Blast_tac: Function unknown's argument not a parameter*)
   375 qed "leadsTo_wf_induct";
   375 qed "leadsTo_wf_induct";
   376 
   376 
   377 
   377 
   378 goal thy
   378 Goal
   379    "!!Acts. [| wf r;     \
   379    "!!Acts. [| wf r;     \
   380 \              ALL m:I. leadsTo Acts (A Int f-``{m})                   \
   380 \              ALL m:I. leadsTo Acts (A Int f-``{m})                   \
   381 \                                  ((A Int f-``(r^-1 ^^ {m})) Un B);   \
   381 \                                  ((A Int f-``(r^-1 ^^ {m})) Un B);   \
   382 \              id: Acts |] \
   382 \              id: Acts |] \
   383 \           ==> leadsTo Acts A ((A - (f-``I)) Un B)";
   383 \           ==> leadsTo Acts A ((A - (f-``I)) Un B)";
   388 by (blast_tac (claset() addIs [subset_imp_leadsTo]) 1);
   388 by (blast_tac (claset() addIs [subset_imp_leadsTo]) 1);
   389 qed "bounded_induct";
   389 qed "bounded_induct";
   390 
   390 
   391 
   391 
   392 (*Alternative proof is via the lemma leadsTo Acts (A Int f-``(lessThan m)) B*)
   392 (*Alternative proof is via the lemma leadsTo Acts (A Int f-``(lessThan m)) B*)
   393 goal thy
   393 Goal
   394    "!!Acts. [| ALL m. leadsTo Acts (A Int f-``{m})                     \
   394    "!!Acts. [| ALL m. leadsTo Acts (A Int f-``{m})                     \
   395 \                                  ((A Int f-``(lessThan m)) Un B);   \
   395 \                                  ((A Int f-``(lessThan m)) Un B);   \
   396 \              id: Acts |] \
   396 \              id: Acts |] \
   397 \           ==> leadsTo Acts A B";
   397 \           ==> leadsTo Acts A B";
   398 by (rtac (wf_less_than RS leadsTo_wf_induct) 1);
   398 by (rtac (wf_less_than RS leadsTo_wf_induct) 1);
   399 by (assume_tac 2);
   399 by (assume_tac 2);
   400 by (Asm_simp_tac 1);
   400 by (Asm_simp_tac 1);
   401 qed "lessThan_induct";
   401 qed "lessThan_induct";
   402 
   402 
   403 goal thy
   403 Goal
   404    "!!Acts. [| ALL m:(greaterThan l). leadsTo Acts (A Int f-``{m})   \
   404    "!!Acts. [| ALL m:(greaterThan l). leadsTo Acts (A Int f-``{m})   \
   405 \                                        ((A Int f-``(lessThan m)) Un B);   \
   405 \                                        ((A Int f-``(lessThan m)) Un B);   \
   406 \              id: Acts |] \
   406 \              id: Acts |] \
   407 \           ==> leadsTo Acts A ((A Int (f-``(atMost l))) Un B)";
   407 \           ==> leadsTo Acts A ((A Int (f-``(atMost l))) Un B)";
   408 by (simp_tac (HOL_ss addsimps [Diff_eq RS sym, vimage_Compl, Compl_greaterThan RS sym]) 1);
   408 by (simp_tac (HOL_ss addsimps [Diff_eq RS sym, vimage_Compl, Compl_greaterThan RS sym]) 1);
   409 by (rtac (wf_less_than RS bounded_induct) 1);
   409 by (rtac (wf_less_than RS bounded_induct) 1);
   410 by (assume_tac 2);
   410 by (assume_tac 2);
   411 by (Asm_simp_tac 1);
   411 by (Asm_simp_tac 1);
   412 qed "lessThan_bounded_induct";
   412 qed "lessThan_bounded_induct";
   413 
   413 
   414 goal thy
   414 Goal
   415    "!!Acts. [| ALL m:(lessThan l). leadsTo Acts (A Int f-``{m})   \
   415    "!!Acts. [| ALL m:(lessThan l). leadsTo Acts (A Int f-``{m})   \
   416 \                                    ((A Int f-``(greaterThan m)) Un B);   \
   416 \                                    ((A Int f-``(greaterThan m)) Un B);   \
   417 \              id: Acts |] \
   417 \              id: Acts |] \
   418 \           ==> leadsTo Acts A ((A Int (f-``(atLeast l))) Un B)";
   418 \           ==> leadsTo Acts A ((A Int (f-``(atLeast l))) Un B)";
   419 by (res_inst_tac [("f","f"),("f1", "%k. l - k")]
   419 by (res_inst_tac [("f","f"),("f1", "%k. l - k")]
   429 
   429 
   430 
   430 
   431 (*** wlt ****)
   431 (*** wlt ****)
   432 
   432 
   433 (*Misra's property W3*)
   433 (*Misra's property W3*)
   434 goalw thy [wlt_def] "leadsTo Acts (wlt Acts B) B";
   434 Goalw [wlt_def] "leadsTo Acts (wlt Acts B) B";
   435 by (blast_tac (claset() addSIs [leadsTo_Union]) 1);
   435 by (blast_tac (claset() addSIs [leadsTo_Union]) 1);
   436 qed "wlt_leadsTo";
   436 qed "wlt_leadsTo";
   437 
   437 
   438 goalw thy [wlt_def] "!!Acts. leadsTo Acts A B ==> A <= wlt Acts B";
   438 Goalw [wlt_def] "!!Acts. leadsTo Acts A B ==> A <= wlt Acts B";
   439 by (blast_tac (claset() addSIs [leadsTo_Union]) 1);
   439 by (blast_tac (claset() addSIs [leadsTo_Union]) 1);
   440 qed "leadsTo_subset";
   440 qed "leadsTo_subset";
   441 
   441 
   442 (*Misra's property W2*)
   442 (*Misra's property W2*)
   443 goal thy "!!Acts. id: Acts ==> leadsTo Acts A B = (A <= wlt Acts B)";
   443 Goal "!!Acts. id: Acts ==> leadsTo Acts A B = (A <= wlt Acts B)";
   444 by (blast_tac (claset() addSIs [leadsTo_subset, 
   444 by (blast_tac (claset() addSIs [leadsTo_subset, 
   445 				wlt_leadsTo RS leadsTo_weaken_L]) 1);
   445 				wlt_leadsTo RS leadsTo_weaken_L]) 1);
   446 qed "leadsTo_eq_subset_wlt";
   446 qed "leadsTo_eq_subset_wlt";
   447 
   447 
   448 (*Misra's property W4*)
   448 (*Misra's property W4*)
   449 goal thy "!!Acts. id: Acts ==> B <= wlt Acts B";
   449 Goal "!!Acts. id: Acts ==> B <= wlt Acts B";
   450 by (asm_simp_tac (simpset() addsimps [leadsTo_eq_subset_wlt RS sym,
   450 by (asm_simp_tac (simpset() addsimps [leadsTo_eq_subset_wlt RS sym,
   451 				      subset_imp_leadsTo]) 1);
   451 				      subset_imp_leadsTo]) 1);
   452 qed "wlt_increasing";
   452 qed "wlt_increasing";
   453 
   453 
   454 
   454 
   455 (*Used in the Trans case below*)
   455 (*Used in the Trans case below*)
   456 goalw thy [constrains_def]
   456 Goalw [constrains_def]
   457    "!!Acts. [| B <= A2;  \
   457    "!!Acts. [| B <= A2;  \
   458 \              constrains Acts (A1 - B) (A1 Un B); \
   458 \              constrains Acts (A1 - B) (A1 Un B); \
   459 \              constrains Acts (A2 - C) (A2 Un C) |] \
   459 \              constrains Acts (A2 - C) (A2 Un C) |] \
   460 \           ==> constrains Acts (A1 Un A2 - C) (A1 Un A2 Un C)";
   460 \           ==> constrains Acts (A1 Un A2 - C) (A1 Un A2 Un C)";
   461 by (Clarify_tac 1);
   461 by (Clarify_tac 1);
   462 by (blast_tac (claset() addSDs [bspec]) 1);
   462 by (blast_tac (claset() addSDs [bspec]) 1);
   463 val lemma1 = result();
   463 val lemma1 = result();
   464 
   464 
   465 
   465 
   466 (*Lemma (1,2,3) of Misra's draft book, Chapter 4, "Progress"*)
   466 (*Lemma (1,2,3) of Misra's draft book, Chapter 4, "Progress"*)
   467 goal thy
   467 Goal
   468    "!!Acts. [| leadsTo Acts A A';  id: Acts |] ==> \
   468    "!!Acts. [| leadsTo Acts A A';  id: Acts |] ==> \
   469 \      EX B. A<=B & leadsTo Acts B A' & constrains Acts (B-A') (B Un A')";
   469 \      EX B. A<=B & leadsTo Acts B A' & constrains Acts (B-A') (B Un A')";
   470 by (etac leadsTo_induct 1);
   470 by (etac leadsTo_induct 1);
   471 (*Basis*)
   471 (*Basis*)
   472 by (blast_tac (claset() addIs [leadsTo_Basis]
   472 by (blast_tac (claset() addIs [leadsTo_Basis]
   483 by (blast_tac (claset() addIs [leadsTo_UN, constrains_weaken]) 1);
   483 by (blast_tac (claset() addIs [leadsTo_UN, constrains_weaken]) 1);
   484 qed "leadsTo_123";
   484 qed "leadsTo_123";
   485 
   485 
   486 
   486 
   487 (*Misra's property W5*)
   487 (*Misra's property W5*)
   488 goal thy "!!Acts. id: Acts ==> constrains Acts (wlt Acts B - B) (wlt Acts B)";
   488 Goal "!!Acts. id: Acts ==> constrains Acts (wlt Acts B - B) (wlt Acts B)";
   489 by (forward_tac [wlt_leadsTo RS leadsTo_123] 1);
   489 by (forward_tac [wlt_leadsTo RS leadsTo_123] 1);
   490 by (Clarify_tac 1);
   490 by (Clarify_tac 1);
   491 by (subgoal_tac "Ba = wlt Acts B" 1);
   491 by (subgoal_tac "Ba = wlt Acts B" 1);
   492 by (blast_tac (claset() addDs [leadsTo_eq_subset_wlt]) 2);
   492 by (blast_tac (claset() addDs [leadsTo_eq_subset_wlt]) 2);
   493 by (Clarify_tac 1);
   493 by (Clarify_tac 1);
   495 qed "wlt_constrains_wlt";
   495 qed "wlt_constrains_wlt";
   496 
   496 
   497 
   497 
   498 (*** Completion: Binary and General Finite versions ***)
   498 (*** Completion: Binary and General Finite versions ***)
   499 
   499 
   500 goal thy
   500 Goal
   501    "!!Acts. [| leadsTo Acts A A';  stable Acts A';   \
   501    "!!Acts. [| leadsTo Acts A A';  stable Acts A';   \
   502 \              leadsTo Acts B B';  stable Acts B';  id: Acts |] \
   502 \              leadsTo Acts B B';  stable Acts B';  id: Acts |] \
   503 \           ==> leadsTo Acts (A Int B) (A' Int B')";
   503 \           ==> leadsTo Acts (A Int B) (A' Int B')";
   504 by (subgoal_tac "stable Acts (wlt Acts B')" 1);
   504 by (subgoal_tac "stable Acts (wlt Acts B')" 1);
   505 by (asm_full_simp_tac (simpset() addsimps [stable_def]) 2);
   505 by (asm_full_simp_tac (simpset() addsimps [stable_def]) 2);
   517 (*Blast_tac gives PROOF FAILED*)
   517 (*Blast_tac gives PROOF FAILED*)
   518 by (best_tac (claset() addIs [leadsTo_Trans]) 1);
   518 by (best_tac (claset() addIs [leadsTo_Trans]) 1);
   519 qed "stable_completion";
   519 qed "stable_completion";
   520 
   520 
   521 
   521 
   522 goal thy
   522 Goal
   523    "!!Acts. [| finite I;  id: Acts |]                     \
   523    "!!Acts. [| finite I;  id: Acts |]                     \
   524 \           ==> (ALL i:I. leadsTo Acts (A i) (A' i)) -->  \
   524 \           ==> (ALL i:I. leadsTo Acts (A i) (A' i)) -->  \
   525 \               (ALL i:I. stable Acts (A' i)) -->         \
   525 \               (ALL i:I. stable Acts (A' i)) -->         \
   526 \               leadsTo Acts (INT i:I. A i) (INT i:I. A' i)";
   526 \               leadsTo Acts (INT i:I. A i) (INT i:I. A' i)";
   527 by (etac finite_induct 1);
   527 by (etac finite_induct 1);
   530     (simpset() addsimps [stable_completion, stable_def, 
   530     (simpset() addsimps [stable_completion, stable_def, 
   531 			 ball_constrains_INT]) 1);
   531 			 ball_constrains_INT]) 1);
   532 qed_spec_mp "finite_stable_completion";
   532 qed_spec_mp "finite_stable_completion";
   533 
   533 
   534 
   534 
   535 goal thy
   535 Goal
   536    "!!Acts. [| W = wlt Acts (B' Un C);     \
   536    "!!Acts. [| W = wlt Acts (B' Un C);     \
   537 \              leadsTo Acts A (A' Un C);  constrains Acts A' (A' Un C);   \
   537 \              leadsTo Acts A (A' Un C);  constrains Acts A' (A' Un C);   \
   538 \              leadsTo Acts B (B' Un C);  constrains Acts B' (B' Un C);   \
   538 \              leadsTo Acts B (B' Un C);  constrains Acts B' (B' Un C);   \
   539 \              id: Acts |] \
   539 \              id: Acts |] \
   540 \           ==> leadsTo Acts (A Int B) ((A' Int B') Un C)";
   540 \           ==> leadsTo Acts (A Int B) ((A' Int B') Un C)";
   560 	                delrules [subsetI]) 2);
   560 	                delrules [subsetI]) 2);
   561 by (blast_tac (claset() addIs [leadsTo_Trans, subset_imp_leadsTo]) 1);
   561 by (blast_tac (claset() addIs [leadsTo_Trans, subset_imp_leadsTo]) 1);
   562 bind_thm("completion", refl RS result());
   562 bind_thm("completion", refl RS result());
   563 
   563 
   564 
   564 
   565 goal thy
   565 Goal
   566    "!!Acts. [| finite I;  id: Acts |] \
   566    "!!Acts. [| finite I;  id: Acts |] \
   567 \           ==> (ALL i:I. leadsTo Acts (A i) (A' i Un C)) -->  \
   567 \           ==> (ALL i:I. leadsTo Acts (A i) (A' i Un C)) -->  \
   568 \               (ALL i:I. constrains Acts (A' i) (A' i Un C)) --> \
   568 \               (ALL i:I. constrains Acts (A' i) (A' i Un C)) --> \
   569 \               leadsTo Acts (INT i:I. A i) ((INT i:I. A' i) Un C)";
   569 \               leadsTo Acts (INT i:I. A i) ((INT i:I. A' i) Un C)";
   570 by (etac finite_induct 1);
   570 by (etac finite_induct 1);