univ.ML
changeset 48 21291189b51e
parent 5 968d2dccf2de
child 66 14b9286ed036
equal deleted inserted replaced
47:69d815b0e1eb 48:21291189b51e
   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 
   446 
   446 
   447 goalw Univ.thy [usum_def] "!!A B. [| A<=A';  B<=B' |] ==> A<+>B <= A'<+>B'";
   447 goalw Univ.thy [usum_def] "!!A B. [| A<=A';  B<=B' |] ==> A<+>B <= A'<+>B'";
   448 by (fast_tac set_cs 1);
   448 by (fast_tac set_cs 1);
   449 val usum_mono = result();
   449 val usum_mono = result();
   450 
   450 
   451 goalw Univ.thy [Scons_def] "!!M N. [| M<=M';  N<=N' |] ==> M.N <= M'.N'";
   451 goalw Univ.thy [Scons_def] "!!M N. [| M<=M';  N<=N' |] ==> M$N <= M'$N'";
   452 by (fast_tac set_cs 1);
   452 by (fast_tac set_cs 1);
   453 val Scons_mono = result();
   453 val Scons_mono = result();
   454 
   454 
   455 goalw Univ.thy [In0_def] "!!M N. M<=N ==> In0(M) <= In0(N)";
   455 goalw Univ.thy [In0_def] "!!M N. M<=N ==> In0(M) <= In0(N)";
   456 by (REPEAT (ares_tac [subset_refl,Scons_mono] 1));
   456 by (REPEAT (ares_tac [subset_refl,Scons_mono] 1));
   461 val In1_mono = result();
   461 val In1_mono = result();
   462 
   462 
   463 
   463 
   464 (*** Split and Case ***)
   464 (*** Split and Case ***)
   465 
   465 
   466 goalw Univ.thy [Split_def] "Split(M.N, c) = c(M,N)";
   466 goalw Univ.thy [Split_def] "Split(M$N, c) = c(M,N)";
   467 by (fast_tac (set_cs addIs [select_equality] addEs [Scons_inject]) 1);
   467 by (fast_tac (set_cs addIs [select_equality] addEs [Scons_inject]) 1);
   468 val Split = result();
   468 val Split = result();
   469 
   469 
   470 goalw Univ.thy [Case_def] "Case(In0(M), c, d) = c(M)";
   470 goalw Univ.thy [Case_def] "Case(In0(M), c, d) = c(M)";
   471 by (fast_tac (set_cs addIs [select_equality] 
   471 by (fast_tac (set_cs addIs [select_equality] 
   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);