486 assumes xprem: "!!x. x \<in> nat==>chain(D,M`x)" |
486 assumes xprem: "!!x. x \<in> nat==>chain(D,M`x)" |
487 and yprem: "!!y. y \<in> nat==>chain(D,\<lambda>x \<in> nat. M`x`y)" |
487 and yprem: "!!y. y \<in> nat==>chain(D,\<lambda>x \<in> nat. M`x`y)" |
488 and Mfun: "M \<in> nat->nat->set(D)" |
488 and Mfun: "M \<in> nat->nat->set(D)" |
489 and cpoD: "cpo(D)" |
489 and cpoD: "cpo(D)" |
490 shows "matrix(D,M)" |
490 shows "matrix(D,M)" |
491 apply (simp add: matrix_def, safe) |
491 proof - |
492 apply (rule Mfun) |
492 { |
493 apply (cut_tac y1 = m and n = n in yprem [THEN chain_rel], simp+) |
493 fix n m assume "n : nat" "m : nat" |
494 apply (simp add: chain_rel xprem) |
494 with chain_rel [OF yprem] |
495 apply (rule cpo_trans [OF cpoD]) |
495 have "rel(D, M ` n ` m, M ` succ(n) ` m)" by simp |
496 apply (cut_tac y1 = m and n = n in yprem [THEN chain_rel], simp+) |
496 } note rel_succ = this |
497 apply (simp_all add: chain_fun [THEN apply_type] xprem) |
497 show "matrix(D,M)" |
498 done |
498 proof (simp add: matrix_def Mfun rel_succ, intro conjI ballI) |
499 |
499 fix n m assume n: "n : nat" and m: "m : nat" |
500 lemma lemma_rel_rel: |
500 thus "rel(D, M ` n ` m, M ` n ` succ(m))" |
501 "[|m \<in> nat; rel(D, (\<lambda>n \<in> nat. M`n`n)`m, y)|] ==> rel(D,M`m`m, y)" |
501 by (simp add: chain_rel xprem) |
502 by simp |
502 next |
|
503 fix n m assume n: "n : nat" and m: "m : nat" |
|
504 thus "rel(D, M ` n ` m, M ` succ(n) ` succ(m))" |
|
505 by (rule cpo_trans [OF cpoD rel_succ], |
|
506 simp_all add: chain_fun [THEN apply_type] xprem) |
|
507 qed |
|
508 qed |
503 |
509 |
504 lemma lemma2: |
510 lemma lemma2: |
505 "[|x \<in> nat; m \<in> nat; rel(D,(\<lambda>n \<in> nat. M`n`m1)`x,(\<lambda>n \<in> nat. M`n`m1)`m)|] |
511 "[|x \<in> nat; m \<in> nat; rel(D,(\<lambda>n \<in> nat. M`n`m1)`x,(\<lambda>n \<in> nat. M`n`m1)`m)|] |
506 ==> rel(D,M`x`m1,M`m`m1)" |
512 ==> rel(D,M`x`m1,M`m`m1)" |
507 by simp |
513 by simp |
508 |
514 |
509 lemma isub_lemma: |
515 lemma isub_lemma: |
510 "[|isub(D, \<lambda>n \<in> nat. M`n`n, y); matrix(D,M); cpo(D)|] |
516 "[|isub(D, \<lambda>n \<in> nat. M`n`n, y); matrix(D,M); cpo(D)|] |
511 ==> isub(D, \<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m), y)" |
517 ==> isub(D, \<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m), y)" |
512 apply (unfold isub_def, safe) |
518 proof (simp add: isub_def, safe) |
513 apply (simp (no_asm_simp)) |
519 fix n |
514 apply (frule matrix_fun [THEN apply_type], assumption) |
520 assume DM: "matrix(D, M)" and D: "cpo(D)" and n: "n \<in> nat" and y: "y \<in> set(D)" |
515 apply (simp (no_asm_simp)) |
521 and rel: "\<forall>n\<in>nat. rel(D, M ` n ` n, y)" |
516 apply (rule matrix_chain_left [THEN cpo_lub, THEN islub_least], assumption+) |
522 have "rel(D, lub(D, M ` n), y)" |
517 apply (unfold isub_def, safe) |
523 proof (rule matrix_chain_left [THEN cpo_lub, THEN islub_least], simp_all add: n D DM) |
518 (*???VERY indirect proof: beta-redexes could be simplified now!*) |
524 show "isub(D, M ` n, y)" |
519 apply (rename_tac k n) |
525 proof (unfold isub_def, intro conjI ballI y) |
520 apply (case_tac "k le n") |
526 fix k assume k: "k \<in> nat" |
521 apply (rule cpo_trans, assumption) |
527 show "rel(D, M ` n ` k, y)" |
522 apply (rule lemma2) |
528 proof (cases "n le k") |
523 apply (rule_tac [4] lemma_rel_rel) |
529 case True |
524 prefer 5 apply blast |
530 hence yy: "rel(D, M`n`k, M`k`k)" |
525 apply (assumption | rule chain_rel_gen matrix_chain_right matrix_in isubD1)+ |
531 by (blast intro: lemma2 n k y DM D chain_rel_gen matrix_chain_right) |
526 txt{*opposite case*} |
532 show "?thesis" |
527 apply (rule cpo_trans, assumption) |
533 by (rule cpo_trans [OF D yy], |
528 apply (rule not_le_iff_lt [THEN iffD1, THEN leI, THEN chain_rel_gen]) |
534 simp_all add: k rel n y DM matrix_in) |
529 prefer 3 apply assumption |
535 next |
530 apply (assumption | rule nat_into_Ord matrix_chain_left)+ |
536 case False |
531 apply (rule lemma_rel_rel) |
537 hence le: "k le n" |
532 apply (simp_all add: matrix_in) |
538 by (blast intro: not_le_iff_lt [THEN iffD1, THEN leI] nat_into_Ord n k) |
533 done |
539 show "?thesis" |
|
540 by (rule cpo_trans [OF D chain_rel_gen [OF le]], |
|
541 simp_all add: n y k rel DM D matrix_chain_left) |
|
542 qed |
|
543 qed |
|
544 qed |
|
545 moreover |
|
546 have "M ` n \<in> nat \<rightarrow> set(D)" by (blast intro: DM n matrix_fun [THEN apply_type]) |
|
547 ultimately show "rel(D, lub(D, Lambda(nat, op `(M ` n))), y)" by simp |
|
548 qed |
534 |
549 |
535 lemma matrix_chain_lub: |
550 lemma matrix_chain_lub: |
536 "[|matrix(D,M); cpo(D)|] ==> chain(D,\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m))" |
551 "[|matrix(D,M); cpo(D)|] ==> chain(D,\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m))" |
537 apply (simp add: chain_def, safe) |
552 proof (simp add: chain_def, intro conjI ballI) |
538 apply (rule lam_type) |
553 assume "matrix(D, M)" "cpo(D)" |
539 apply (rule islub_in) |
554 thus "(\<lambda>x\<in>nat. lub(D, Lambda(nat, op `(M ` x)))) \<in> nat \<rightarrow> set(D)" |
540 apply (rule cpo_lub) |
555 by (force intro: islub_in cpo_lub chainI lam_type matrix_in matrix_rel_0_1) |
541 prefer 2 apply assumption |
556 next |
542 apply (rule chainI) |
557 fix n |
543 apply (rule lam_type) |
558 assume DD: "matrix(D, M)" "cpo(D)" "n \<in> nat" |
544 apply (simp_all add: matrix_in) |
559 hence "dominate(D, M ` n, M ` succ(n))" |
545 apply (rule matrix_rel_0_1, assumption+) |
560 by (force simp add: dominate_def intro: matrix_rel_1_0) |
546 apply (simp add: matrix_chain_left [THEN chain_fun, THEN eta]) |
561 with DD show "rel(D, lub(D, Lambda(nat, op `(M ` n))), |
547 apply (rule dominate_islub) |
562 lub(D, Lambda(nat, op `(M ` succ(n)))))" |
548 apply (rule_tac [3] cpo_lub) |
563 by (simp add: matrix_chain_left [THEN chain_fun, THEN eta] |
549 apply (rule_tac [2] cpo_lub) |
564 dominate_islub cpo_lub matrix_chain_left chain_fun) |
550 apply (simp add: dominate_def) |
565 qed |
551 apply (blast intro: matrix_rel_1_0) |
|
552 apply (simp_all add: matrix_chain_left nat_succI chain_fun) |
|
553 done |
|
554 |
566 |
555 lemma isub_eq: |
567 lemma isub_eq: |
556 "[|matrix(D,M); cpo(D)|] |
568 assumes DM: "matrix(D, M)" and D: "cpo(D)" |
557 ==> isub(D,(\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m)),y) <-> |
569 shows "isub(D,(\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m)),y) <-> isub(D,(\<lambda>n \<in> nat. M`n`n),y)" |
558 isub(D,(\<lambda>n \<in> nat. M`n`n),y)" |
570 proof |
559 apply (rule iffI) |
571 assume isub: "isub(D, \<lambda>n\<in>nat. lub(D, Lambda(nat, op `(M ` n))), y)" |
560 apply (rule dominate_isub) |
572 hence dom: "dominate(D, \<lambda>n\<in>nat. M ` n ` n, \<lambda>n\<in>nat. lub(D, Lambda(nat, op `(M ` n))))" |
561 prefer 2 apply assumption |
573 using DM D |
562 apply (simp add: dominate_def) |
574 by (simp add: dominate_def, intro ballI bexI, |
563 apply (rule ballI) |
575 simp_all add: matrix_chain_left [THEN chain_fun, THEN eta] islub_ub cpo_lub matrix_chain_left) |
564 apply (rule bexI, auto) |
576 thus "isub(D, \<lambda>n\<in>nat. M ` n ` n, y)" using DM D |
565 apply (simp add: matrix_chain_left [THEN chain_fun, THEN eta]) |
577 by - (rule dominate_isub [OF dom isub], |
566 apply (rule islub_ub) |
578 simp_all add: matrix_chain_diag chain_fun matrix_chain_lub) |
567 apply (rule cpo_lub) |
579 next |
568 apply (simp_all add: matrix_chain_left matrix_chain_diag chain_fun |
580 assume isub: "isub(D, \<lambda>n\<in>nat. M ` n ` n, y)" |
569 matrix_chain_lub isub_lemma) |
581 thus "isub(D, \<lambda>n\<in>nat. lub(D, Lambda(nat, op `(M ` n))), y)" using DM D |
570 done |
582 by (simp add: isub_lemma) |
|
583 qed |
571 |
584 |
572 lemma lub_matrix_diag_aux1: |
585 lemma lub_matrix_diag_aux1: |
573 "lub(D,(\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m))) = |
586 "lub(D,(\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m))) = |
574 (THE x. islub(D, (\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m)), x))" |
587 (THE x. islub(D, (\<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m)), x))" |
575 by (simp add: lub_def) |
588 by (simp add: lub_def) |
693 |
706 |
694 lemma matrix_lemma: |
707 lemma matrix_lemma: |
695 "[|chain(cf(D,E),X); chain(D,Xa); cpo(D); cpo(E) |] |
708 "[|chain(cf(D,E),X); chain(D,Xa); cpo(D); cpo(E) |] |
696 ==> matrix(E,\<lambda>x \<in> nat. \<lambda>xa \<in> nat. X`x`(Xa`xa))" |
709 ==> matrix(E,\<lambda>x \<in> nat. \<lambda>xa \<in> nat. X`x`(Xa`xa))" |
697 apply (rule matrix_chainI, auto) |
710 apply (rule matrix_chainI, auto) |
698 apply (rule chainI) |
711 apply (force intro: chainI lam_type apply_funtype cont_fun cf_cont cont_mono) |
699 apply (blast intro: lam_type apply_funtype cont_fun cf_cont chain_in, simp) |
712 apply (force intro: chainI lam_type apply_funtype cont_fun cf_cont rel_cf) |
700 apply (blast intro: cont_mono nat_succI chain_rel cf_cont chain_in) |
|
701 apply (rule chainI) |
|
702 apply (blast intro: lam_type apply_funtype cont_fun cf_cont chain_in, simp) |
|
703 apply (rule rel_cf) |
|
704 apply (simp_all add: chain_in chain_rel) |
|
705 apply (blast intro: lam_type apply_funtype cont_fun cf_cont chain_in) |
713 apply (blast intro: lam_type apply_funtype cont_fun cf_cont chain_in) |
706 done |
714 done |
707 |
715 |
708 lemma chain_cf_lub_cont: |
716 lemma chain_cf_lub_cont: |
709 "[|chain(cf(D,E),X); cpo(D); cpo(E) |] |
717 assumes ch: "chain(cf(D,E),X)" and D: "cpo(D)" and E: "cpo(E)" |
710 ==> (\<lambda>x \<in> set(D). lub(E, \<lambda>n \<in> nat. X ` n ` x)) \<in> cont(D, E)" |
718 shows "(\<lambda>x \<in> set(D). lub(E, \<lambda>n \<in> nat. X ` n ` x)) \<in> cont(D, E)" |
711 apply (rule contI) |
719 proof (rule contI) |
712 apply (rule lam_type) |
720 show "(\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) \<in> set(D) \<rightarrow> set(E)" |
713 apply (assumption | rule chain_cf [THEN cpo_lub, THEN islub_in])+ |
721 by (blast intro: lam_type chain_cf [THEN cpo_lub, THEN islub_in] ch E) |
714 apply simp |
722 next |
715 apply (rule dominate_islub) |
723 fix x y |
716 apply (erule_tac [2] chain_cf [THEN cpo_lub], simp_all)+ |
724 assume xy: "rel(D, x, y)" "x \<in> set(D)" "y \<in> set(D)" |
717 apply (rule dominateI, assumption, simp) |
725 hence dom: "dominate(E, \<lambda>n\<in>nat. X ` n ` x, \<lambda>n\<in>nat. X ` n ` y)" |
718 apply (assumption | rule chain_in [THEN cf_cont, THEN cont_mono])+ |
726 by (force intro: dominateI chain_in [OF ch, THEN cf_cont, THEN cont_mono]) |
719 apply (assumption | rule chain_cf [THEN chain_fun])+ |
727 note chE = chain_cf [OF ch] |
720 apply (simp add: cpo_lub [THEN islub_in] |
728 from xy show "rel(E, (\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) ` x, |
721 chain_in [THEN cf_cont, THEN cont_lub]) |
729 (\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) ` y)" |
722 apply (frule matrix_lemma [THEN lub_matrix_diag], assumption+) |
730 by (simp add: dominate_islub [OF dom] cpo_lub [OF chE] E chain_fun [OF chE]) |
723 apply (simp add: chain_in [THEN beta]) |
731 next |
724 apply (drule matrix_lemma [THEN lub_matrix_diag_sym], auto) |
732 fix Y |
725 done |
733 assume chDY: "chain(D,Y)" |
|
734 have "lub(E, \<lambda>x\<in>nat. lub(E, \<lambda>y\<in>nat. X ` x ` (Y ` y))) = |
|
735 lub(E, \<lambda>x\<in>nat. X ` x ` (Y ` x))" |
|
736 using matrix_lemma [THEN lub_matrix_diag, OF ch chDY] |
|
737 by (simp add: D E) |
|
738 also have "... = lub(E, \<lambda>x\<in>nat. lub(E, \<lambda>n\<in>nat. X ` n ` (Y ` x)))" |
|
739 using matrix_lemma [THEN lub_matrix_diag_sym, OF ch chDY] |
|
740 by (simp add: D E) |
|
741 finally have "lub(E, \<lambda>x\<in>nat. lub(E, \<lambda>n\<in>nat. X ` x ` (Y ` n))) = |
|
742 lub(E, \<lambda>x\<in>nat. lub(E, \<lambda>n\<in>nat. X ` n ` (Y ` x)))" . |
|
743 thus "(\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) ` lub(D, Y) = |
|
744 lub(E, \<lambda>n\<in>nat. (\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) ` (Y ` n))" |
|
745 by (simp add: cpo_lub [THEN islub_in] D chDY |
|
746 chain_in [THEN cf_cont, THEN cont_lub, OF ch]) |
|
747 qed |
726 |
748 |
727 lemma islub_cf: |
749 lemma islub_cf: |
728 "[| chain(cf(D,E),X); cpo(D); cpo(E)|] |
750 "[| chain(cf(D,E),X); cpo(D); cpo(E)|] |
729 ==> islub(cf(D,E), X, \<lambda>x \<in> set(D). lub(E,\<lambda>n \<in> nat. X`n`x))" |
751 ==> islub(cf(D,E), X, \<lambda>x \<in> set(D). lub(E,\<lambda>n \<in> nat. X`n`x))" |
730 apply (rule islubI) |
752 apply (rule islubI) |