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); |
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"; |
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]; |