4776
|
1 |
(* Title: HOL/UNITY/UNITY
|
|
2 |
ID: $Id$
|
|
3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory
|
|
4 |
Copyright 1998 University of Cambridge
|
|
5 |
|
|
6 |
The basic UNITY theory (revised version, based upon the "co" operator)
|
|
7 |
|
|
8 |
From Misra, "A Logic for Concurrent Programming", 1994
|
|
9 |
*)
|
|
10 |
|
|
11 |
set proof_timing;
|
|
12 |
HOL_quantifiers := false;
|
|
13 |
|
|
14 |
|
|
15 |
(*** constrains ***)
|
|
16 |
|
|
17 |
val prems = goalw thy [constrains_def]
|
|
18 |
"(!!act s s'. [| act: Acts; (s,s') : act; s: A |] ==> s': A') \
|
|
19 |
\ ==> constrains Acts A A'";
|
|
20 |
by (blast_tac (claset() addIs prems) 1);
|
|
21 |
qed "constrainsI";
|
|
22 |
|
5069
|
23 |
Goalw [constrains_def]
|
5111
|
24 |
"[| constrains Acts A A'; act: Acts; (s,s'): act; s: A |] \
|
4776
|
25 |
\ ==> s': A'";
|
|
26 |
by (Blast_tac 1);
|
|
27 |
qed "constrainsD";
|
|
28 |
|
5069
|
29 |
Goalw [constrains_def] "constrains Acts {} B";
|
4776
|
30 |
by (Blast_tac 1);
|
|
31 |
qed "constrains_empty";
|
|
32 |
|
5069
|
33 |
Goalw [constrains_def] "constrains Acts A UNIV";
|
4776
|
34 |
by (Blast_tac 1);
|
|
35 |
qed "constrains_UNIV";
|
|
36 |
AddIffs [constrains_empty, constrains_UNIV];
|
|
37 |
|
5069
|
38 |
Goalw [constrains_def]
|
5111
|
39 |
"[| constrains Acts A A'; A'<=B' |] ==> constrains Acts A B'";
|
4776
|
40 |
by (Blast_tac 1);
|
|
41 |
qed "constrains_weaken_R";
|
|
42 |
|
5069
|
43 |
Goalw [constrains_def]
|
5111
|
44 |
"[| constrains Acts A A'; B<=A |] ==> constrains Acts B A'";
|
4776
|
45 |
by (Blast_tac 1);
|
|
46 |
qed "constrains_weaken_L";
|
|
47 |
|
5069
|
48 |
Goalw [constrains_def]
|
5111
|
49 |
"[| constrains Acts A A'; B<=A; A'<=B' |] ==> constrains Acts B B'";
|
4776
|
50 |
by (Blast_tac 1);
|
|
51 |
qed "constrains_weaken";
|
|
52 |
|
|
53 |
(*Set difference: UNUSED*)
|
5069
|
54 |
Goalw [constrains_def]
|
5111
|
55 |
"[| constrains Acts (A-B) C; constrains Acts B C |] \
|
4776
|
56 |
\ ==> constrains Acts A C";
|
|
57 |
by (Blast_tac 1);
|
|
58 |
qed "constrains_Diff";
|
|
59 |
|
|
60 |
(** Union **)
|
|
61 |
|
5069
|
62 |
Goalw [constrains_def]
|
5111
|
63 |
"[| constrains Acts A A'; constrains Acts B B' |] \
|
4776
|
64 |
\ ==> constrains Acts (A Un B) (A' Un B')";
|
|
65 |
by (Blast_tac 1);
|
|
66 |
qed "constrains_Un";
|
|
67 |
|
5069
|
68 |
Goalw [constrains_def]
|
5111
|
69 |
"ALL i:I. constrains Acts (A i) (A' i) \
|
4776
|
70 |
\ ==> constrains Acts (UN i:I. A i) (UN i:I. A' i)";
|
|
71 |
by (Blast_tac 1);
|
|
72 |
qed "ball_constrains_UN";
|
|
73 |
|
5069
|
74 |
Goalw [constrains_def]
|
5111
|
75 |
"[| ALL i. constrains Acts (A i) (A' i) |] \
|
4776
|
76 |
\ ==> constrains Acts (UN i. A i) (UN i. A' i)";
|
|
77 |
by (Blast_tac 1);
|
|
78 |
qed "all_constrains_UN";
|
|
79 |
|
|
80 |
(** Intersection **)
|
|
81 |
|
5069
|
82 |
Goalw [constrains_def]
|
5111
|
83 |
"[| constrains Acts A A'; constrains Acts B B' |] \
|
4776
|
84 |
\ ==> constrains Acts (A Int B) (A' Int B')";
|
|
85 |
by (Blast_tac 1);
|
|
86 |
qed "constrains_Int";
|
|
87 |
|
5069
|
88 |
Goalw [constrains_def]
|
5111
|
89 |
"ALL i:I. constrains Acts (A i) (A' i) \
|
4776
|
90 |
\ ==> constrains Acts (INT i:I. A i) (INT i:I. A' i)";
|
|
91 |
by (Blast_tac 1);
|
|
92 |
qed "ball_constrains_INT";
|
|
93 |
|
5069
|
94 |
Goalw [constrains_def]
|
5111
|
95 |
"[| ALL i. constrains Acts (A i) (A' i) |] \
|
4776
|
96 |
\ ==> constrains Acts (INT i. A i) (INT i. A' i)";
|
|
97 |
by (Blast_tac 1);
|
|
98 |
qed "all_constrains_INT";
|
|
99 |
|
5069
|
100 |
Goalw [stable_def, constrains_def]
|
5111
|
101 |
"[| stable Acts C; constrains Acts A (C Un A') |] \
|
4776
|
102 |
\ ==> constrains Acts (C Un A) (C Un A')";
|
|
103 |
by (Blast_tac 1);
|
|
104 |
qed "stable_constrains_Un";
|
|
105 |
|
5069
|
106 |
Goalw [stable_def, constrains_def]
|
5111
|
107 |
"[| stable Acts C; constrains Acts (C Int A) A' |] \
|
4776
|
108 |
\ ==> constrains Acts (C Int A) (C Int A')";
|
|
109 |
by (Blast_tac 1);
|
|
110 |
qed "stable_constrains_Int";
|
|
111 |
|
|
112 |
|
|
113 |
(*** stable ***)
|
|
114 |
|
5069
|
115 |
Goalw [stable_def]
|
5111
|
116 |
"constrains Acts A A ==> stable Acts A";
|
4776
|
117 |
by (assume_tac 1);
|
|
118 |
qed "stableI";
|
|
119 |
|
5069
|
120 |
Goalw [stable_def]
|
5111
|
121 |
"stable Acts A ==> constrains Acts A A";
|
4776
|
122 |
by (assume_tac 1);
|
|
123 |
qed "stableD";
|
|
124 |
|
5069
|
125 |
Goalw [stable_def]
|
5111
|
126 |
"[| stable Acts A; stable Acts A' |] \
|
4776
|
127 |
\ ==> stable Acts (A Un A')";
|
|
128 |
by (blast_tac (claset() addIs [constrains_Un]) 1);
|
|
129 |
qed "stable_Un";
|
|
130 |
|
5069
|
131 |
Goalw [stable_def]
|
5111
|
132 |
"[| stable Acts A; stable Acts A' |] \
|
4776
|
133 |
\ ==> stable Acts (A Int A')";
|
|
134 |
by (blast_tac (claset() addIs [constrains_Int]) 1);
|
|
135 |
qed "stable_Int";
|
|
136 |
|
5069
|
137 |
Goalw [constrains_def]
|
5111
|
138 |
"[| constrains Acts A A'; id: Acts |] ==> A<=A'";
|
4776
|
139 |
by (Blast_tac 1);
|
|
140 |
qed "constrains_imp_subset";
|
|
141 |
|
|
142 |
|
5069
|
143 |
Goalw [constrains_def]
|
5111
|
144 |
"[| id: Acts; constrains Acts A B; constrains Acts B C |] \
|
4776
|
145 |
\ ==> constrains Acts A C";
|
|
146 |
by (Blast_tac 1);
|
|
147 |
qed "constrains_trans";
|
|
148 |
|
|
149 |
|
|
150 |
(*The Elimination Theorem. The "free" m has become universally quantified!
|
|
151 |
Should the premise be !!m instead of ALL m ? Would make it harder to use
|
|
152 |
in forward proof.*)
|
5069
|
153 |
Goalw [constrains_def]
|
5111
|
154 |
"[| ALL m. constrains Acts {s. s x = m} (B m) |] \
|
4776
|
155 |
\ ==> constrains Acts {s. P(s x)} (UN m. {s. P(m)} Int B m)";
|
|
156 |
by (Blast_tac 1);
|
|
157 |
qed "elimination";
|
|
158 |
|
|
159 |
(*As above, but for the trivial case of a one-variable state, in which the
|
|
160 |
state is identified with its one variable.*)
|
5069
|
161 |
Goalw [constrains_def]
|
5111
|
162 |
"[| ALL m. constrains Acts {m} (B m) |] \
|
4776
|
163 |
\ ==> constrains Acts {s. P s} (UN m. {s. P(m)} Int B m)";
|
|
164 |
by (Blast_tac 1);
|
|
165 |
qed "elimination_sing";
|
|
166 |
|
|
167 |
|
5069
|
168 |
Goalw [constrains_def]
|
5111
|
169 |
"[| constrains Acts A (A' Un B); constrains Acts B B'; id: Acts |] \
|
4776
|
170 |
\ ==> constrains Acts A (A' Un B')";
|
|
171 |
by (Blast_tac 1);
|
|
172 |
qed "constrains_cancel";
|
|
173 |
|
|
174 |
|
|
175 |
|
|
176 |
(*** Theoretical Results from Section 6 ***)
|
|
177 |
|
5069
|
178 |
Goalw [constrains_def, strongest_rhs_def]
|
4776
|
179 |
"constrains Acts A (strongest_rhs Acts A )";
|
|
180 |
by (Blast_tac 1);
|
|
181 |
qed "constrains_strongest_rhs";
|
|
182 |
|
5069
|
183 |
Goalw [constrains_def, strongest_rhs_def]
|
5111
|
184 |
"constrains Acts A B ==> strongest_rhs Acts A <= B";
|
4776
|
185 |
by (Blast_tac 1);
|
|
186 |
qed "strongest_rhs_is_strongest";
|