author | berghofe |
Sat, 13 Dec 2008 17:13:09 +0100 | |
changeset 29101 | 66fe138979f4 |
parent 27239 | f2f42f9fa09d |
child 30235 | 58d147683393 |
permissions | -rw-r--r-- |
12857 | 1 |
(* Title: HOL/Bali/Basis.thy |
12854 | 2 |
ID: $Id$ |
3 |
Author: David von Oheimb |
|
4 |
||
5 |
*) |
|
6 |
header {* Definitions extending HOL as logical basis of Bali *} |
|
7 |
||
16417 | 8 |
theory Basis imports Main begin |
12854 | 9 |
|
24178
4ff1dc2aa18d
turned Unify flags into configuration options (global only);
wenzelm
parents:
24162
diff
changeset
|
10 |
declare [[unify_search_bound = 40, unify_trace_bound = 40]] |
4ff1dc2aa18d
turned Unify flags into configuration options (global only);
wenzelm
parents:
24162
diff
changeset
|
11 |
|
12854 | 12 |
|
13 |
section "misc" |
|
14 |
||
15 |
declare same_fstI [intro!] (*### TO HOL/Wellfounded_Relations *) |
|
16 |
||
17 |
declare split_if_asm [split] option.split [split] option.split_asm [split] |
|
24019 | 18 |
declaration {* K (Simplifier.map_ss (fn ss => ss addloop ("split_all_tac", split_all_tac))) *} |
12854 | 19 |
declare if_weak_cong [cong del] option.weak_case_cong [cong del] |
18447 | 20 |
declare length_Suc_conv [iff] |
21 |
||
12854 | 22 |
lemma Collect_split_eq: "{p. P (split f p)} = {(a,b). P (f a b)}" |
23 |
apply auto |
|
24 |
done |
|
25 |
||
26 |
lemma subset_insertD: |
|
27 |
"A <= insert x B ==> A <= B & x ~: A | (EX B'. A = insert x B' & B' <= B)" |
|
28 |
apply (case_tac "x:A") |
|
29 |
apply (rule disjI2) |
|
30 |
apply (rule_tac x = "A-{x}" in exI) |
|
31 |
apply fast+ |
|
32 |
done |
|
33 |
||
34 |
syntax |
|
12925
99131847fb93
Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents:
12919
diff
changeset
|
35 |
"3" :: nat ("3") |
12854 | 36 |
"4" :: nat ("4") |
37 |
translations |
|
38 |
"3" == "Suc 2" |
|
39 |
"4" == "Suc 3" |
|
40 |
||
41 |
(*unused*) |
|
42 |
lemma range_bool_domain: "range f = {f True, f False}" |
|
43 |
apply auto |
|
44 |
apply (case_tac "xa") |
|
45 |
apply auto |
|
46 |
done |
|
47 |
||
13867 | 48 |
(* irrefl_tranclI in Transitive_Closure.thy is more general *) |
12854 | 49 |
lemma irrefl_tranclI': "r^-1 Int r^+ = {} ==> !x. (x, x) ~: r^+" |
13867 | 50 |
by(blast elim: tranclE dest: trancl_into_rtrancl) |
51 |
||
12854 | 52 |
|
53 |
lemma trancl_rtrancl_trancl: |
|
54 |
"\<lbrakk>(x,y)\<in>r^+; (y,z)\<in>r^*\<rbrakk> \<Longrightarrow> (x,z)\<in>r^+" |
|
55 |
by (auto dest: tranclD rtrancl_trans rtrancl_into_trancl2) |
|
56 |
||
57 |
lemma rtrancl_into_trancl3: |
|
12925
99131847fb93
Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents:
12919
diff
changeset
|
58 |
"\<lbrakk>(a,b)\<in>r^*; a\<noteq>b\<rbrakk> \<Longrightarrow> (a,b)\<in>r^+" |
12854 | 59 |
apply (drule rtranclD) |
60 |
apply auto |
|
61 |
done |
|
62 |
||
63 |
lemma rtrancl_into_rtrancl2: |
|
64 |
"\<lbrakk> (a, b) \<in> r; (b, c) \<in> r^* \<rbrakk> \<Longrightarrow> (a, c) \<in> r^*" |
|
65 |
by (auto intro: r_into_rtrancl rtrancl_trans) |
|
66 |
||
67 |
lemma triangle_lemma: |
|
68 |
"\<lbrakk> \<And> a b c. \<lbrakk>(a,b)\<in>r; (a,c)\<in>r\<rbrakk> \<Longrightarrow> b=c; (a,x)\<in>r\<^sup>*; (a,y)\<in>r\<^sup>*\<rbrakk> |
|
69 |
\<Longrightarrow> (x,y)\<in>r\<^sup>* \<or> (y,x)\<in>r\<^sup>*" |
|
70 |
proof - |
|
71 |
note converse_rtrancl_induct = converse_rtrancl_induct [consumes 1] |
|
72 |
note converse_rtranclE = converse_rtranclE [consumes 1] |
|
73 |
assume unique: "\<And> a b c. \<lbrakk>(a,b)\<in>r; (a,c)\<in>r\<rbrakk> \<Longrightarrow> b=c" |
|
74 |
assume "(a,x)\<in>r\<^sup>*" |
|
75 |
then show "(a,y)\<in>r\<^sup>* \<Longrightarrow> (x,y)\<in>r\<^sup>* \<or> (y,x)\<in>r\<^sup>*" |
|
76 |
proof (induct rule: converse_rtrancl_induct) |
|
77 |
assume "(x,y)\<in>r\<^sup>*" |
|
78 |
then show ?thesis |
|
79 |
by blast |
|
80 |
next |
|
81 |
fix a v |
|
82 |
assume a_v_r: "(a, v) \<in> r" and |
|
83 |
v_x_rt: "(v, x) \<in> r\<^sup>*" and |
|
84 |
a_y_rt: "(a, y) \<in> r\<^sup>*" and |
|
85 |
hyp: "(v, y) \<in> r\<^sup>* \<Longrightarrow> (x, y) \<in> r\<^sup>* \<or> (y, x) \<in> r\<^sup>*" |
|
86 |
from a_y_rt |
|
87 |
show "(x, y) \<in> r\<^sup>* \<or> (y, x) \<in> r\<^sup>*" |
|
88 |
proof (cases rule: converse_rtranclE) |
|
89 |
assume "a=y" |
|
90 |
with a_v_r v_x_rt have "(y,x) \<in> r\<^sup>*" |
|
91 |
by (auto intro: r_into_rtrancl rtrancl_trans) |
|
92 |
then show ?thesis |
|
93 |
by blast |
|
94 |
next |
|
95 |
fix w |
|
96 |
assume a_w_r: "(a, w) \<in> r" and |
|
97 |
w_y_rt: "(w, y) \<in> r\<^sup>*" |
|
98 |
from a_v_r a_w_r unique |
|
99 |
have "v=w" |
|
100 |
by auto |
|
101 |
with w_y_rt hyp |
|
102 |
show ?thesis |
|
103 |
by blast |
|
104 |
qed |
|
105 |
qed |
|
106 |
qed |
|
107 |
||
108 |
||
109 |
lemma rtrancl_cases [consumes 1, case_names Refl Trancl]: |
|
110 |
"\<lbrakk>(a,b)\<in>r\<^sup>*; a = b \<Longrightarrow> P; (a,b)\<in>r\<^sup>+ \<Longrightarrow> P\<rbrakk> \<Longrightarrow> P" |
|
111 |
apply (erule rtranclE) |
|
112 |
apply (auto dest: rtrancl_into_trancl1) |
|
113 |
done |
|
114 |
||
115 |
(* ### To Transitive_Closure *) |
|
116 |
theorems converse_rtrancl_induct |
|
117 |
= converse_rtrancl_induct [consumes 1,case_names Id Step] |
|
118 |
||
119 |
theorems converse_trancl_induct |
|
120 |
= converse_trancl_induct [consumes 1,case_names Single Step] |
|
121 |
||
122 |
(* context (theory "Set") *) |
|
123 |
lemma Ball_weaken:"\<lbrakk>Ball s P;\<And> x. P x\<longrightarrow>Q x\<rbrakk>\<Longrightarrow>Ball s Q" |
|
124 |
by auto |
|
125 |
||
126 |
(* context (theory "Finite") *) |
|
127 |
lemma finite_SetCompr2: "[| finite (Collect P); !y. P y --> finite (range (f y)) |] ==> |
|
128 |
finite {f y x |x y. P y}" |
|
129 |
apply (subgoal_tac "{f y x |x y. P y} = UNION (Collect P) (%y. range (f y))") |
|
130 |
prefer 2 apply fast |
|
131 |
apply (erule ssubst) |
|
132 |
apply (erule finite_UN_I) |
|
133 |
apply fast |
|
134 |
done |
|
135 |
||
136 |
||
137 |
(* ### TO theory "List" *) |
|
138 |
lemma list_all2_trans: "\<forall> a b c. P1 a b \<longrightarrow> P2 b c \<longrightarrow> P3 a c \<Longrightarrow> |
|
139 |
\<forall>xs2 xs3. list_all2 P1 xs1 xs2 \<longrightarrow> list_all2 P2 xs2 xs3 \<longrightarrow> list_all2 P3 xs1 xs3" |
|
140 |
apply (induct_tac "xs1") |
|
141 |
apply simp |
|
142 |
apply (rule allI) |
|
143 |
apply (induct_tac "xs2") |
|
144 |
apply simp |
|
145 |
apply (rule allI) |
|
146 |
apply (induct_tac "xs3") |
|
147 |
apply auto |
|
148 |
done |
|
149 |
||
150 |
||
151 |
section "pairs" |
|
152 |
||
153 |
lemma surjective_pairing5: "p = (fst p, fst (snd p), fst (snd (snd p)), fst (snd (snd (snd p))), |
|
154 |
snd (snd (snd (snd p))))" |
|
155 |
apply auto |
|
156 |
done |
|
157 |
||
158 |
lemma fst_splitE [elim!]: |
|
159 |
"[| fst s' = x'; !!x s. [| s' = (x,s); x = x' |] ==> Q |] ==> Q" |
|
26349 | 160 |
by (cases s') auto |
12854 | 161 |
|
162 |
lemma fst_in_set_lemma [rule_format (no_asm)]: "(x, y) : set l --> x : fst ` set l" |
|
163 |
apply (induct_tac "l") |
|
164 |
apply auto |
|
165 |
done |
|
166 |
||
167 |
||
168 |
section "quantifiers" |
|
169 |
||
170 |
lemma All_Ex_refl_eq2 [simp]: |
|
171 |
"(!x. (? b. x = f b & Q b) \<longrightarrow> P x) = (!b. Q b --> P (f b))" |
|
172 |
apply auto |
|
173 |
done |
|
174 |
||
175 |
lemma ex_ex_miniscope1 [simp]: |
|
176 |
"(EX w v. P w v & Q v) = (EX v. (EX w. P w v) & Q v)" |
|
177 |
apply auto |
|
178 |
done |
|
179 |
||
180 |
lemma ex_miniscope2 [simp]: |
|
181 |
"(EX v. P v & Q & R v) = (Q & (EX v. P v & R v))" |
|
182 |
apply auto |
|
183 |
done |
|
184 |
||
185 |
lemma ex_reorder31: "(\<exists>z x y. P x y z) = (\<exists>x y z. P x y z)" |
|
186 |
apply auto |
|
187 |
done |
|
188 |
||
189 |
lemma All_Ex_refl_eq1 [simp]: "(!x. (? b. x = f b) --> P x) = (!b. P (f b))" |
|
190 |
apply auto |
|
191 |
done |
|
192 |
||
193 |
||
194 |
section "sums" |
|
195 |
||
196 |
hide const In0 In1 |
|
197 |
||
198 |
syntax |
|
199 |
fun_sum :: "('a => 'c) => ('b => 'c) => (('a+'b) => 'c)" (infixr "'(+')"80) |
|
200 |
translations |
|
22781 | 201 |
"fun_sum" == "CONST sum_case" |
12854 | 202 |
|
203 |
consts the_Inl :: "'a + 'b \<Rightarrow> 'a" |
|
204 |
the_Inr :: "'a + 'b \<Rightarrow> 'b" |
|
205 |
primrec "the_Inl (Inl a) = a" |
|
206 |
primrec "the_Inr (Inr b) = b" |
|
207 |
||
208 |
datatype ('a, 'b, 'c) sum3 = In1 'a | In2 'b | In3 'c |
|
209 |
||
210 |
consts the_In1 :: "('a, 'b, 'c) sum3 \<Rightarrow> 'a" |
|
211 |
the_In2 :: "('a, 'b, 'c) sum3 \<Rightarrow> 'b" |
|
212 |
the_In3 :: "('a, 'b, 'c) sum3 \<Rightarrow> 'c" |
|
213 |
primrec "the_In1 (In1 a) = a" |
|
214 |
primrec "the_In2 (In2 b) = b" |
|
215 |
primrec "the_In3 (In3 c) = c" |
|
216 |
||
217 |
syntax |
|
218 |
In1l :: "'al \<Rightarrow> ('al + 'ar, 'b, 'c) sum3" |
|
219 |
In1r :: "'ar \<Rightarrow> ('al + 'ar, 'b, 'c) sum3" |
|
220 |
translations |
|
221 |
"In1l e" == "In1 (Inl e)" |
|
222 |
"In1r c" == "In1 (Inr c)" |
|
223 |
||
13688
a0b16d42d489
"Definite Assignment Analysis" included, with proof of correctness. Large adjustments of type safety proof and soundness proof of the axiomatic semantics were necessary. Completeness proof of the loop rule of the axiomatic semantic was altered. So the additional polymorphic variants of some rules could be removed.
schirmer
parents:
13462
diff
changeset
|
224 |
syntax the_In1l :: "('al + 'ar, 'b, 'c) sum3 \<Rightarrow> 'al" |
a0b16d42d489
"Definite Assignment Analysis" included, with proof of correctness. Large adjustments of type safety proof and soundness proof of the axiomatic semantics were necessary. Completeness proof of the loop rule of the axiomatic semantic was altered. So the additional polymorphic variants of some rules could be removed.
schirmer
parents:
13462
diff
changeset
|
225 |
the_In1r :: "('al + 'ar, 'b, 'c) sum3 \<Rightarrow> 'ar" |
a0b16d42d489
"Definite Assignment Analysis" included, with proof of correctness. Large adjustments of type safety proof and soundness proof of the axiomatic semantics were necessary. Completeness proof of the loop rule of the axiomatic semantic was altered. So the additional polymorphic variants of some rules could be removed.
schirmer
parents:
13462
diff
changeset
|
226 |
translations |
a0b16d42d489
"Definite Assignment Analysis" included, with proof of correctness. Large adjustments of type safety proof and soundness proof of the axiomatic semantics were necessary. Completeness proof of the loop rule of the axiomatic semantic was altered. So the additional polymorphic variants of some rules could be removed.
schirmer
parents:
13462
diff
changeset
|
227 |
"the_In1l" == "the_Inl \<circ> the_In1" |
a0b16d42d489
"Definite Assignment Analysis" included, with proof of correctness. Large adjustments of type safety proof and soundness proof of the axiomatic semantics were necessary. Completeness proof of the loop rule of the axiomatic semantic was altered. So the additional polymorphic variants of some rules could be removed.
schirmer
parents:
13462
diff
changeset
|
228 |
"the_In1r" == "the_Inr \<circ> the_In1" |
a0b16d42d489
"Definite Assignment Analysis" included, with proof of correctness. Large adjustments of type safety proof and soundness proof of the axiomatic semantics were necessary. Completeness proof of the loop rule of the axiomatic semantic was altered. So the additional polymorphic variants of some rules could be removed.
schirmer
parents:
13462
diff
changeset
|
229 |
|
12854 | 230 |
ML {* |
27226 | 231 |
fun sum3_instantiate ctxt thm = map (fn s => |
232 |
simplify (Simplifier.local_simpset_of ctxt delsimps[@{thm not_None_eq}]) |
|
27239 | 233 |
(read_instantiate ctxt [(("t", 0), "In" ^ s ^ " ?x")] thm)) ["1l","2","3","1r"] |
12854 | 234 |
*} |
235 |
(* e.g. lemmas is_stmt_rews = is_stmt_def [of "In1l x", simplified] *) |
|
236 |
||
237 |
translations |
|
24194 | 238 |
"option"<= (type) "Datatype.option" |
12854 | 239 |
"list" <= (type) "List.list" |
240 |
"sum3" <= (type) "Basis.sum3" |
|
241 |
||
242 |
||
243 |
section "quantifiers for option type" |
|
244 |
||
245 |
syntax |
|
246 |
Oall :: "[pttrn, 'a option, bool] => bool" ("(3! _:_:/ _)" [0,0,10] 10) |
|
247 |
Oex :: "[pttrn, 'a option, bool] => bool" ("(3? _:_:/ _)" [0,0,10] 10) |
|
248 |
||
249 |
syntax (symbols) |
|
250 |
Oall :: "[pttrn, 'a option, bool] => bool" ("(3\<forall>_\<in>_:/ _)" [0,0,10] 10) |
|
251 |
Oex :: "[pttrn, 'a option, bool] => bool" ("(3\<exists>_\<in>_:/ _)" [0,0,10] 10) |
|
252 |
||
253 |
translations |
|
254 |
"! x:A: P" == "! x:o2s A. P" |
|
255 |
"? x:A: P" == "? x:o2s A. P" |
|
256 |
||
19323 | 257 |
section "Special map update" |
258 |
||
259 |
text{* Deemed too special for theory Map. *} |
|
260 |
||
261 |
constdefs |
|
262 |
chg_map :: "('b => 'b) => 'a => ('a ~=> 'b) => ('a ~=> 'b)" |
|
263 |
"chg_map f a m == case m a of None => m | Some b => m(a|->f b)" |
|
264 |
||
265 |
lemma chg_map_new[simp]: "m a = None ==> chg_map f a m = m" |
|
266 |
by (unfold chg_map_def, auto) |
|
267 |
||
268 |
lemma chg_map_upd[simp]: "m a = Some b ==> chg_map f a m = m(a|->f b)" |
|
269 |
by (unfold chg_map_def, auto) |
|
270 |
||
271 |
lemma chg_map_other [simp]: "a \<noteq> b \<Longrightarrow> chg_map f a m b = m b" |
|
272 |
by (auto simp: chg_map_def split add: option.split) |
|
273 |
||
12854 | 274 |
|
275 |
section "unique association lists" |
|
276 |
||
277 |
constdefs |
|
278 |
unique :: "('a \<times> 'b) list \<Rightarrow> bool" |
|
12893 | 279 |
"unique \<equiv> distinct \<circ> map fst" |
12854 | 280 |
|
281 |
lemma uniqueD [rule_format (no_asm)]: |
|
282 |
"unique l--> (!x y. (x,y):set l --> (!x' y'. (x',y'):set l --> x=x'--> y=y'))" |
|
283 |
apply (unfold unique_def o_def) |
|
284 |
apply (induct_tac "l") |
|
285 |
apply (auto dest: fst_in_set_lemma) |
|
286 |
done |
|
287 |
||
288 |
lemma unique_Nil [simp]: "unique []" |
|
289 |
apply (unfold unique_def) |
|
290 |
apply (simp (no_asm)) |
|
291 |
done |
|
292 |
||
293 |
lemma unique_Cons [simp]: "unique ((x,y)#l) = (unique l & (!y. (x,y) ~: set l))" |
|
294 |
apply (unfold unique_def) |
|
295 |
apply (auto dest: fst_in_set_lemma) |
|
296 |
done |
|
297 |
||
298 |
lemmas unique_ConsI = conjI [THEN unique_Cons [THEN iffD2], standard] |
|
299 |
||
300 |
lemma unique_single [simp]: "!!p. unique [p]" |
|
301 |
apply auto |
|
302 |
done |
|
303 |
||
304 |
lemma unique_ConsD: "unique (x#xs) ==> unique xs" |
|
305 |
apply (simp add: unique_def) |
|
306 |
done |
|
307 |
||
308 |
lemma unique_append [rule_format (no_asm)]: "unique l' ==> unique l --> |
|
309 |
(!(x,y):set l. !(x',y'):set l'. x' ~= x) --> unique (l @ l')" |
|
310 |
apply (induct_tac "l") |
|
311 |
apply (auto dest: fst_in_set_lemma) |
|
312 |
done |
|
313 |
||
314 |
lemma unique_map_inj [rule_format (no_asm)]: "unique l --> inj f --> unique (map (%(k,x). (f k, g k x)) l)" |
|
315 |
apply (induct_tac "l") |
|
316 |
apply (auto dest: fst_in_set_lemma simp add: inj_eq) |
|
317 |
done |
|
318 |
||
319 |
lemma map_of_SomeI [rule_format (no_asm)]: "unique l --> (k, x) : set l --> map_of l k = Some x" |
|
320 |
apply (induct_tac "l") |
|
321 |
apply auto |
|
322 |
done |
|
323 |
||
324 |
||
325 |
section "list patterns" |
|
326 |
||
327 |
consts |
|
328 |
lsplit :: "[['a, 'a list] => 'b, 'a list] => 'b" |
|
329 |
defs |
|
330 |
lsplit_def: "lsplit == %f l. f (hd l) (tl l)" |
|
331 |
(* list patterns -- extends pre-defined type "pttrn" used in abstractions *) |
|
332 |
syntax |
|
333 |
"_lpttrn" :: "[pttrn,pttrn] => pttrn" ("_#/_" [901,900] 900) |
|
334 |
translations |
|
335 |
"%y#x#xs. b" == "lsplit (%y x#xs. b)" |
|
336 |
"%x#xs . b" == "lsplit (%x xs . b)" |
|
337 |
||
338 |
lemma lsplit [simp]: "lsplit c (x#xs) = c x xs" |
|
339 |
apply (unfold lsplit_def) |
|
340 |
apply (simp (no_asm)) |
|
341 |
done |
|
342 |
||
343 |
lemma lsplit2 [simp]: "lsplit P (x#xs) y z = P x xs y z" |
|
344 |
apply (unfold lsplit_def) |
|
345 |
apply simp |
|
346 |
done |
|
347 |
||
348 |
||
349 |
end |