src/ZF/ex/Limit.thy
changeset 32380 f3fed9cc423f
parent 24893 b8ef7afe3a6b
child 32960 69916a850301
equal deleted inserted replaced
32379:a97e9caebd60 32380:f3fed9cc423f
   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)