121 |
121 |
122 (*** Distinctness of constructors ***) |
122 (*** Distinctness of constructors ***) |
123 |
123 |
124 (** Scons vs Atom **) |
124 (** Scons vs Atom **) |
125 |
125 |
126 goalw Univ.thy [Atom_def,Scons_def,Push_Node_def] "(M.N) ~= Atom(a)"; |
126 goalw Univ.thy [Atom_def,Scons_def,Push_Node_def] "(M$N) ~= Atom(a)"; |
127 by (rtac notI 1); |
127 by (rtac notI 1); |
128 by (etac (equalityD2 RS subsetD RS UnE) 1); |
128 by (etac (equalityD2 RS subsetD RS UnE) 1); |
129 by (rtac singletonI 1); |
129 by (rtac singletonI 1); |
130 by (REPEAT (eresolve_tac [imageE, Abs_Node_inject RS apfstE, |
130 by (REPEAT (eresolve_tac [imageE, Abs_Node_inject RS apfstE, |
131 Pair_inject, sym RS Push_neq_K0] 1 |
131 Pair_inject, sym RS Push_neq_K0] 1 |
180 val Push_Node_inject = result(); |
180 val Push_Node_inject = result(); |
181 |
181 |
182 |
182 |
183 (** Injectiveness of Scons **) |
183 (** Injectiveness of Scons **) |
184 |
184 |
185 val [major] = goalw Univ.thy [Scons_def] "M.N <= M'.N' ==> M<=M'"; |
185 val [major] = goalw Univ.thy [Scons_def] "M$N <= M'$N' ==> M<=M'"; |
186 by (cut_facts_tac [major] 1); |
186 by (cut_facts_tac [major] 1); |
187 by (fast_tac (set_cs addSDs [Suc_inject] |
187 by (fast_tac (set_cs addSDs [Suc_inject] |
188 addSEs [Push_Node_inject, Zero_neq_Suc]) 1); |
188 addSEs [Push_Node_inject, Zero_neq_Suc]) 1); |
189 val Scons_inject_lemma1 = result(); |
189 val Scons_inject_lemma1 = result(); |
190 |
190 |
191 val [major] = goalw Univ.thy [Scons_def] "M.N <= M'.N' ==> N<=N'"; |
191 val [major] = goalw Univ.thy [Scons_def] "M$N <= M'$N' ==> N<=N'"; |
192 by (cut_facts_tac [major] 1); |
192 by (cut_facts_tac [major] 1); |
193 by (fast_tac (set_cs addSDs [Suc_inject] |
193 by (fast_tac (set_cs addSDs [Suc_inject] |
194 addSEs [Push_Node_inject, Suc_neq_Zero]) 1); |
194 addSEs [Push_Node_inject, Suc_neq_Zero]) 1); |
195 val Scons_inject_lemma2 = result(); |
195 val Scons_inject_lemma2 = result(); |
196 |
196 |
197 val [major] = goal Univ.thy "M.N = M'.N' ==> M=M'"; |
197 val [major] = goal Univ.thy "M$N = M'$N' ==> M=M'"; |
198 by (rtac (major RS equalityE) 1); |
198 by (rtac (major RS equalityE) 1); |
199 by (REPEAT (ares_tac [equalityI, Scons_inject_lemma1] 1)); |
199 by (REPEAT (ares_tac [equalityI, Scons_inject_lemma1] 1)); |
200 val Scons_inject1 = result(); |
200 val Scons_inject1 = result(); |
201 |
201 |
202 val [major] = goal Univ.thy "M.N = M'.N' ==> N=N'"; |
202 val [major] = goal Univ.thy "M$N = M'$N' ==> N=N'"; |
203 by (rtac (major RS equalityE) 1); |
203 by (rtac (major RS equalityE) 1); |
204 by (REPEAT (ares_tac [equalityI, Scons_inject_lemma2] 1)); |
204 by (REPEAT (ares_tac [equalityI, Scons_inject_lemma2] 1)); |
205 val Scons_inject2 = result(); |
205 val Scons_inject2 = result(); |
206 |
206 |
207 val [major,minor] = goal Univ.thy |
207 val [major,minor] = goal Univ.thy |
208 "[| M.N = M'.N'; [| M=M'; N=N' |] ==> P \ |
208 "[| M$N = M'$N'; [| M=M'; N=N' |] ==> P \ |
209 \ |] ==> P"; |
209 \ |] ==> P"; |
210 by (rtac ((major RS Scons_inject2) RS ((major RS Scons_inject1) RS minor)) 1); |
210 by (rtac ((major RS Scons_inject2) RS ((major RS Scons_inject1) RS minor)) 1); |
211 val Scons_inject = result(); |
211 val Scons_inject = result(); |
212 |
212 |
213 (*rewrite rules*) |
213 (*rewrite rules*) |
214 goal Univ.thy "(Atom(a)=Atom(b)) = (a=b)"; |
214 goal Univ.thy "(Atom(a)=Atom(b)) = (a=b)"; |
215 by (fast_tac (HOL_cs addSEs [Atom_inject]) 1); |
215 by (fast_tac (HOL_cs addSEs [Atom_inject]) 1); |
216 val Atom_Atom_eq = result(); |
216 val Atom_Atom_eq = result(); |
217 |
217 |
218 goal Univ.thy "(M.N = M'.N') = (M=M' & N=N')"; |
218 goal Univ.thy "(M$N = M'$N') = (M=M' & N=N')"; |
219 by (fast_tac (HOL_cs addSEs [Scons_inject]) 1); |
219 by (fast_tac (HOL_cs addSEs [Scons_inject]) 1); |
220 val Scons_Scons_eq = result(); |
220 val Scons_Scons_eq = result(); |
221 |
221 |
222 (*** Distinctness involving Leaf and Numb ***) |
222 (*** Distinctness involving Leaf and Numb ***) |
223 |
223 |
224 (** Scons vs Leaf **) |
224 (** Scons vs Leaf **) |
225 |
225 |
226 goalw Univ.thy [Leaf_def] "(M.N) ~= Leaf(a)"; |
226 goalw Univ.thy [Leaf_def] "(M$N) ~= Leaf(a)"; |
227 by (stac o_def 1); |
227 by (stac o_def 1); |
228 by (rtac Scons_not_Atom 1); |
228 by (rtac Scons_not_Atom 1); |
229 val Scons_not_Leaf = result(); |
229 val Scons_not_Leaf = result(); |
230 val Leaf_not_Scons = standard (Scons_not_Leaf RS not_sym); |
230 val Leaf_not_Scons = standard (Scons_not_Leaf RS not_sym); |
231 |
231 |
232 val Scons_neq_Leaf = standard (Scons_not_Leaf RS notE); |
232 val Scons_neq_Leaf = standard (Scons_not_Leaf RS notE); |
233 val Leaf_neq_Scons = sym RS Scons_neq_Leaf; |
233 val Leaf_neq_Scons = sym RS Scons_neq_Leaf; |
234 |
234 |
235 (** Scons vs Numb **) |
235 (** Scons vs Numb **) |
236 |
236 |
237 goalw Univ.thy [Numb_def] "(M.N) ~= Numb(k)"; |
237 goalw Univ.thy [Numb_def] "(M$N) ~= Numb(k)"; |
238 by (stac o_def 1); |
238 by (stac o_def 1); |
239 by (rtac Scons_not_Atom 1); |
239 by (rtac Scons_not_Atom 1); |
240 val Scons_not_Numb = result(); |
240 val Scons_not_Numb = result(); |
241 val Numb_not_Scons = standard (Scons_not_Numb RS not_sym); |
241 val Numb_not_Scons = standard (Scons_not_Numb RS not_sym); |
242 |
242 |
310 by (stac o_def 1); |
310 by (stac o_def 1); |
311 by (rtac ntrunc_Atom 1); |
311 by (rtac ntrunc_Atom 1); |
312 val ntrunc_Numb = result(); |
312 val ntrunc_Numb = result(); |
313 |
313 |
314 goalw Univ.thy [Scons_def,ntrunc_def] |
314 goalw Univ.thy [Scons_def,ntrunc_def] |
315 "ntrunc(Suc(k), M.N) = ntrunc(k,M) . ntrunc(k,N)"; |
315 "ntrunc(Suc(k), M$N) = ntrunc(k,M) $ ntrunc(k,N)"; |
316 by (safe_tac (set_cs addSIs [equalityI,imageI])); |
316 by (safe_tac (set_cs addSIs [equalityI,imageI])); |
317 by (REPEAT (stac ndepth_Push_Node 3 THEN etac Suc_mono 3)); |
317 by (REPEAT (stac ndepth_Push_Node 3 THEN etac Suc_mono 3)); |
318 by (REPEAT (rtac Suc_less_SucD 1 THEN |
318 by (REPEAT (rtac Suc_less_SucD 1 THEN |
319 rtac (ndepth_Push_Node RS subst) 1 THEN |
319 rtac (ndepth_Push_Node RS subst) 1 THEN |
320 assume_tac 1)); |
320 assume_tac 1)); |
345 val ntrunc_In1 = result(); |
345 val ntrunc_In1 = result(); |
346 |
346 |
347 |
347 |
348 (*** Cartesian Product ***) |
348 (*** Cartesian Product ***) |
349 |
349 |
350 goalw Univ.thy [uprod_def] "!!M N. [| M:A; N:B |] ==> (M.N) : A<*>B"; |
350 goalw Univ.thy [uprod_def] "!!M N. [| M:A; N:B |] ==> (M$N) : A<*>B"; |
351 by (REPEAT (ares_tac [singletonI,UN_I] 1)); |
351 by (REPEAT (ares_tac [singletonI,UN_I] 1)); |
352 val uprodI = result(); |
352 val uprodI = result(); |
353 |
353 |
354 (*The general elimination rule*) |
354 (*The general elimination rule*) |
355 val major::prems = goalw Univ.thy [uprod_def] |
355 val major::prems = goalw Univ.thy [uprod_def] |
356 "[| c : A<*>B; \ |
356 "[| c : A<*>B; \ |
357 \ !!x y. [| x:A; y:B; c=x.y |] ==> P \ |
357 \ !!x y. [| x:A; y:B; c=x$y |] ==> P \ |
358 \ |] ==> P"; |
358 \ |] ==> P"; |
359 by (cut_facts_tac [major] 1); |
359 by (cut_facts_tac [major] 1); |
360 by (REPEAT (eresolve_tac [asm_rl,singletonE,UN_E] 1 |
360 by (REPEAT (eresolve_tac [asm_rl,singletonE,UN_E] 1 |
361 ORELSE resolve_tac prems 1)); |
361 ORELSE resolve_tac prems 1)); |
362 val uprodE = result(); |
362 val uprodE = result(); |
363 |
363 |
364 (*Elimination of a pair -- introduces no eigenvariables*) |
364 (*Elimination of a pair -- introduces no eigenvariables*) |
365 val prems = goal Univ.thy |
365 val prems = goal Univ.thy |
366 "[| (M.N) : A<*>B; [| M:A; N:B |] ==> P \ |
366 "[| (M$N) : A<*>B; [| M:A; N:B |] ==> P \ |
367 \ |] ==> P"; |
367 \ |] ==> P"; |
368 by (rtac uprodE 1); |
368 by (rtac uprodE 1); |
369 by (REPEAT (ares_tac prems 1 ORELSE eresolve_tac [Scons_inject,ssubst] 1)); |
369 by (REPEAT (ares_tac prems 1 ORELSE eresolve_tac [Scons_inject,ssubst] 1)); |
370 val uprodE2 = result(); |
370 val uprodE2 = result(); |
371 |
371 |
481 |
481 |
482 goalw Univ.thy [ntrunc_def] "ntrunc(k, UN x.f(x)) = (UN x. ntrunc(k, f(x)))"; |
482 goalw Univ.thy [ntrunc_def] "ntrunc(k, UN x.f(x)) = (UN x. ntrunc(k, f(x)))"; |
483 by (fast_tac (set_cs addIs [equalityI]) 1); |
483 by (fast_tac (set_cs addIs [equalityI]) 1); |
484 val ntrunc_UN1 = result(); |
484 val ntrunc_UN1 = result(); |
485 |
485 |
486 goalw Univ.thy [Scons_def] "(UN x.f(x)) . M = (UN x. f(x) . M)"; |
486 goalw Univ.thy [Scons_def] "(UN x.f(x)) $ M = (UN x. f(x) $ M)"; |
487 by (fast_tac (set_cs addIs [equalityI]) 1); |
487 by (fast_tac (set_cs addIs [equalityI]) 1); |
488 val Scons_UN1_x = result(); |
488 val Scons_UN1_x = result(); |
489 |
489 |
490 goalw Univ.thy [Scons_def] "M . (UN x.f(x)) = (UN x. M . f(x))"; |
490 goalw Univ.thy [Scons_def] "M $ (UN x.f(x)) = (UN x. M $ f(x))"; |
491 by (fast_tac (set_cs addIs [equalityI]) 1); |
491 by (fast_tac (set_cs addIs [equalityI]) 1); |
492 val Scons_UN1_y = result(); |
492 val Scons_UN1_y = result(); |
493 |
493 |
494 goalw Univ.thy [In0_def] "In0(UN x.f(x)) = (UN x. In0(f(x)))"; |
494 goalw Univ.thy [In0_def] "In0(UN x.f(x)) = (UN x. In0(f(x)))"; |
495 br Scons_UN1_y 1; |
495 br Scons_UN1_y 1; |
516 val diagE = result(); |
516 val diagE = result(); |
517 |
517 |
518 (*** Equality for Cartesian Product ***) |
518 (*** Equality for Cartesian Product ***) |
519 |
519 |
520 goal Univ.thy |
520 goal Univ.thy |
521 "split(<M,M'>, %x x'. split(<N,N'>, %y y'. {<x.y,x'.y'>})) = {<M.N, M'.N'>}"; |
521 "split(<M,M'>, %x x'. split(<N,N'>, %y y'. {<x$y,x'$y'>})) = {<M$N, M'$N'>}"; |
522 by (simp_tac univ_ss 1); |
522 by (simp_tac univ_ss 1); |
523 val dprod_lemma = result(); |
523 val dprod_lemma = result(); |
524 |
524 |
525 goalw Univ.thy [dprod_def] |
525 goalw Univ.thy [dprod_def] |
526 "!!r s. [| <M,M'>:r; <N,N'>:s |] ==> <M.N, M'.N'> : r<**>s"; |
526 "!!r s. [| <M,M'>:r; <N,N'>:s |] ==> <M$N, M'$N'> : r<**>s"; |
527 by (REPEAT (ares_tac [UN_I] 1)); |
527 by (REPEAT (ares_tac [UN_I] 1)); |
528 by (rtac (singletonI RS (dprod_lemma RS equalityD2 RS subsetD)) 1); |
528 by (rtac (singletonI RS (dprod_lemma RS equalityD2 RS subsetD)) 1); |
529 val dprodI = result(); |
529 val dprodI = result(); |
530 |
530 |
531 (*The general elimination rule*) |
531 (*The general elimination rule*) |
532 val major::prems = goalw Univ.thy [dprod_def] |
532 val major::prems = goalw Univ.thy [dprod_def] |
533 "[| c : r<**>s; \ |
533 "[| c : r<**>s; \ |
534 \ !!x y x' y'. [| <x,x'> : r; <y,y'> : s; c = <x.y,x'.y'> |] ==> P \ |
534 \ !!x y x' y'. [| <x,x'> : r; <y,y'> : s; c = <x$y,x'$y'> |] ==> P \ |
535 \ |] ==> P"; |
535 \ |] ==> P"; |
536 by (cut_facts_tac [major] 1); |
536 by (cut_facts_tac [major] 1); |
537 by (REPEAT (eresolve_tac [asm_rl,singletonE,UN_E] 1)); |
537 by (REPEAT (eresolve_tac [asm_rl,singletonE,UN_E] 1)); |
538 by (res_inst_tac [("p","u")] PairE 1); |
538 by (res_inst_tac [("p","u")] PairE 1); |
539 by (res_inst_tac [("p","v")] PairE 1); |
539 by (res_inst_tac [("p","v")] PairE 1); |