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 |