| author | haftmann | 
| Mon, 12 Jul 2010 10:48:37 +0200 | |
| changeset 37767 | a2b7a20d6ea3 | 
| parent 37594 | 32ad67684ee7 | 
| child 39198 | f967a16dfcdd | 
| permissions | -rw-r--r-- | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 1 | (* Title: HOL/Quotient_Examples/Quotient_Int.thy | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 2 | Author: Cezary Kaliszyk | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 3 | Author: Christian Urban | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 4 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 5 | Integers based on Quotients, based on an older version by Larry Paulson. | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 6 | *) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 7 | theory Quotient_Int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 8 | imports Quotient_Product Nat | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 9 | begin | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 10 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 11 | fun | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 12 | intrel :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> bool" (infix "\<approx>" 50) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 13 | where | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 14 | "intrel (x, y) (u, v) = (x + v = u + y)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 15 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 16 | quotient_type int = "nat \<times> nat" / intrel | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 17 | by (auto simp add: equivp_def expand_fun_eq) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 18 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 19 | instantiation int :: "{zero, one, plus, uminus, minus, times, ord, abs, sgn}"
 | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 20 | begin | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 21 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 22 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 23 | "0 \<Colon> int" is "(0\<Colon>nat, 0\<Colon>nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 24 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 25 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 26 | "1 \<Colon> int" is "(1\<Colon>nat, 0\<Colon>nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 27 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 28 | fun | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 29 | plus_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> (nat \<times> nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 30 | where | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 31 | "plus_int_raw (x, y) (u, v) = (x + u, y + v)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 32 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 33 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 34 | "(op +) \<Colon> (int \<Rightarrow> int \<Rightarrow> int)" is "plus_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 35 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 36 | fun | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 37 | uminus_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 38 | where | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 39 | "uminus_int_raw (x, y) = (y, x)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 40 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 41 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 42 | "(uminus \<Colon> (int \<Rightarrow> int))" is "uminus_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 43 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 44 | definition | 
| 37767 | 45 | minus_int_def: "z - w = z + (-w\<Colon>int)" | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 46 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 47 | fun | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 48 | times_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> (nat \<times> nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 49 | where | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 50 | "times_int_raw (x, y) (u, v) = (x*u + y*v, x*v + y*u)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 51 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 52 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 53 | "(op *) :: (int \<Rightarrow> int \<Rightarrow> int)" is "times_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 54 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 55 | fun | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 56 | le_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> bool" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 57 | where | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 58 | "le_int_raw (x, y) (u, v) = (x+v \<le> u+y)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 59 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 60 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 61 | le_int_def: "(op \<le>) :: int \<Rightarrow> int \<Rightarrow> bool" is "le_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 62 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 63 | definition | 
| 37767 | 64 | less_int_def: "(z\<Colon>int) < w = (z \<le> w \<and> z \<noteq> w)" | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 65 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 66 | definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 67 | zabs_def: "\<bar>i\<Colon>int\<bar> = (if i < 0 then - i else i)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 68 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 69 | definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 70 | zsgn_def: "sgn (i\<Colon>int) = (if i = 0 then 0 else if 0 < i then 1 else - 1)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 71 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 72 | instance .. | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 73 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 74 | end | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 75 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 76 | lemma [quot_respect]: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 77 | shows "(op \<approx> ===> op \<approx> ===> op \<approx>) plus_int_raw plus_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 78 | and "(op \<approx> ===> op \<approx>) uminus_int_raw uminus_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 79 | and "(op \<approx> ===> op \<approx> ===> op =) le_int_raw le_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 80 | by auto | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 81 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 82 | lemma times_int_raw_fst: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 83 | assumes a: "x \<approx> z" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 84 | shows "times_int_raw x y \<approx> times_int_raw z y" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 85 | using a | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 86 | apply(cases x, cases y, cases z) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 87 | apply(auto simp add: times_int_raw.simps intrel.simps) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 88 | apply(rename_tac u v w x y z) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 89 | apply(subgoal_tac "u*w + z*w = y*w + v*w & u*x + z*x = y*x + v*x") | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 90 | apply(simp add: mult_ac) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 91 | apply(simp add: add_mult_distrib [symmetric]) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 92 | done | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 93 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 94 | lemma times_int_raw_snd: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 95 | assumes a: "x \<approx> z" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 96 | shows "times_int_raw y x \<approx> times_int_raw y z" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 97 | using a | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 98 | apply(cases x, cases y, cases z) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 99 | apply(auto simp add: times_int_raw.simps intrel.simps) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 100 | apply(rename_tac u v w x y z) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 101 | apply(subgoal_tac "u*w + z*w = y*w + v*w & u*x + z*x = y*x + v*x") | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 102 | apply(simp add: mult_ac) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 103 | apply(simp add: add_mult_distrib [symmetric]) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 104 | done | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 105 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 106 | lemma [quot_respect]: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 107 | shows "(op \<approx> ===> op \<approx> ===> op \<approx>) times_int_raw times_int_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 108 | apply(simp only: fun_rel_def) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 109 | apply(rule allI | rule impI)+ | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 110 | apply(rule equivp_transp[OF int_equivp]) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 111 | apply(rule times_int_raw_fst) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 112 | apply(assumption) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 113 | apply(rule times_int_raw_snd) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 114 | apply(assumption) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 115 | done | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 116 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 117 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 118 | text{* The integers form a @{text comm_ring_1}*}
 | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 119 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 120 | instance int :: comm_ring_1 | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 121 | proof | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 122 | fix i j k :: int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 123 | show "(i + j) + k = i + (j + k)" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 124 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 125 | show "i + j = j + i" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 126 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 127 | show "0 + i = (i::int)" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 128 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 129 | show "- i + i = 0" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 130 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 131 | show "i - j = i + - j" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 132 | by (simp add: minus_int_def) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 133 | show "(i * j) * k = i * (j * k)" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 134 | by (descending) (auto simp add: algebra_simps) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 135 | show "i * j = j * i" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 136 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 137 | show "1 * i = i" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 138 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 139 | show "(i + j) * k = i * k + j * k" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 140 | by (descending) (auto simp add: algebra_simps) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 141 | show "0 \<noteq> (1::int)" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 142 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 143 | qed | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 144 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 145 | lemma plus_int_raw_rsp_aux: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 146 | assumes a: "a \<approx> b" "c \<approx> d" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 147 | shows "plus_int_raw a c \<approx> plus_int_raw b d" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 148 | using a | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 149 | by (cases a, cases b, cases c, cases d) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 150 | (simp) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 151 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 152 | lemma add_abs_int: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 153 | "(abs_int (x,y)) + (abs_int (u,v)) = | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 154 | (abs_int (x + u, y + v))" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 155 | apply(simp add: plus_int_def id_simps) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 156 | apply(fold plus_int_raw.simps) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 157 | apply(rule Quotient_rel_abs[OF Quotient_int]) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 158 | apply(rule plus_int_raw_rsp_aux) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 159 | apply(simp_all add: rep_abs_rsp_left[OF Quotient_int]) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 160 | done | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 161 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 162 | definition int_of_nat_raw: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 163 | "int_of_nat_raw m = (m :: nat, 0 :: nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 164 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 165 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 166 | "int_of_nat :: nat \<Rightarrow> int" is "int_of_nat_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 167 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 168 | lemma[quot_respect]: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 169 | shows "(op = ===> op \<approx>) int_of_nat_raw int_of_nat_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 170 | by (simp add: equivp_reflp[OF int_equivp]) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 171 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 172 | lemma int_of_nat: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 173 | shows "of_nat m = int_of_nat m" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 174 | by (induct m) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 175 | (simp_all add: zero_int_def one_int_def int_of_nat_def int_of_nat_raw add_abs_int) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 176 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 177 | instance int :: linorder | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 178 | proof | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 179 | fix i j k :: int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 180 | show antisym: "i \<le> j \<Longrightarrow> j \<le> i \<Longrightarrow> i = j" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 181 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 182 | show "(i < j) = (i \<le> j \<and> \<not> j \<le> i)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 183 | by (auto simp add: less_int_def dest: antisym) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 184 | show "i \<le> i" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 185 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 186 | show "i \<le> j \<Longrightarrow> j \<le> k \<Longrightarrow> i \<le> k" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 187 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 188 | show "i \<le> j \<or> j \<le> i" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 189 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 190 | qed | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 191 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 192 | instantiation int :: distrib_lattice | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 193 | begin | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 194 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 195 | definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 196 | "(inf \<Colon> int \<Rightarrow> int \<Rightarrow> int) = min" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 197 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 198 | definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 199 | "(sup \<Colon> int \<Rightarrow> int \<Rightarrow> int) = max" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 200 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 201 | instance | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 202 | by default | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 203 | (auto simp add: inf_int_def sup_int_def min_max.sup_inf_distrib1) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 204 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 205 | end | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 206 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 207 | instance int :: ordered_cancel_ab_semigroup_add | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 208 | proof | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 209 | fix i j k :: int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 210 | show "i \<le> j \<Longrightarrow> k + i \<le> k + j" | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 211 | by (descending) (auto) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 212 | qed | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 213 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 214 | abbreviation | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 215 | "less_int_raw i j \<equiv> le_int_raw i j \<and> \<not>(i \<approx> j)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 216 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 217 | lemma zmult_zless_mono2_lemma: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 218 | fixes i j::int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 219 | and k::nat | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 220 | shows "i < j \<Longrightarrow> 0 < k \<Longrightarrow> of_nat k * i < of_nat k * j" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 221 | apply(induct "k") | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 222 | apply(simp) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 223 | apply(case_tac "k = 0") | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 224 | apply(simp_all add: left_distrib add_strict_mono) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 225 | done | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 226 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 227 | lemma zero_le_imp_eq_int_raw: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 228 | fixes k::"(nat \<times> nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 229 | shows "less_int_raw (0, 0) k \<Longrightarrow> (\<exists>n > 0. k \<approx> int_of_nat_raw n)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 230 | apply(cases k) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 231 | apply(simp add:int_of_nat_raw) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 232 | apply(auto) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 233 | apply(rule_tac i="b" and j="a" in less_Suc_induct) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 234 | apply(auto) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 235 | done | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 236 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 237 | lemma zero_le_imp_eq_int: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 238 | fixes k::int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 239 | shows "0 < k \<Longrightarrow> \<exists>n > 0. k = of_nat n" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 240 | unfolding less_int_def int_of_nat | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 241 | by (descending) (rule zero_le_imp_eq_int_raw) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 242 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 243 | lemma zmult_zless_mono2: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 244 | fixes i j k::int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 245 | assumes a: "i < j" "0 < k" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 246 | shows "k * i < k * j" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 247 | using a | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 248 | by (drule_tac zero_le_imp_eq_int) (auto simp add: zmult_zless_mono2_lemma) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 249 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 250 | text{*The integers form an ordered integral domain*}
 | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 251 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 252 | instance int :: linordered_idom | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 253 | proof | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 254 | fix i j k :: int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 255 | show "i < j \<Longrightarrow> 0 < k \<Longrightarrow> k * i < k * j" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 256 | by (rule zmult_zless_mono2) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 257 | show "\<bar>i\<bar> = (if i < 0 then -i else i)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 258 | by (simp only: zabs_def) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 259 | show "sgn (i\<Colon>int) = (if i=0 then 0 else if 0<i then 1 else - 1)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 260 | by (simp only: zsgn_def) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 261 | qed | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 262 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 263 | lemmas int_distrib = | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 264 | left_distrib [of "z1::int" "z2" "w", standard] | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 265 | right_distrib [of "w::int" "z1" "z2", standard] | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 266 | left_diff_distrib [of "z1::int" "z2" "w", standard] | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 267 | right_diff_distrib [of "w::int" "z1" "z2", standard] | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 268 | minus_add_distrib[of "z1::int" "z2", standard] | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 269 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 270 | lemma int_induct_raw: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 271 | assumes a: "P (0::nat, 0)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 272 | and b: "\<And>i. P i \<Longrightarrow> P (plus_int_raw i (1, 0))" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 273 | and c: "\<And>i. P i \<Longrightarrow> P (plus_int_raw i (uminus_int_raw (1, 0)))" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 274 | shows "P x" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 275 | proof (cases x, clarify) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 276 | fix a b | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 277 | show "P (a, b)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 278 | proof (induct a arbitrary: b rule: Nat.induct) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 279 | case zero | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 280 | show "P (0, b)" using assms by (induct b) auto | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 281 | next | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 282 | case (Suc n) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 283 | then show ?case using assms by auto | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 284 | qed | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 285 | qed | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 286 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 287 | lemma int_induct: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 288 | fixes x :: int | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 289 | assumes a: "P 0" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 290 | and b: "\<And>i. P i \<Longrightarrow> P (i + 1)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 291 | and c: "\<And>i. P i \<Longrightarrow> P (i - 1)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 292 | shows "P x" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 293 | using a b c unfolding minus_int_def | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 294 | by (lifting int_induct_raw) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 295 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 296 | text {* Magnitide of an Integer, as a Natural Number: @{term nat} *}
 | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 297 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 298 | definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 299 | "int_to_nat_raw \<equiv> \<lambda>(x, y).x - (y::nat)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 300 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 301 | quotient_definition | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 302 | "int_to_nat::int \<Rightarrow> nat" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 303 | is | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 304 | "int_to_nat_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 305 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 306 | lemma [quot_respect]: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 307 | shows "(intrel ===> op =) int_to_nat_raw int_to_nat_raw" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 308 | by (auto iff: int_to_nat_raw_def) | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 309 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 310 | lemma nat_le_eq_zle: | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 311 | fixes w z::"int" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 312 | shows "0 < w \<or> 0 \<le> z \<Longrightarrow> (int_to_nat w \<le> int_to_nat z) = (w \<le> z)" | 
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 313 | unfolding less_int_def | 
| 37594 
32ad67684ee7
cosmetics: avoided statement of raw theorems, used the method descending instead
 Christian Urban <urbanc@in.tum.de> parents: 
36524diff
changeset | 314 | by (descending) (auto simp add: int_to_nat_raw_def) | 
| 36524 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 315 | |
| 
3909002beca5
Tuning the quotient examples
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 316 | end |