src/HOL/Univ.ML
changeset 1760 6f41a494f3b1
parent 1642 21db0cf9a1a4
child 1761 29e08d527ba1
equal deleted inserted replaced
1759:a42d6c537f4a 1760:6f41a494f3b1
    67 
    67 
    68 
    68 
    69 (*** Introduction rules for Node ***)
    69 (*** Introduction rules for Node ***)
    70 
    70 
    71 goalw Univ.thy [Node_def] "(%k. 0,a) : Node";
    71 goalw Univ.thy [Node_def] "(%k. 0,a) : Node";
    72 by (fast_tac set_cs 1);
    72 by (Fast_tac 1);
    73 qed "Node_K0_I";
    73 qed "Node_K0_I";
    74 
    74 
    75 goalw Univ.thy [Node_def,Push_def]
    75 goalw Univ.thy [Node_def,Push_def]
    76     "!!p. p: Node ==> apfst (Push i) p : Node";
    76     "!!p. p: Node ==> apfst (Push i) p : Node";
    77 by (fast_tac (set_cs addSIs [apfst_conv, nat_case_Suc RS trans]) 1);
    77 by (fast_tac (!claset addSIs [apfst_conv, nat_case_Suc RS trans]) 1);
    78 qed "Node_Push_I";
    78 qed "Node_Push_I";
    79 
    79 
    80 
    80 
    81 (*** Distinctness of constructors ***)
    81 (*** Distinctness of constructors ***)
    82 
    82 
    98 (*** Injectiveness ***)
    98 (*** Injectiveness ***)
    99 
    99 
   100 (** Atomic nodes **)
   100 (** Atomic nodes **)
   101 
   101 
   102 goalw Univ.thy [Atom_def, inj_def] "inj(Atom)";
   102 goalw Univ.thy [Atom_def, inj_def] "inj(Atom)";
   103 by (fast_tac (prod_cs addSIs [Node_K0_I] addSDs [Abs_Node_inject]) 1);
   103 by (fast_tac (!claset addSIs [Node_K0_I] addSDs [Abs_Node_inject]) 1);
   104 qed "inj_Atom";
   104 qed "inj_Atom";
   105 val Atom_inject = inj_Atom RS injD;
   105 val Atom_inject = inj_Atom RS injD;
   106 
   106 
   107 goalw Univ.thy [Leaf_def,o_def] "inj(Leaf)";
   107 goalw Univ.thy [Leaf_def,o_def] "inj(Leaf)";
   108 by (rtac injI 1);
   108 by (rtac injI 1);
   137 
   137 
   138 (** Injectiveness of Scons **)
   138 (** Injectiveness of Scons **)
   139 
   139 
   140 val [major] = goalw Univ.thy [Scons_def] "M$N <= M'$N' ==> M<=M'";
   140 val [major] = goalw Univ.thy [Scons_def] "M$N <= M'$N' ==> M<=M'";
   141 by (cut_facts_tac [major] 1);
   141 by (cut_facts_tac [major] 1);
   142 by (fast_tac (set_cs addSDs [Suc_inject]
   142 by (fast_tac (!claset addSDs [Suc_inject]
   143                      addSEs [Push_Node_inject, Zero_neq_Suc]) 1);
   143                      addSEs [Push_Node_inject, Zero_neq_Suc]) 1);
   144 qed "Scons_inject_lemma1";
   144 qed "Scons_inject_lemma1";
   145 
   145 
   146 val [major] = goalw Univ.thy [Scons_def] "M$N <= M'$N' ==> N<=N'";
   146 val [major] = goalw Univ.thy [Scons_def] "M$N <= M'$N' ==> N<=N'";
   147 by (cut_facts_tac [major] 1);
   147 by (cut_facts_tac [major] 1);
   148 by (fast_tac (set_cs addSDs [Suc_inject]
   148 by (fast_tac (!claset addSDs [Suc_inject]
   149                      addSEs [Push_Node_inject, Suc_neq_Zero]) 1);
   149                      addSEs [Push_Node_inject, Suc_neq_Zero]) 1);
   150 qed "Scons_inject_lemma2";
   150 qed "Scons_inject_lemma2";
   151 
   151 
   152 val [major] = goal Univ.thy "M$N = M'$N' ==> M=M'";
   152 val [major] = goal Univ.thy "M$N = M'$N' ==> M=M'";
   153 by (rtac (major RS equalityE) 1);
   153 by (rtac (major RS equalityE) 1);
   165 by (rtac ((major RS Scons_inject2) RS ((major RS Scons_inject1) RS minor)) 1);
   165 by (rtac ((major RS Scons_inject2) RS ((major RS Scons_inject1) RS minor)) 1);
   166 qed "Scons_inject";
   166 qed "Scons_inject";
   167 
   167 
   168 (*rewrite rules*)
   168 (*rewrite rules*)
   169 goal Univ.thy "(Atom(a)=Atom(b)) = (a=b)";
   169 goal Univ.thy "(Atom(a)=Atom(b)) = (a=b)";
   170 by (fast_tac (HOL_cs addSEs [Atom_inject]) 1);
   170 by (fast_tac (!claset addSEs [Atom_inject]) 1);
   171 qed "Atom_Atom_eq";
   171 qed "Atom_Atom_eq";
   172 
   172 
   173 goal Univ.thy "(M$N = M'$N') = (M=M' & N=N')";
   173 goal Univ.thy "(M$N = M'$N') = (M=M' & N=N')";
   174 by (fast_tac (HOL_cs addSEs [Scons_inject]) 1);
   174 by (fast_tac (!claset addSEs [Scons_inject]) 1);
   175 qed "Scons_Scons_eq";
   175 qed "Scons_Scons_eq";
   176 
   176 
   177 (*** Distinctness involving Leaf and Numb ***)
   177 (*** Distinctness involving Leaf and Numb ***)
   178 
   178 
   179 (** Scons vs Leaf **)
   179 (** Scons vs Leaf **)
   321 
   321 
   322 
   322 
   323 (*** Disjoint Sum ***)
   323 (*** Disjoint Sum ***)
   324 
   324 
   325 goalw Univ.thy [usum_def] "!!M. M:A ==> In0(M) : A<+>B";
   325 goalw Univ.thy [usum_def] "!!M. M:A ==> In0(M) : A<+>B";
   326 by (fast_tac set_cs 1);
   326 by (Fast_tac 1);
   327 qed "usum_In0I";
   327 qed "usum_In0I";
   328 
   328 
   329 goalw Univ.thy [usum_def] "!!N. N:B ==> In1(N) : A<+>B";
   329 goalw Univ.thy [usum_def] "!!N. N:B ==> In1(N) : A<+>B";
   330 by (fast_tac set_cs 1);
   330 by (Fast_tac 1);
   331 qed "usum_In1I";
   331 qed "usum_In1I";
   332 
   332 
   333 val major::prems = goalw Univ.thy [usum_def]
   333 val major::prems = goalw Univ.thy [usum_def]
   334     "[| u : A<+>B;  \
   334     "[| u : A<+>B;  \
   335 \       !!x. [| x:A;  u=In0(x) |] ==> P; \
   335 \       !!x. [| x:A;  u=In0(x) |] ==> P; \
   362 
   362 
   363 
   363 
   364 (*** proving equality of sets and functions using ntrunc ***)
   364 (*** proving equality of sets and functions using ntrunc ***)
   365 
   365 
   366 goalw Univ.thy [ntrunc_def] "ntrunc k M <= M";
   366 goalw Univ.thy [ntrunc_def] "ntrunc k M <= M";
   367 by (fast_tac set_cs 1);
   367 by (Fast_tac 1);
   368 qed "ntrunc_subsetI";
   368 qed "ntrunc_subsetI";
   369 
   369 
   370 val [major] = goalw Univ.thy [ntrunc_def]
   370 val [major] = goalw Univ.thy [ntrunc_def]
   371     "(!!k. ntrunc k M <= N) ==> M<=N";
   371     "(!!k. ntrunc k M <= N) ==> M<=N";
   372 by (fast_tac (set_cs addIs [less_add_Suc1, less_add_Suc2, 
   372 by (fast_tac (!claset addIs [less_add_Suc1, less_add_Suc2, 
   373                             major RS subsetD]) 1);
   373                             major RS subsetD]) 1);
   374 qed "ntrunc_subsetD";
   374 qed "ntrunc_subsetD";
   375 
   375 
   376 (*A generalized form of the take-lemma*)
   376 (*A generalized form of the take-lemma*)
   377 val [major] = goal Univ.thy "(!!k. ntrunc k M = ntrunc k N) ==> M=N";
   377 val [major] = goal Univ.thy "(!!k. ntrunc k M = ntrunc k N) ==> M=N";
   389 qed "ntrunc_o_equality";
   389 qed "ntrunc_o_equality";
   390 
   390 
   391 (*** Monotonicity ***)
   391 (*** Monotonicity ***)
   392 
   392 
   393 goalw Univ.thy [uprod_def] "!!A B. [| A<=A';  B<=B' |] ==> A<*>B <= A'<*>B'";
   393 goalw Univ.thy [uprod_def] "!!A B. [| A<=A';  B<=B' |] ==> A<*>B <= A'<*>B'";
   394 by (fast_tac set_cs 1);
   394 by (Fast_tac 1);
   395 qed "uprod_mono";
   395 qed "uprod_mono";
   396 
   396 
   397 goalw Univ.thy [usum_def] "!!A B. [| A<=A';  B<=B' |] ==> A<+>B <= A'<+>B'";
   397 goalw Univ.thy [usum_def] "!!A B. [| A<=A';  B<=B' |] ==> A<+>B <= A'<+>B'";
   398 by (fast_tac set_cs 1);
   398 by (Fast_tac 1);
   399 qed "usum_mono";
   399 qed "usum_mono";
   400 
   400 
   401 goalw Univ.thy [Scons_def] "!!M N. [| M<=M';  N<=N' |] ==> M$N <= M'$N'";
   401 goalw Univ.thy [Scons_def] "!!M N. [| M<=M';  N<=N' |] ==> M$N <= M'$N'";
   402 by (fast_tac set_cs 1);
   402 by (Fast_tac 1);
   403 qed "Scons_mono";
   403 qed "Scons_mono";
   404 
   404 
   405 goalw Univ.thy [In0_def] "!!M N. M<=N ==> In0(M) <= In0(N)";
   405 goalw Univ.thy [In0_def] "!!M N. M<=N ==> In0(M) <= In0(N)";
   406 by (REPEAT (ares_tac [subset_refl,Scons_mono] 1));
   406 by (REPEAT (ares_tac [subset_refl,Scons_mono] 1));
   407 qed "In0_mono";
   407 qed "In0_mono";
   412 
   412 
   413 
   413 
   414 (*** Split and Case ***)
   414 (*** Split and Case ***)
   415 
   415 
   416 goalw Univ.thy [Split_def] "Split c (M$N) = c M N";
   416 goalw Univ.thy [Split_def] "Split c (M$N) = c M N";
   417 by (fast_tac (set_cs addIs [select_equality] addEs [Scons_inject]) 1);
   417 by (fast_tac (!claset addIs [select_equality] addEs [Scons_inject]) 1);
   418 qed "Split";
   418 qed "Split";
   419 
   419 
   420 goalw Univ.thy [Case_def] "Case c d (In0 M) = c(M)";
   420 goalw Univ.thy [Case_def] "Case c d (In0 M) = c(M)";
   421 by (fast_tac (set_cs addIs [select_equality] 
   421 by (fast_tac (!claset addIs [select_equality] 
   422                      addEs [make_elim In0_inject, In0_neq_In1]) 1);
   422                      addEs [make_elim In0_inject, In0_neq_In1]) 1);
   423 qed "Case_In0";
   423 qed "Case_In0";
   424 
   424 
   425 goalw Univ.thy [Case_def] "Case c d (In1 N) = d(N)";
   425 goalw Univ.thy [Case_def] "Case c d (In1 N) = d(N)";
   426 by (fast_tac (set_cs addIs [select_equality] 
   426 by (fast_tac (!claset addIs [select_equality] 
   427                      addEs [make_elim In1_inject, In1_neq_In0]) 1);
   427                      addEs [make_elim In1_inject, In1_neq_In0]) 1);
   428 qed "Case_In1";
   428 qed "Case_In1";
   429 
   429 
   430 (**** UN x. B(x) rules ****)
   430 (**** UN x. B(x) rules ****)
   431 
   431 
   432 goalw Univ.thy [ntrunc_def] "ntrunc k (UN x.f(x)) = (UN x. ntrunc k (f x))";
   432 goalw Univ.thy [ntrunc_def] "ntrunc k (UN x.f(x)) = (UN x. ntrunc k (f x))";
   433 by (fast_tac (set_cs addIs [equalityI]) 1);
   433 by (fast_tac (!claset addIs [equalityI]) 1);
   434 qed "ntrunc_UN1";
   434 qed "ntrunc_UN1";
   435 
   435 
   436 goalw Univ.thy [Scons_def] "(UN x.f(x)) $ M = (UN x. f(x) $ M)";
   436 goalw Univ.thy [Scons_def] "(UN x.f(x)) $ M = (UN x. f(x) $ M)";
   437 by (fast_tac (set_cs addIs [equalityI]) 1);
   437 by (fast_tac (!claset addIs [equalityI]) 1);
   438 qed "Scons_UN1_x";
   438 qed "Scons_UN1_x";
   439 
   439 
   440 goalw Univ.thy [Scons_def] "M $ (UN x.f(x)) = (UN x. M $ f(x))";
   440 goalw Univ.thy [Scons_def] "M $ (UN x.f(x)) = (UN x. M $ f(x))";
   441 by (fast_tac (set_cs addIs [equalityI]) 1);
   441 by (fast_tac (!claset addIs [equalityI]) 1);
   442 qed "Scons_UN1_y";
   442 qed "Scons_UN1_y";
   443 
   443 
   444 goalw Univ.thy [In0_def] "In0(UN x.f(x)) = (UN x. In0(f(x)))";
   444 goalw Univ.thy [In0_def] "In0(UN x.f(x)) = (UN x. In0(f(x)))";
   445 by (rtac Scons_UN1_y 1);
   445 by (rtac Scons_UN1_y 1);
   446 qed "In0_UN1";
   446 qed "In0_UN1";
   451 
   451 
   452 
   452 
   453 (*** Equality : the diagonal relation ***)
   453 (*** Equality : the diagonal relation ***)
   454 
   454 
   455 goalw Univ.thy [diag_def] "!!a A. [| a=b;  a:A |] ==> (a,b) : diag(A)";
   455 goalw Univ.thy [diag_def] "!!a A. [| a=b;  a:A |] ==> (a,b) : diag(A)";
   456 by (fast_tac set_cs 1);
   456 by (Fast_tac 1);
   457 qed "diag_eqI";
   457 qed "diag_eqI";
   458 
   458 
   459 val diagI = refl RS diag_eqI |> standard;
   459 val diagI = refl RS diag_eqI |> standard;
   460 
   460 
   461 (*The general elimination rule*)
   461 (*The general elimination rule*)
   469 
   469 
   470 (*** Equality for Cartesian Product ***)
   470 (*** Equality for Cartesian Product ***)
   471 
   471 
   472 goalw Univ.thy [dprod_def]
   472 goalw Univ.thy [dprod_def]
   473     "!!r s. [| (M,M'):r;  (N,N'):s |] ==> (M$N, M'$N') : r<**>s";
   473     "!!r s. [| (M,M'):r;  (N,N'):s |] ==> (M$N, M'$N') : r<**>s";
   474 by (fast_tac prod_cs 1);
   474 by (Fast_tac 1);
   475 qed "dprodI";
   475 qed "dprodI";
   476 
   476 
   477 (*The general elimination rule*)
   477 (*The general elimination rule*)
   478 val major::prems = goalw Univ.thy [dprod_def]
   478 val major::prems = goalw Univ.thy [dprod_def]
   479     "[| c : r<**>s;  \
   479     "[| c : r<**>s;  \
   486 
   486 
   487 
   487 
   488 (*** Equality for Disjoint Sum ***)
   488 (*** Equality for Disjoint Sum ***)
   489 
   489 
   490 goalw Univ.thy [dsum_def]  "!!r. (M,M'):r ==> (In0(M), In0(M')) : r<++>s";
   490 goalw Univ.thy [dsum_def]  "!!r. (M,M'):r ==> (In0(M), In0(M')) : r<++>s";
   491 by (fast_tac prod_cs 1);
   491 by (Fast_tac 1);
   492 qed "dsum_In0I";
   492 qed "dsum_In0I";
   493 
   493 
   494 goalw Univ.thy [dsum_def]  "!!r. (N,N'):s ==> (In1(N), In1(N')) : r<++>s";
   494 goalw Univ.thy [dsum_def]  "!!r. (N,N'):s ==> (In1(N), In1(N')) : r<++>s";
   495 by (fast_tac prod_cs 1);
   495 by (Fast_tac 1);
   496 qed "dsum_In1I";
   496 qed "dsum_In1I";
   497 
   497 
   498 val major::prems = goalw Univ.thy [dsum_def]
   498 val major::prems = goalw Univ.thy [dsum_def]
   499     "[| w : r<++>s;  \
   499     "[| w : r<++>s;  \
   500 \       !!x x'. [| (x,x') : r;  w = (In0(x), In0(x')) |] ==> P; \
   500 \       !!x x'. [| (x,x') : r;  w = (In0(x), In0(x')) |] ==> P; \
   509 val univ_cs =
   509 val univ_cs =
   510     prod_cs addSIs [diagI, uprodI, dprodI]
   510     prod_cs addSIs [diagI, uprodI, dprodI]
   511             addIs  [usum_In0I, usum_In1I, dsum_In0I, dsum_In1I]
   511             addIs  [usum_In0I, usum_In1I, dsum_In0I, dsum_In1I]
   512             addSEs [diagE, uprodE, dprodE, usumE, dsumE];
   512             addSEs [diagE, uprodE, dprodE, usumE, dsumE];
   513 
   513 
       
   514 AddSIs [diagI, uprodI, dprodI];
       
   515 AddIs  [usum_In0I, usum_In1I, dsum_In0I, dsum_In1I];
       
   516 AddSEs [diagE, uprodE, dprodE, usumE, dsumE];
   514 
   517 
   515 (*** Monotonicity ***)
   518 (*** Monotonicity ***)
   516 
   519 
   517 goal Univ.thy "!!r s. [| r<=r';  s<=s' |] ==> r<**>s <= r'<**>s'";
   520 goal Univ.thy "!!r s. [| r<=r';  s<=s' |] ==> r<**>s <= r'<**>s'";
   518 by (fast_tac univ_cs 1);
   521 by (Fast_tac 1);
   519 qed "dprod_mono";
   522 qed "dprod_mono";
   520 
   523 
   521 goal Univ.thy "!!r s. [| r<=r';  s<=s' |] ==> r<++>s <= r'<++>s'";
   524 goal Univ.thy "!!r s. [| r<=r';  s<=s' |] ==> r<++>s <= r'<++>s'";
   522 by (fast_tac univ_cs 1);
   525 by (Fast_tac 1);
   523 qed "dsum_mono";
   526 qed "dsum_mono";
   524 
   527 
   525 
   528 
   526 (*** Bounding theorems ***)
   529 (*** Bounding theorems ***)
   527 
   530 
   528 goal Univ.thy "diag(A) <= A Times A";
   531 goal Univ.thy "diag(A) <= A Times A";
   529 by (fast_tac univ_cs 1);
   532 by (Fast_tac 1);
   530 qed "diag_subset_Sigma";
   533 qed "diag_subset_Sigma";
   531 
   534 
   532 goal Univ.thy "((A Times B) <**> (C Times D)) <= (A<*>C) Times (B<*>D)";
   535 goal Univ.thy "((A Times B) <**> (C Times D)) <= (A<*>C) Times (B<*>D)";
   533 by (fast_tac univ_cs 1);
   536 by (Fast_tac 1);
   534 qed "dprod_Sigma";
   537 qed "dprod_Sigma";
   535 
   538 
   536 val dprod_subset_Sigma = [dprod_mono, dprod_Sigma] MRS subset_trans |>standard;
   539 val dprod_subset_Sigma = [dprod_mono, dprod_Sigma] MRS subset_trans |>standard;
   537 
   540 
   538 (*Dependent version*)
   541 (*Dependent version*)
   539 goal Univ.thy
   542 goal Univ.thy
   540     "(Sigma A B <**> Sigma C D) <= Sigma (A<*>C) (Split(%x y. B(x)<*>D(y)))";
   543     "(Sigma A B <**> Sigma C D) <= Sigma (A<*>C) (Split(%x y. B(x)<*>D(y)))";
   541 by (safe_tac univ_cs);
   544 by (safe_tac univ_cs);
   542 by (stac Split 1);
   545 by (stac Split 1);
   543 by (fast_tac univ_cs 1);
   546 by (Fast_tac 1);
   544 qed "dprod_subset_Sigma2";
   547 qed "dprod_subset_Sigma2";
   545 
   548 
   546 goal Univ.thy "(A Times B <++> C Times D) <= (A<+>C) Times (B<+>D)";
   549 goal Univ.thy "(A Times B <++> C Times D) <= (A<+>C) Times (B<+>D)";
   547 by (fast_tac univ_cs 1);
   550 by (Fast_tac 1);
   548 qed "dsum_Sigma";
   551 qed "dsum_Sigma";
   549 
   552 
   550 val dsum_subset_Sigma = [dsum_mono, dsum_Sigma] MRS subset_trans |> standard;
   553 val dsum_subset_Sigma = [dsum_mono, dsum_Sigma] MRS subset_trans |> standard;
   551 
   554 
   552 
   555 
   553 (*** Domain ***)
   556 (*** Domain ***)
   554 
   557 
   555 goal Univ.thy "fst `` diag(A) = A";
   558 goal Univ.thy "fst `` diag(A) = A";
   556 by (fast_tac (prod_cs addIs [equalityI, diagI] addSEs [diagE]) 1);
   559 by (fast_tac (!claset addIs [equalityI, diagI] addSEs [diagE]) 1);
   557 qed "fst_image_diag";
   560 qed "fst_image_diag";
   558 
   561 
   559 goal Univ.thy "fst `` (r<**>s) = (fst``r) <*> (fst``s)";
   562 goal Univ.thy "fst `` (r<**>s) = (fst``r) <*> (fst``s)";
   560 by (fast_tac (prod_cs addIs [equalityI, uprodI, dprodI]
   563 by (fast_tac (!claset addIs [equalityI, uprodI, dprodI]
   561                      addSEs [uprodE, dprodE]) 1);
   564                      addSEs [uprodE, dprodE]) 1);
   562 qed "fst_image_dprod";
   565 qed "fst_image_dprod";
   563 
   566 
   564 goal Univ.thy "fst `` (r<++>s) = (fst``r) <+> (fst``s)";
   567 goal Univ.thy "fst `` (r<++>s) = (fst``r) <+> (fst``s)";
   565 by (fast_tac (prod_cs addIs [equalityI, usum_In0I, usum_In1I, 
   568 by (fast_tac (!claset addIs [equalityI, usum_In0I, usum_In1I, 
   566                              dsum_In0I, dsum_In1I]
   569                              dsum_In0I, dsum_In1I]
   567                      addSEs [usumE, dsumE]) 1);
   570                      addSEs [usumE, dsumE]) 1);
   568 qed "fst_image_dsum";
   571 qed "fst_image_dsum";
   569 
   572 
   570 Addsimps [fst_image_diag, fst_image_dprod, fst_image_dsum];
   573 Addsimps [fst_image_diag, fst_image_dprod, fst_image_dsum];