src/HOL/UNITY/Deadlock.ML
changeset 7127 48e235179ffb
parent 6536 281d44905cab
child 8334 7896bcbd8641
equal deleted inserted replaced
7126:fdb397af4cab 7127:48e235179ffb
     7     Misra, "A Logic for Concurrent Programming", 1994
     7     Misra, "A Logic for Concurrent Programming", 1994
     8 *)
     8 *)
     9 
     9 
    10 (*Trivial, two-process case*)
    10 (*Trivial, two-process case*)
    11 Goalw [constrains_def, stable_def]
    11 Goalw [constrains_def, stable_def]
    12     "[| F : (A Int B) co A;  F : (B Int A) co B |] \
    12     "[| F : (A Int B) co A;  F : (B Int A) co B |] ==> F : stable (A Int B)";
    13 \    ==> F : stable (A Int B)";
       
    14 by (Blast_tac 1);
    13 by (Blast_tac 1);
    15 result();
    14 result();
    16 
    15 
    17 
    16 
    18 (*a simplification step*)
    17 (*a simplification step*)
    19 Goal "(INT i: atMost n. A(Suc i) Int A i) = \
    18 Goal "(INT i: atMost n. A(Suc i) Int A i) = (INT i: atMost (Suc n). A i)";
    20 \     (INT i: atMost (Suc n). A i)";
       
    21 by (induct_tac "n" 1);
    19 by (induct_tac "n" 1);
    22 by (ALLGOALS (asm_simp_tac (simpset() addsimps [atMost_Suc])));
    20 by (ALLGOALS (asm_simp_tac (simpset() addsimps [atMost_Suc])));
    23 by (blast_tac (claset() addEs [le_SucE] addSEs [equalityE]) 1);
    21 by (blast_tac (claset() addEs [le_SucE] addSEs [equalityE]) 1);
    24 qed "Collect_le_Int_equals";
    22 qed "Collect_le_Int_equals";
    25 
    23 
    26 
    24 
    27 (*Dual of the required property.  Converse inclusion fails.*)
    25 (*Dual of the required property.  Converse inclusion fails.*)
    28 Goal "(UN i: lessThan n. A i) Int -(A n) <=  \
    26 Goal "(UN i: lessThan n. A i) Int (- A n) <=  \
    29 \     (UN i: lessThan n. (A i) Int -(A(Suc i)))";
    27 \     (UN i: lessThan n. (A i) Int (- A (Suc i)))";
    30 by (induct_tac "n" 1);
    28 by (induct_tac "n" 1);
    31 by (Asm_simp_tac 1);
    29 by (Asm_simp_tac 1);
    32 by (simp_tac (simpset() addsimps [lessThan_Suc]) 1);
    30 by (simp_tac (simpset() addsimps [lessThan_Suc]) 1);
    33 by (Blast_tac 1);
    31 by (Blast_tac 1);
    34 qed "UN_Int_Compl_subset";
    32 qed "UN_Int_Compl_subset";
    54 Goal "(INT i: atMost n. A i) = \
    52 Goal "(INT i: atMost n. A i) = \
    55 \         A 0 Int (INT i: lessThan n. -A i Un A(Suc i))";
    53 \         A 0 Int (INT i: lessThan n. -A i Un A(Suc i))";
    56 by (induct_tac "n" 1);
    54 by (induct_tac "n" 1);
    57 by (Asm_simp_tac 1);
    55 by (Asm_simp_tac 1);
    58 by (asm_simp_tac
    56 by (asm_simp_tac
    59     (simpset() addsimps Int_ac @
    57     (simpset() addsimps Int_ac @ [Int_Un_distrib, Int_Un_distrib2, lemma,
    60 			[Int_Un_distrib, Int_Un_distrib2, lemma,
    58 				  lessThan_Suc, atMost_Suc]) 1);
    61 			 lessThan_Suc, atMost_Suc]) 1);
       
    62 qed "INT_le_equals_Int";
    59 qed "INT_le_equals_Int";
    63 
    60 
    64 Goal "(INT i: atMost (Suc n). A i) = \
    61 Goal "(INT i: atMost (Suc n). A i) = \
    65 \         A 0 Int (INT i: atMost n. -A i Un A(Suc i))";
    62 \     A 0 Int (INT i: atMost n. -A i Un A(Suc i))";
    66 by (simp_tac (simpset() addsimps [lessThan_Suc_atMost, INT_le_equals_Int]) 1);
    63 by (simp_tac (simpset() addsimps [lessThan_Suc_atMost, INT_le_equals_Int]) 1);
    67 qed "INT_le_Suc_equals_Int";
    64 qed "INT_le_Suc_equals_Int";
    68 
    65 
    69 
    66 
    70 (*The final deadlock example*)
    67 (*The final deadlock example*)
    71 val [zeroprem, allprem] = goalw thy [stable_def]
    68 val [zeroprem, allprem] = goalw thy [stable_def]
    72     "[| F : (A 0 Int A (Suc n)) co (A 0);  \
    69     "[| F : (A 0 Int A (Suc n)) co (A 0);  \
    73 \       ALL i: atMost n. F : (A(Suc i) Int A i) co \
    70 \       ALL i: atMost n. F : (A(Suc i) Int A i) co \
    74 \                            (-A i Un A(Suc i)) |] \
    71 \                            (-A i Un A(Suc i)) |] \
    75 \    ==> F : stable (INT i: atMost (Suc n). A i)";
    72 \    ==> F : stable (INT i: atMost (Suc n). A i)";
    76 
       
    77 by (rtac ([zeroprem, allprem RS ball_constrains_INT] MRS 
    73 by (rtac ([zeroprem, allprem RS ball_constrains_INT] MRS 
    78     constrains_Int RS constrains_weaken) 1);
    74 	  constrains_Int RS constrains_weaken) 1);
    79 by (simp_tac (simpset() addsimps [Collect_le_Int_equals, 
    75 by (simp_tac (simpset() addsimps [Collect_le_Int_equals, 
    80 				  Int_assoc, INT_absorb]) 1);
    76 				  Int_assoc, INT_absorb]) 1);
    81 by (simp_tac (simpset() addsimps [INT_le_Suc_equals_Int]) 1);
    77 by (simp_tac (simpset() addsimps [INT_le_Suc_equals_Int]) 1);
    82 result();
    78 result();
    83 
    79