| author | wenzelm | 
| Fri, 13 May 2011 23:24:06 +0200 | |
| changeset 42794 | 07155da3b2f4 | 
| parent 35762 | af3ff2ba4c54 | 
| child 46820 | c656222c4dc1 | 
| permissions | -rw-r--r-- | 
| 1478 | 1 | (* Title: ZF/OrderArith.thy | 
| 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | |
| 437 | 3 | Copyright 1994 University of Cambridge | 
| 4 | *) | |
| 5 | ||
| 13356 | 6 | header{*Combining Orderings: Foundations of Ordinal Arithmetic*}
 | 
| 7 | ||
| 16417 | 8 | theory OrderArith imports Order Sum Ordinal begin | 
| 437 | 9 | |
| 24893 | 10 | definition | 
| 437 | 11 | (*disjoint sum of two relations; underlies ordinal addition*) | 
| 24893 | 12 | radd :: "[i,i,i,i]=>i" where | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 13 | "radd(A,r,B,s) == | 
| 1155 | 14 |                 {z: (A+B) * (A+B).  
 | 
| 1478 | 15 | (EX x y. z = <Inl(x), Inr(y)>) | | 
| 16 | (EX x' x. z = <Inl(x'), Inl(x)> & <x',x>:r) | | |
| 1155 | 17 | (EX y' y. z = <Inr(y'), Inr(y)> & <y',y>:s)}" | 
| 437 | 18 | |
| 24893 | 19 | definition | 
| 437 | 20 | (*lexicographic product of two relations; underlies ordinal multiplication*) | 
| 24893 | 21 | rmult :: "[i,i,i,i]=>i" where | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 22 | "rmult(A,r,B,s) == | 
| 1155 | 23 |                 {z: (A*B) * (A*B).  
 | 
| 1478 | 24 | EX x' y' x y. z = <<x',y'>, <x,y>> & | 
| 1155 | 25 | (<x',x>: r | (x'=x & <y',y>: s))}" | 
| 437 | 26 | |
| 24893 | 27 | definition | 
| 437 | 28 | (*inverse image of a relation*) | 
| 24893 | 29 | rvimage :: "[i,i,i]=>i" where | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 30 |     "rvimage(A,f,r) == {z: A*A. EX x y. z = <x,y> & <f`x,f`y>: r}"
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 31 | |
| 24893 | 32 | definition | 
| 33 | measure :: "[i, i\<Rightarrow>i] \<Rightarrow> i" where | |
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 34 |     "measure(A,f) == {<x,y>: A*A. f(x) < f(y)}"
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 35 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 36 | |
| 13356 | 37 | subsection{*Addition of Relations -- Disjoint Sum*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 38 | |
| 13512 | 39 | subsubsection{*Rewrite rules.  Can be used to obtain introduction rules*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 40 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 41 | lemma radd_Inl_Inr_iff [iff]: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 42 | "<Inl(a), Inr(b)> : radd(A,r,B,s) <-> a:A & b:B" | 
| 13356 | 43 | by (unfold radd_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 44 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 45 | lemma radd_Inl_iff [iff]: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 46 | "<Inl(a'), Inl(a)> : radd(A,r,B,s) <-> a':A & a:A & <a',a>:r" | 
| 13356 | 47 | by (unfold radd_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 48 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 49 | lemma radd_Inr_iff [iff]: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 50 | "<Inr(b'), Inr(b)> : radd(A,r,B,s) <-> b':B & b:B & <b',b>:s" | 
| 13356 | 51 | by (unfold radd_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 52 | |
| 13823 | 53 | lemma radd_Inr_Inl_iff [simp]: | 
| 54 | "<Inr(b), Inl(a)> : radd(A,r,B,s) <-> False" | |
| 13356 | 55 | by (unfold radd_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 56 | |
| 13823 | 57 | declare radd_Inr_Inl_iff [THEN iffD1, dest!] | 
| 58 | ||
| 13512 | 59 | subsubsection{*Elimination Rule*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 60 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 61 | lemma raddE: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 62 | "[| <p',p> : radd(A,r,B,s); | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 63 | !!x y. [| p'=Inl(x); x:A; p=Inr(y); y:B |] ==> Q; | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 64 | !!x' x. [| p'=Inl(x'); p=Inl(x); <x',x>: r; x':A; x:A |] ==> Q; | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 65 | !!y' y. [| p'=Inr(y'); p=Inr(y); <y',y>: s; y':B; y:B |] ==> Q | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 66 | |] ==> Q" | 
| 13356 | 67 | by (unfold radd_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 68 | |
| 13512 | 69 | subsubsection{*Type checking*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 70 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 71 | lemma radd_type: "radd(A,r,B,s) <= (A+B) * (A+B)" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 72 | apply (unfold radd_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 73 | apply (rule Collect_subset) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 74 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 75 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 76 | lemmas field_radd = radd_type [THEN field_rel_subset] | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 77 | |
| 13512 | 78 | subsubsection{*Linearity*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 79 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 80 | lemma linear_radd: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 81 | "[| linear(A,r); linear(B,s) |] ==> linear(A+B,radd(A,r,B,s))" | 
| 13356 | 82 | by (unfold linear_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 83 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 84 | |
| 13512 | 85 | subsubsection{*Well-foundedness*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 86 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 87 | lemma wf_on_radd: "[| wf[A](r); wf[B](s) |] ==> wf[A+B](radd(A,r,B,s))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 88 | apply (rule wf_onI2) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 89 | apply (subgoal_tac "ALL x:A. Inl (x) : Ba") | 
| 13512 | 90 |  --{*Proving the lemma, which is needed twice!*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 91 | prefer 2 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 92 | apply (erule_tac V = "y : A + B" in thin_rl) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 93 | apply (rule_tac ballI) | 
| 13784 | 94 | apply (erule_tac r = r and a = x in wf_on_induct, assumption) | 
| 13269 | 95 | apply blast | 
| 13512 | 96 | txt{*Returning to main part of proof*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 97 | apply safe | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 98 | apply blast | 
| 13784 | 99 | apply (erule_tac r = s and a = ya in wf_on_induct, assumption, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 100 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 101 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 102 | lemma wf_radd: "[| wf(r); wf(s) |] ==> wf(radd(field(r),r,field(s),s))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 103 | apply (simp add: wf_iff_wf_on_field) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 104 | apply (rule wf_on_subset_A [OF _ field_radd]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 105 | apply (blast intro: wf_on_radd) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 106 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 107 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 108 | lemma well_ord_radd: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 109 | "[| well_ord(A,r); well_ord(B,s) |] ==> well_ord(A+B, radd(A,r,B,s))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 110 | apply (rule well_ordI) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 111 | apply (simp add: well_ord_def wf_on_radd) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 112 | apply (simp add: well_ord_def tot_ord_def linear_radd) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 113 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 114 | |
| 13512 | 115 | subsubsection{*An @{term ord_iso} congruence law*}
 | 
| 437 | 116 | |
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 117 | lemma sum_bij: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 118 | "[| f: bij(A,C); g: bij(B,D) |] | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 119 | ==> (lam z:A+B. case(%x. Inl(f`x), %y. Inr(g`y), z)) : bij(A+B, C+D)" | 
| 13356 | 120 | apply (rule_tac d = "case (%x. Inl (converse(f)`x), %y. Inr(converse(g)`y))" | 
| 121 | in lam_bijective) | |
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 122 | apply (typecheck add: bij_is_inj inj_is_fun) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 123 | apply (auto simp add: left_inverse_bij right_inverse_bij) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 124 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 125 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 126 | lemma sum_ord_iso_cong: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 127 | "[| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 128 | (lam z:A+B. case(%x. Inl(f`x), %y. Inr(g`y), z)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 129 | : ord_iso(A+B, radd(A,r,B,s), A'+B', radd(A',r',B',s'))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 130 | apply (unfold ord_iso_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 131 | apply (safe intro!: sum_bij) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 132 | (*Do the beta-reductions now*) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 133 | apply (auto cong add: conj_cong simp add: bij_is_fun [THEN apply_type]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 134 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 135 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 136 | (*Could we prove an ord_iso result? Perhaps | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 137 | ord_iso(A+B, radd(A,r,B,s), A Un B, r Un s) *) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 138 | lemma sum_disjoint_bij: "A Int B = 0 ==> | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 139 | (lam z:A+B. case(%x. x, %y. y, z)) : bij(A+B, A Un B)" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 140 | apply (rule_tac d = "%z. if z:A then Inl (z) else Inr (z) " in lam_bijective) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 141 | apply auto | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 142 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 143 | |
| 13512 | 144 | subsubsection{*Associativity*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 145 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 146 | lemma sum_assoc_bij: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 147 | "(lam z:(A+B)+C. case(case(Inl, %y. Inr(Inl(y))), %y. Inr(Inr(y)), z)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 148 | : bij((A+B)+C, A+(B+C))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 149 | apply (rule_tac d = "case (%x. Inl (Inl (x)), case (%x. Inl (Inr (x)), Inr))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 150 | in lam_bijective) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 151 | apply auto | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 152 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 153 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 154 | lemma sum_assoc_ord_iso: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 155 | "(lam z:(A+B)+C. case(case(Inl, %y. Inr(Inl(y))), %y. Inr(Inr(y)), z)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 156 | : ord_iso((A+B)+C, radd(A+B, radd(A,r,B,s), C, t), | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 157 | A+(B+C), radd(A, r, B+C, radd(B,s,C,t)))" | 
| 13356 | 158 | by (rule sum_assoc_bij [THEN ord_isoI], auto) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 159 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 160 | |
| 13356 | 161 | subsection{*Multiplication of Relations -- Lexicographic Product*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 162 | |
| 13512 | 163 | subsubsection{*Rewrite rule.  Can be used to obtain introduction rules*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 164 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 165 | lemma rmult_iff [iff]: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 166 | "<<a',b'>, <a,b>> : rmult(A,r,B,s) <-> | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 167 | (<a',a>: r & a':A & a:A & b': B & b: B) | | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 168 | (<b',b>: s & a'=a & a:A & b': B & b: B)" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 169 | |
| 13356 | 170 | by (unfold rmult_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 171 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 172 | lemma rmultE: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 173 | "[| <<a',b'>, <a,b>> : rmult(A,r,B,s); | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 174 | [| <a',a>: r; a':A; a:A; b':B; b:B |] ==> Q; | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 175 | [| <b',b>: s; a:A; a'=a; b':B; b:B |] ==> Q | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 176 | |] ==> Q" | 
| 13356 | 177 | by blast | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 178 | |
| 13512 | 179 | subsubsection{*Type checking*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 180 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 181 | lemma rmult_type: "rmult(A,r,B,s) <= (A*B) * (A*B)" | 
| 13356 | 182 | by (unfold rmult_def, rule Collect_subset) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 183 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 184 | lemmas field_rmult = rmult_type [THEN field_rel_subset] | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 185 | |
| 13512 | 186 | subsubsection{*Linearity*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 187 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 188 | lemma linear_rmult: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 189 | "[| linear(A,r); linear(B,s) |] ==> linear(A*B,rmult(A,r,B,s))" | 
| 13356 | 190 | by (simp add: linear_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 191 | |
| 13512 | 192 | subsubsection{*Well-foundedness*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 193 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 194 | lemma wf_on_rmult: "[| wf[A](r); wf[B](s) |] ==> wf[A*B](rmult(A,r,B,s))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 195 | apply (rule wf_onI2) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 196 | apply (erule SigmaE) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 197 | apply (erule ssubst) | 
| 13269 | 198 | apply (subgoal_tac "ALL b:B. <x,b>: Ba", blast) | 
| 13784 | 199 | apply (erule_tac a = x in wf_on_induct, assumption) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 200 | apply (rule ballI) | 
| 13784 | 201 | apply (erule_tac a = b in wf_on_induct, assumption) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 202 | apply (best elim!: rmultE bspec [THEN mp]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 203 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 204 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 205 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 206 | lemma wf_rmult: "[| wf(r); wf(s) |] ==> wf(rmult(field(r),r,field(s),s))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 207 | apply (simp add: wf_iff_wf_on_field) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 208 | apply (rule wf_on_subset_A [OF _ field_rmult]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 209 | apply (blast intro: wf_on_rmult) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 210 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 211 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 212 | lemma well_ord_rmult: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 213 | "[| well_ord(A,r); well_ord(B,s) |] ==> well_ord(A*B, rmult(A,r,B,s))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 214 | apply (rule well_ordI) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 215 | apply (simp add: well_ord_def wf_on_rmult) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 216 | apply (simp add: well_ord_def tot_ord_def linear_rmult) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 217 | done | 
| 9883 | 218 | |
| 219 | ||
| 13512 | 220 | subsubsection{*An @{term ord_iso} congruence law*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 221 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 222 | lemma prod_bij: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 223 | "[| f: bij(A,C); g: bij(B,D) |] | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 224 | ==> (lam <x,y>:A*B. <f`x, g`y>) : bij(A*B, C*D)" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 225 | apply (rule_tac d = "%<x,y>. <converse (f) `x, converse (g) `y>" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 226 | in lam_bijective) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 227 | apply (typecheck add: bij_is_inj inj_is_fun) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 228 | apply (auto simp add: left_inverse_bij right_inverse_bij) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 229 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 230 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 231 | lemma prod_ord_iso_cong: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 232 | "[| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 233 | ==> (lam <x,y>:A*B. <f`x, g`y>) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 234 | : ord_iso(A*B, rmult(A,r,B,s), A'*B', rmult(A',r',B',s'))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 235 | apply (unfold ord_iso_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 236 | apply (safe intro!: prod_bij) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 237 | apply (simp_all add: bij_is_fun [THEN apply_type]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 238 | apply (blast intro: bij_is_inj [THEN inj_apply_equality]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 239 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 240 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 241 | lemma singleton_prod_bij: "(lam z:A. <x,z>) : bij(A, {x}*A)"
 | 
| 13784 | 242 | by (rule_tac d = snd in lam_bijective, auto) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 243 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 244 | (*Used??*) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 245 | lemma singleton_prod_ord_iso: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 246 |      "well_ord({x},xr) ==>   
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 247 |           (lam z:A. <x,z>) : ord_iso(A, r, {x}*A, rmult({x}, xr, A, r))"
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 248 | apply (rule singleton_prod_bij [THEN ord_isoI]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 249 | apply (simp (no_asm_simp)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 250 | apply (blast dest: well_ord_is_wf [THEN wf_on_not_refl]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 251 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 252 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 253 | (*Here we build a complicated function term, then simplify it using | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 254 | case_cong, id_conv, comp_lam, case_case.*) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 255 | lemma prod_sum_singleton_bij: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 256 | "a~:C ==> | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 257 | (lam x:C*B + D. case(%x. x, %y.<a,y>, x)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 258 |        : bij(C*B + D, C*B Un {a}*D)"
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 259 | apply (rule subst_elem) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 260 | apply (rule id_bij [THEN sum_bij, THEN comp_bij]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 261 | apply (rule singleton_prod_bij) | 
| 13269 | 262 | apply (rule sum_disjoint_bij, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 263 | apply (simp (no_asm_simp) cong add: case_cong) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 264 | apply (rule comp_lam [THEN trans, symmetric]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 265 | apply (fast elim!: case_type) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 266 | apply (simp (no_asm_simp) add: case_case) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 267 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 268 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 269 | lemma prod_sum_singleton_ord_iso: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 270 | "[| a:A; well_ord(A,r) |] ==> | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 271 | (lam x:pred(A,a,r)*B + pred(B,b,s). case(%x. x, %y.<a,y>, x)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 272 | : ord_iso(pred(A,a,r)*B + pred(B,b,s), | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 273 | radd(A*B, rmult(A,r,B,s), B, s), | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 274 |               pred(A,a,r)*B Un {a}*pred(B,b,s), rmult(A,r,B,s))"
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 275 | apply (rule prod_sum_singleton_bij [THEN ord_isoI]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 276 | apply (simp (no_asm_simp) add: pred_iff well_ord_is_wf [THEN wf_on_not_refl]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 277 | apply (auto elim!: well_ord_is_wf [THEN wf_on_asym] predE) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 278 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 279 | |
| 13512 | 280 | subsubsection{*Distributive law*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 281 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 282 | lemma sum_prod_distrib_bij: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 283 | "(lam <x,z>:(A+B)*C. case(%y. Inl(<y,z>), %y. Inr(<y,z>), x)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 284 | : bij((A+B)*C, (A*C)+(B*C))" | 
| 13356 | 285 | by (rule_tac d = "case (%<x,y>.<Inl (x),y>, %<x,y>.<Inr (x),y>) " | 
| 286 | in lam_bijective, auto) | |
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 287 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 288 | lemma sum_prod_distrib_ord_iso: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 289 | "(lam <x,z>:(A+B)*C. case(%y. Inl(<y,z>), %y. Inr(<y,z>), x)) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 290 | : ord_iso((A+B)*C, rmult(A+B, radd(A,r,B,s), C, t), | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 291 | (A*C)+(B*C), radd(A*C, rmult(A,r,C,t), B*C, rmult(B,s,C,t)))" | 
| 13356 | 292 | by (rule sum_prod_distrib_bij [THEN ord_isoI], auto) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 293 | |
| 13512 | 294 | subsubsection{*Associativity*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 295 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 296 | lemma prod_assoc_bij: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 297 | "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) : bij((A*B)*C, A*(B*C))" | 
| 13356 | 298 | by (rule_tac d = "%<x, <y,z>>. <<x,y>, z>" in lam_bijective, auto) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 299 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 300 | lemma prod_assoc_ord_iso: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 301 | "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 302 | : ord_iso((A*B)*C, rmult(A*B, rmult(A,r,B,s), C, t), | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 303 | A*(B*C), rmult(A, r, B*C, rmult(B,s,C,t)))" | 
| 13356 | 304 | by (rule prod_assoc_bij [THEN ord_isoI], auto) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 305 | |
| 13356 | 306 | subsection{*Inverse Image of a Relation*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 307 | |
| 13512 | 308 | subsubsection{*Rewrite rule*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 309 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 310 | lemma rvimage_iff: "<a,b> : rvimage(A,f,r) <-> <f`a,f`b>: r & a:A & b:A" | 
| 13269 | 311 | by (unfold rvimage_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 312 | |
| 13512 | 313 | subsubsection{*Type checking*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 314 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 315 | lemma rvimage_type: "rvimage(A,f,r) <= A*A" | 
| 13784 | 316 | by (unfold rvimage_def, rule Collect_subset) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 317 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 318 | lemmas field_rvimage = rvimage_type [THEN field_rel_subset] | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 319 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 320 | lemma rvimage_converse: "rvimage(A,f, converse(r)) = converse(rvimage(A,f,r))" | 
| 13269 | 321 | by (unfold rvimage_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 322 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 323 | |
| 13512 | 324 | subsubsection{*Partial Ordering Properties*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 325 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 326 | lemma irrefl_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 327 | "[| f: inj(A,B); irrefl(B,r) |] ==> irrefl(A, rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 328 | apply (unfold irrefl_def rvimage_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 329 | apply (blast intro: inj_is_fun [THEN apply_type]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 330 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 331 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 332 | lemma trans_on_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 333 | "[| f: inj(A,B); trans[B](r) |] ==> trans[A](rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 334 | apply (unfold trans_on_def rvimage_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 335 | apply (blast intro: inj_is_fun [THEN apply_type]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 336 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 337 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 338 | lemma part_ord_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 339 | "[| f: inj(A,B); part_ord(B,r) |] ==> part_ord(A, rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 340 | apply (unfold part_ord_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 341 | apply (blast intro!: irrefl_rvimage trans_on_rvimage) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 342 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 343 | |
| 13512 | 344 | subsubsection{*Linearity*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 345 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 346 | lemma linear_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 347 | "[| f: inj(A,B); linear(B,r) |] ==> linear(A,rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 348 | apply (simp add: inj_def linear_def rvimage_iff) | 
| 13269 | 349 | apply (blast intro: apply_funtype) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 350 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 351 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 352 | lemma tot_ord_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 353 | "[| f: inj(A,B); tot_ord(B,r) |] ==> tot_ord(A, rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 354 | apply (unfold tot_ord_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 355 | apply (blast intro!: part_ord_rvimage linear_rvimage) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 356 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 357 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 358 | |
| 13512 | 359 | subsubsection{*Well-foundedness*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 360 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 361 | lemma wf_rvimage [intro!]: "wf(r) ==> wf(rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 362 | apply (simp (no_asm_use) add: rvimage_def wf_eq_minimal) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 363 | apply clarify | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 364 | apply (subgoal_tac "EX w. w : {w: {f`x. x:Q}. EX x. x: Q & (f`x = w) }")
 | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 365 | apply (erule allE) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 366 | apply (erule impE) | 
| 13269 | 367 | apply assumption | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 368 | apply blast | 
| 13269 | 369 | apply blast | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 370 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 371 | |
| 13544 | 372 | text{*But note that the combination of @{text wf_imp_wf_on} and
 | 
| 22710 | 373 |  @{text wf_rvimage} gives @{prop "wf(r) ==> wf[C](rvimage(A,f,r))"}*}
 | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 374 | lemma wf_on_rvimage: "[| f: A->B; wf[B](r) |] ==> wf[A](rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 375 | apply (rule wf_onI2) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 376 | apply (subgoal_tac "ALL z:A. f`z=f`y --> z: Ba") | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 377 | apply blast | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 378 | apply (erule_tac a = "f`y" in wf_on_induct) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 379 | apply (blast intro!: apply_funtype) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 380 | apply (blast intro!: apply_funtype dest!: rvimage_iff [THEN iffD1]) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 381 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 382 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 383 | (*Note that we need only wf[A](...) and linear(A,...) to get the result!*) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 384 | lemma well_ord_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 385 | "[| f: inj(A,B); well_ord(B,r) |] ==> well_ord(A, rvimage(A,f,r))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 386 | apply (rule well_ordI) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 387 | apply (unfold well_ord_def tot_ord_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 388 | apply (blast intro!: wf_on_rvimage inj_is_fun) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 389 | apply (blast intro!: linear_rvimage) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 390 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 391 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 392 | lemma ord_iso_rvimage: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 393 | "f: bij(A,B) ==> f: ord_iso(A, rvimage(A,f,s), B, s)" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 394 | apply (unfold ord_iso_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 395 | apply (simp add: rvimage_iff) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 396 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 397 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 398 | lemma ord_iso_rvimage_eq: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 399 | "f: ord_iso(A,r, B,s) ==> rvimage(A,f,s) = r Int A*A" | 
| 13356 | 400 | by (unfold ord_iso_def rvimage_def, blast) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 401 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 402 | |
| 13634 | 403 | subsection{*Every well-founded relation is a subset of some inverse image of
 | 
| 404 | an ordinal*} | |
| 405 | ||
| 406 | lemma wf_rvimage_Ord: "Ord(i) \<Longrightarrow> wf(rvimage(A, f, Memrel(i)))" | |
| 407 | by (blast intro: wf_rvimage wf_Memrel) | |
| 408 | ||
| 409 | ||
| 24893 | 410 | definition | 
| 411 | wfrank :: "[i,i]=>i" where | |
| 13634 | 412 |     "wfrank(r,a) == wfrec(r, a, %x f. \<Union>y \<in> r-``{x}. succ(f`y))"
 | 
| 413 | ||
| 24893 | 414 | definition | 
| 415 | wftype :: "i=>i" where | |
| 13634 | 416 | "wftype(r) == \<Union>y \<in> range(r). succ(wfrank(r,y))" | 
| 417 | ||
| 418 | lemma wfrank: "wf(r) ==> wfrank(r,a) = (\<Union>y \<in> r-``{a}. succ(wfrank(r,y)))"
 | |
| 419 | by (subst wfrank_def [THEN def_wfrec], simp_all) | |
| 420 | ||
| 421 | lemma Ord_wfrank: "wf(r) ==> Ord(wfrank(r,a))" | |
| 422 | apply (rule_tac a=a in wf_induct, assumption) | |
| 423 | apply (subst wfrank, assumption) | |
| 424 | apply (rule Ord_succ [THEN Ord_UN], blast) | |
| 425 | done | |
| 426 | ||
| 427 | lemma wfrank_lt: "[|wf(r); <a,b> \<in> r|] ==> wfrank(r,a) < wfrank(r,b)" | |
| 428 | apply (rule_tac a1 = b in wfrank [THEN ssubst], assumption) | |
| 429 | apply (rule UN_I [THEN ltI]) | |
| 430 | apply (simp add: Ord_wfrank vimage_iff)+ | |
| 431 | done | |
| 432 | ||
| 433 | lemma Ord_wftype: "wf(r) ==> Ord(wftype(r))" | |
| 434 | by (simp add: wftype_def Ord_wfrank) | |
| 435 | ||
| 436 | lemma wftypeI: "\<lbrakk>wf(r); x \<in> field(r)\<rbrakk> \<Longrightarrow> wfrank(r,x) \<in> wftype(r)" | |
| 437 | apply (simp add: wftype_def) | |
| 438 | apply (blast intro: wfrank_lt [THEN ltD]) | |
| 439 | done | |
| 440 | ||
| 441 | ||
| 442 | lemma wf_imp_subset_rvimage: | |
| 443 | "[|wf(r); r \<subseteq> A*A|] ==> \<exists>i f. Ord(i) & r <= rvimage(A, f, Memrel(i))" | |
| 444 | apply (rule_tac x="wftype(r)" in exI) | |
| 445 | apply (rule_tac x="\<lambda>x\<in>A. wfrank(r,x)" in exI) | |
| 446 | apply (simp add: Ord_wftype, clarify) | |
| 447 | apply (frule subsetD, assumption, clarify) | |
| 448 | apply (simp add: rvimage_iff wfrank_lt [THEN ltD]) | |
| 449 | apply (blast intro: wftypeI) | |
| 450 | done | |
| 451 | ||
| 452 | theorem wf_iff_subset_rvimage: | |
| 453 | "relation(r) ==> wf(r) <-> (\<exists>i f A. Ord(i) & r <= rvimage(A, f, Memrel(i)))" | |
| 454 | by (blast dest!: relation_field_times_field wf_imp_subset_rvimage | |
| 455 | intro: wf_rvimage_Ord [THEN wf_subset]) | |
| 456 | ||
| 457 | ||
| 13544 | 458 | subsection{*Other Results*}
 | 
| 459 | ||
| 460 | lemma wf_times: "A Int B = 0 ==> wf(A*B)" | |
| 461 | by (simp add: wf_def, blast) | |
| 462 | ||
| 463 | text{*Could also be used to prove @{text wf_radd}*}
 | |
| 464 | lemma wf_Un: | |
| 465 | "[| range(r) Int domain(s) = 0; wf(r); wf(s) |] ==> wf(r Un s)" | |
| 466 | apply (simp add: wf_def, clarify) | |
| 467 | apply (rule equalityI) | |
| 468 | prefer 2 apply blast | |
| 469 | apply clarify | |
| 470 | apply (drule_tac x=Z in spec) | |
| 471 | apply (drule_tac x="Z Int domain(s)" in spec) | |
| 472 | apply simp | |
| 473 | apply (blast intro: elim: equalityE) | |
| 474 | done | |
| 475 | ||
| 476 | subsubsection{*The Empty Relation*}
 | |
| 477 | ||
| 478 | lemma wf0: "wf(0)" | |
| 479 | by (simp add: wf_def, blast) | |
| 480 | ||
| 481 | lemma linear0: "linear(0,0)" | |
| 482 | by (simp add: linear_def) | |
| 483 | ||
| 484 | lemma well_ord0: "well_ord(0,0)" | |
| 485 | by (blast intro: wf_imp_wf_on well_ordI wf0 linear0) | |
| 13512 | 486 | |
| 487 | subsubsection{*The "measure" relation is useful with wfrec*}
 | |
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 488 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 489 | lemma measure_eq_rvimage_Memrel: | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 490 | "measure(A,f) = rvimage(A,Lambda(A,f),Memrel(Collect(RepFun(A,f),Ord)))" | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 491 | apply (simp (no_asm) add: measure_def rvimage_def Memrel_iff) | 
| 13269 | 492 | apply (rule equalityI, auto) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 493 | apply (auto intro: Ord_in_Ord simp add: lt_def) | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 494 | done | 
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 495 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 496 | lemma wf_measure [iff]: "wf(measure(A,f))" | 
| 13356 | 497 | by (simp (no_asm) add: measure_eq_rvimage_Memrel wf_Memrel wf_rvimage) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 498 | |
| 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 499 | lemma measure_iff [iff]: "<x,y> : measure(A,f) <-> x:A & y:A & f(x)<f(y)" | 
| 13356 | 500 | by (simp (no_asm) add: measure_def) | 
| 13140 
6d97dbb189a9
converted Order.ML OrderType.ML OrderArith.ML to Isar format
 paulson parents: 
9883diff
changeset | 501 | |
| 13544 | 502 | lemma linear_measure: | 
| 503 | assumes Ordf: "!!x. x \<in> A ==> Ord(f(x))" | |
| 504 | and inj: "!!x y. [|x \<in> A; y \<in> A; f(x) = f(y) |] ==> x=y" | |
| 505 | shows "linear(A, measure(A,f))" | |
| 506 | apply (auto simp add: linear_def) | |
| 507 | apply (rule_tac i="f(x)" and j="f(y)" in Ord_linear_lt) | |
| 508 | apply (simp_all add: Ordf) | |
| 509 | apply (blast intro: inj) | |
| 510 | done | |
| 511 | ||
| 512 | lemma wf_on_measure: "wf[B](measure(A,f))" | |
| 513 | by (rule wf_imp_wf_on [OF wf_measure]) | |
| 514 | ||
| 515 | lemma well_ord_measure: | |
| 516 | assumes Ordf: "!!x. x \<in> A ==> Ord(f(x))" | |
| 517 | and inj: "!!x y. [|x \<in> A; y \<in> A; f(x) = f(y) |] ==> x=y" | |
| 518 | shows "well_ord(A, measure(A,f))" | |
| 519 | apply (rule well_ordI) | |
| 520 | apply (rule wf_on_measure) | |
| 521 | apply (blast intro: linear_measure Ordf inj) | |
| 522 | done | |
| 523 | ||
| 524 | lemma measure_type: "measure(A,f) <= A*A" | |
| 525 | by (auto simp add: measure_def) | |
| 526 | ||
| 13512 | 527 | subsubsection{*Well-foundedness of Unions*}
 | 
| 528 | ||
| 529 | lemma wf_on_Union: | |
| 530 | assumes wfA: "wf[A](r)" | |
| 531 | and wfB: "!!a. a\<in>A ==> wf[B(a)](s)" | |
| 532 | and ok: "!!a u v. [|<u,v> \<in> s; v \<in> B(a); a \<in> A|] | |
| 533 | ==> (\<exists>a'\<in>A. <a',a> \<in> r & u \<in> B(a')) | u \<in> B(a)" | |
| 534 | shows "wf[\<Union>a\<in>A. B(a)](s)" | |
| 535 | apply (rule wf_onI2) | |
| 536 | apply (erule UN_E) | |
| 537 | apply (subgoal_tac "\<forall>z \<in> B(a). z \<in> Ba", blast) | |
| 538 | apply (rule_tac a = a in wf_on_induct [OF wfA], assumption) | |
| 539 | apply (rule ballI) | |
| 540 | apply (rule_tac a = z in wf_on_induct [OF wfB], assumption, assumption) | |
| 541 | apply (rename_tac u) | |
| 542 | apply (drule_tac x=u in bspec, blast) | |
| 543 | apply (erule mp, clarify) | |
| 13784 | 544 | apply (frule ok, assumption+, blast) | 
| 13512 | 545 | done | 
| 546 | ||
| 14120 | 547 | subsubsection{*Bijections involving Powersets*}
 | 
| 548 | ||
| 549 | lemma Pow_sum_bij: | |
| 550 |     "(\<lambda>Z \<in> Pow(A+B). <{x \<in> A. Inl(x) \<in> Z}, {y \<in> B. Inr(y) \<in> Z}>)  
 | |
| 551 | \<in> bij(Pow(A+B), Pow(A)*Pow(B))" | |
| 552 | apply (rule_tac d = "%<X,Y>. {Inl (x). x \<in> X} Un {Inr (y). y \<in> Y}" 
 | |
| 553 | in lam_bijective) | |
| 554 | apply force+ | |
| 555 | done | |
| 556 | ||
| 557 | text{*As a special case, we have @{term "bij(Pow(A*B), A -> Pow(B))"} *}
 | |
| 558 | lemma Pow_Sigma_bij: | |
| 559 |     "(\<lambda>r \<in> Pow(Sigma(A,B)). \<lambda>x \<in> A. r``{x})  
 | |
| 14171 
0cab06e3bbd0
Extended the notion of letter and digit, such that now one may use greek,
 skalberg parents: 
14120diff
changeset | 560 | \<in> bij(Pow(Sigma(A,B)), \<Pi> x \<in> A. Pow(B(x)))" | 
| 14120 | 561 | apply (rule_tac d = "%f. \<Union>x \<in> A. \<Union>y \<in> f`x. {<x,y>}" in lam_bijective)
 | 
| 562 | apply (blast intro: lam_type) | |
| 563 | apply (blast dest: apply_type, simp_all) | |
| 564 | apply fast (*strange, but blast can't do it*) | |
| 565 | apply (rule fun_extension, auto) | |
| 566 | by blast | |
| 567 | ||
| 437 | 568 | end |