src/HOL/Word/Misc_Numeric.thy
author boehmes
Mon, 08 Nov 2010 12:13:44 +0100
changeset 40424 7550b2cba1cb
parent 39910 10097e0a9dbd
child 44821 a92f65e174cf
permissions -rw-r--r--
better modularization: moved SMT configuration options and diagnostics as well as SMT failure and exception into separate structures (both of which are loaded first and consequently are available to other SMT structures)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     1
(* 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     2
  Author:  Jeremy Dawson, NICTA
24350
4d74f37c6367 headers for document generation
huffman
parents: 24333
diff changeset
     3
*) 
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     4
24350
4d74f37c6367 headers for document generation
huffman
parents: 24333
diff changeset
     5
header {* Useful Numerical Lemmas *}
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     6
37655
f4d616d41a59 more speaking theory names
haftmann
parents: 37591
diff changeset
     7
theory Misc_Numeric
25592
e8ddaf6bf5df explicit import of theory Main
haftmann
parents: 25349
diff changeset
     8
imports Main Parity
e8ddaf6bf5df explicit import of theory Main
haftmann
parents: 25349
diff changeset
     9
begin
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    10
39910
10097e0a9dbd constant `contents` renamed to `the_elem`
haftmann
parents: 37887
diff changeset
    11
lemma the_elemI: "y = {x} ==> the_elem y = x" 
10097e0a9dbd constant `contents` renamed to `the_elem`
haftmann
parents: 37887
diff changeset
    12
  by simp
26086
3c243098b64a New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
huffman
parents: 26072
diff changeset
    13
37591
d3daea901123 merged constants "split" and "prod_case"
haftmann
parents: 31018
diff changeset
    14
lemmas split_split = prod.split
d3daea901123 merged constants "split" and "prod_case"
haftmann
parents: 31018
diff changeset
    15
lemmas split_split_asm = prod.split_asm
30445
757ba2bb2b39 renamed (unused?) "split.splits" to split_splits -- it was only accepted by accident;
wenzelm
parents: 30242
diff changeset
    16
lemmas split_splits = split_split split_split_asm
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    17
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    18
lemmas funpow_0 = funpow.simps(1)
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    19
lemmas funpow_Suc = funpow.simps(2)
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    20
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    21
lemma nonemptyE: "S ~= {} ==> (!!x. x : S ==> R) ==> R" by auto
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    22
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    23
lemma gt_or_eq_0: "0 < y \<or> 0 = (y::nat)" by arith 
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    24
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    25
declare iszero_0 [iff]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    26
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    27
lemmas xtr1 = xtrans(1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    28
lemmas xtr2 = xtrans(2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    29
lemmas xtr3 = xtrans(3)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    30
lemmas xtr4 = xtrans(4)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    31
lemmas xtr5 = xtrans(5)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    32
lemmas xtr6 = xtrans(6)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    33
lemmas xtr7 = xtrans(7)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    34
lemmas xtr8 = xtrans(8)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    35
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    36
lemmas nat_simps = diff_add_inverse2 diff_add_inverse
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    37
lemmas nat_iffs = le_add1 le_add2
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    38
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    39
lemma sum_imp_diff: "j = k + i ==> j - i = (k :: nat)" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    40
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    41
lemma nobm1:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    42
  "0 < (number_of w :: nat) ==> 
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    43
   number_of w - (1 :: nat) = number_of (Int.pred w)" 
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    44
  apply (unfold nat_number_of_def One_nat_def nat_1 [symmetric] pred_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    45
  apply (simp add: number_of_eq nat_diff_distrib [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    46
  done
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    47
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    48
lemma zless2: "0 < (2 :: int)" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    49
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    50
lemmas zless2p [simp] = zless2 [THEN zero_less_power]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    51
lemmas zle2p [simp] = zless2p [THEN order_less_imp_le]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    52
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    53
lemmas pos_mod_sign2 = zless2 [THEN pos_mod_sign [where b = "2::int"]]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    54
lemmas pos_mod_bound2 = zless2 [THEN pos_mod_bound [where b = "2::int"]]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    55
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    56
-- "the inverse(s) of @{text number_of}"
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    57
lemma nmod2: "n mod (2::int) = 0 | n mod 2 = 1" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    58
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    59
lemma emep1:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    60
  "even n ==> even d ==> 0 <= d ==> (n + 1) mod (d :: int) = (n mod d) + 1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    61
  apply (simp add: add_commute)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    62
  apply (safe dest!: even_equiv_def [THEN iffD1])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    63
  apply (subst pos_zmod_mult_2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    64
   apply arith
30943
eb3dbbe971f6 zmod_zmult_zmult1 now subsumed by mod_mult_mult1
haftmann
parents: 30445
diff changeset
    65
  apply (simp add: mod_mult_mult1)
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    66
 done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    67
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    68
lemmas eme1p = emep1 [simplified add_commute]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    69
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    70
lemma le_diff_eq': "(a \<le> c - b) = (b + a \<le> (c::int))" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    71
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    72
lemma less_diff_eq': "(a < c - b) = (b + a < (c::int))" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    73
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    74
lemma diff_le_eq': "(a - b \<le> c) = (a \<le> b + (c::int))" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    75
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    76
lemma diff_less_eq': "(a - b < c) = (a < b + (c::int))" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    77
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    78
lemmas m1mod2k = zless2p [THEN zmod_minus1]
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    79
lemmas m1mod22k = mult_pos_pos [OF zless2 zless2p, THEN zmod_minus1]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    80
lemmas p1mod22k' = zless2p [THEN order_less_imp_le, THEN pos_zmod_mult_2]
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    81
lemmas z1pmod2' = zero_le_one [THEN pos_zmod_mult_2, simplified]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    82
lemmas z1pdiv2' = zero_le_one [THEN pos_zdiv_mult_2, simplified]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    83
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    84
lemma p1mod22k:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    85
  "(2 * b + 1) mod (2 * 2 ^ n) = 2 * (b mod 2 ^ n) + (1::int)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    86
  by (simp add: p1mod22k' add_commute)
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    87
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    88
lemma z1pmod2:
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    89
  "(2 * b + 1) mod 2 = (1::int)" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    90
  
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    91
lemma z1pdiv2:
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    92
  "(2 * b + 1) div 2 = (b::int)" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    93
30031
bd786c37af84 Removed redundant lemmas
nipkow
parents: 29948
diff changeset
    94
lemmas zdiv_le_dividend = xtr3 [OF div_by_1 [symmetric] zdiv_mono2,
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    95
  simplified int_one_le_iff_zero_less, simplified, standard]
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    96
  
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    97
lemma axxbyy:
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
    98
  "a + m + m = b + n + n ==> (a = 0 | a = 1) ==> (b = 0 | b = 1) ==>  
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
    99
   a = b & m = (n :: int)" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   100
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   101
lemma axxmod2:
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   102
  "(1 + x + x) mod 2 = (1 :: int) & (0 + x + x) mod 2 = (0 :: int)" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   103
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   104
lemma axxdiv2:
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   105
  "(1 + x + x) div 2 = (x :: int) & (0 + x + x) div 2 = (x :: int)"  by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   106
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   107
lemmas iszero_minus = trans [THEN trans,
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   108
  OF iszero_def neg_equal_0_iff_equal iszero_def [symmetric], standard]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   109
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   110
lemmas zadd_diff_inverse = trans [OF diff_add_cancel [symmetric] add_commute,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   111
  standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   112
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   113
lemmas add_diff_cancel2 = add_commute [THEN diff_eq_eq [THEN iffD2], standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   114
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   115
lemma zmod_uminus: "- ((a :: int) mod b) mod b = -a mod b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   116
  by (simp add : zmod_zminus1_eq_if)
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   117
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   118
lemma zmod_zsub_distrib: "((a::int) - b) mod c = (a mod c - b mod c) mod c"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   119
  apply (unfold diff_int_def)
29948
cdf12a1cb963 Cleaned up IntDiv and removed subsumed lemmas.
nipkow
parents: 28952
diff changeset
   120
  apply (rule trans [OF _ mod_add_eq [symmetric]])
cdf12a1cb963 Cleaned up IntDiv and removed subsumed lemmas.
nipkow
parents: 28952
diff changeset
   121
  apply (simp add: zmod_uminus mod_add_eq [symmetric])
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   122
  done
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   123
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   124
lemma zmod_zsub_right_eq: "((a::int) - b) mod c = (a - b mod c) mod c"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   125
  apply (unfold diff_int_def)
30034
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   126
  apply (rule trans [OF _ mod_add_right_eq [symmetric]])
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   127
  apply (simp add : zmod_uminus mod_add_right_eq [symmetric])
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   128
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   129
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   130
lemma zmod_zsub_left_eq: "((a::int) - b) mod c = (a mod c - b) mod c"
30034
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   131
  by (rule mod_add_left_eq [where b = "- b", simplified diff_int_def [symmetric]])
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   132
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   133
lemma zmod_zsub_self [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   134
  "((b :: int) - a) mod a = b mod a"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   135
  by (simp add: zmod_zsub_right_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   136
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   137
lemma zmod_zmult1_eq_rev:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   138
  "b * a mod c = b mod c * a mod (c::int)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   139
  apply (simp add: mult_commute)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   140
  apply (subst zmod_zmult1_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   141
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   142
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   143
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   144
lemmas rdmods [symmetric] = zmod_uminus [symmetric]
30034
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   145
  zmod_zsub_left_eq zmod_zsub_right_eq mod_add_left_eq
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   146
  mod_add_right_eq zmod_zmult1_eq zmod_zmult1_eq_rev
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   147
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   148
lemma mod_plus_right:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   149
  "((a + x) mod m = (b + x) mod m) = (a mod m = b mod (m :: nat))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   150
  apply (induct x)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   151
   apply (simp_all add: mod_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   152
  apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   153
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   154
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   155
lemma nat_minus_mod: "(n - n mod m) mod m = (0 :: nat)"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   156
  by (induct n) (simp_all add : mod_Suc)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   157
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   158
lemmas nat_minus_mod_plus_right = trans [OF nat_minus_mod mod_0 [symmetric],
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   159
  THEN mod_plus_right [THEN iffD2], standard, simplified]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   160
29948
cdf12a1cb963 Cleaned up IntDiv and removed subsumed lemmas.
nipkow
parents: 28952
diff changeset
   161
lemmas push_mods' = mod_add_eq [standard]
cdf12a1cb963 Cleaned up IntDiv and removed subsumed lemmas.
nipkow
parents: 28952
diff changeset
   162
  mod_mult_eq [standard] zmod_zsub_distrib [standard]
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   163
  zmod_uminus [symmetric, standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   164
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   165
lemmas push_mods = push_mods' [THEN eq_reflection, standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   166
lemmas pull_mods = push_mods [symmetric] rdmods [THEN eq_reflection, standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   167
lemmas mod_simps = 
30034
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   168
  mod_mult_self2_is_0 [THEN eq_reflection]
60f64f112174 removed redundant thms
nipkow
parents: 30031
diff changeset
   169
  mod_mult_self1_is_0 [THEN eq_reflection]
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   170
  mod_mod_trivial [THEN eq_reflection]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   171
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   172
lemma nat_mod_eq:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   173
  "!!b. b < n ==> a mod n = b mod n ==> a mod n = (b :: nat)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   174
  by (induct a) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   175
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   176
lemmas nat_mod_eq' = refl [THEN [2] nat_mod_eq]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   177
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   178
lemma nat_mod_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   179
  "(0 :: nat) < n ==> b < n = (b mod n = b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   180
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   181
   apply (erule nat_mod_eq')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   182
  apply (erule subst)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   183
  apply (erule mod_less_divisor)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   184
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   185
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   186
lemma mod_nat_add: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   187
  "(x :: nat) < z ==> y < z ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   188
   (x + y) mod z = (if x + y < z then x + y else x + y - z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   189
  apply (rule nat_mod_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   190
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   191
  apply (rule trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   192
   apply (rule le_mod_geq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   193
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   194
  apply (rule nat_mod_eq')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   195
  apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   196
  done
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   197
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   198
lemma mod_nat_sub: 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   199
  "(x :: nat) < z ==> (x - y) mod z = x - y"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   200
  by (rule nat_mod_eq') arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   201
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   202
lemma int_mod_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   203
  "(0 :: int) < n ==> (0 <= b & b < n) = (b mod n = b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   204
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   205
    apply (erule (1) mod_pos_pos_trivial)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   206
   apply (erule_tac [!] subst)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   207
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   208
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   209
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   210
lemma int_mod_eq:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   211
  "(0 :: int) <= b ==> b < n ==> a mod n = b mod n ==> a mod n = b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   212
  by clarsimp (rule mod_pos_pos_trivial)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   213
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   214
lemmas int_mod_eq' = refl [THEN [3] int_mod_eq]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   215
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   216
lemma int_mod_le: "0 <= a ==> 0 < (n :: int) ==> a mod n <= a"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   217
  apply (cases "a < n")
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   218
   apply (auto dest: mod_pos_pos_trivial pos_mod_bound [where a=a])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   219
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   220
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   221
lemma int_mod_le': "0 <= b - n ==> 0 < (n :: int) ==> b mod n <= b - n"
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   222
  by (rule int_mod_le [where a = "b - n" and n = n, simplified])
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   223
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   224
lemma int_mod_ge: "a < n ==> 0 < (n :: int) ==> a <= a mod n"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   225
  apply (cases "0 <= a")
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   226
   apply (drule (1) mod_pos_pos_trivial)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   227
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   228
  apply (rule order_trans [OF _ pos_mod_sign])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   229
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   230
  apply assumption
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   231
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   232
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   233
lemma int_mod_ge': "b < 0 ==> 0 < (n :: int) ==> b + n <= b mod n"
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   234
  by (rule int_mod_ge [where a = "b + n" and n = n, simplified])
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   235
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   236
lemma mod_add_if_z:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   237
  "(x :: int) < z ==> y < z ==> 0 <= y ==> 0 <= x ==> 0 <= z ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   238
   (x + y) mod z = (if x + y < z then x + y else x + y - z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   239
  by (auto intro: int_mod_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   240
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   241
lemma mod_sub_if_z:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   242
  "(x :: int) < z ==> y < z ==> 0 <= y ==> 0 <= x ==> 0 <= z ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   243
   (x - y) mod z = (if y <= x then x - y else x - y + z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   244
  by (auto intro: int_mod_eq)
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   245
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   246
lemmas zmde = zmod_zdiv_equality [THEN diff_eq_eq [THEN iffD2], symmetric]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   247
lemmas mcl = mult_cancel_left [THEN iffD1, THEN make_pos_rule]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   248
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   249
(* already have this for naturals, div_mult_self1/2, but not for ints *)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   250
lemma zdiv_mult_self: "m ~= (0 :: int) ==> (a + m * n) div m = a div m + n"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   251
  apply (rule mcl)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   252
   prefer 2
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   253
   apply (erule asm_rl)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   254
  apply (simp add: zmde ring_distribs)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   255
  done
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   256
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   257
(** Rep_Integ **)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   258
lemma eqne: "equiv A r ==> X : A // r ==> X ~= {}"
30198
922f944f03b2 name changes
nipkow
parents: 30042
diff changeset
   259
  unfolding equiv_def refl_on_def quotient_def Image_def by auto
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   260
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   261
lemmas Rep_Integ_ne = Integ.Rep_Integ 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   262
  [THEN equiv_intrel [THEN eqne, simplified Integ_def [symmetric]], standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   263
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   264
lemmas riq = Integ.Rep_Integ [simplified Integ_def]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   265
lemmas intrel_refl = refl [THEN equiv_intrel_iff [THEN iffD1], standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   266
lemmas Rep_Integ_equiv = quotient_eq_iff
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   267
  [OF equiv_intrel riq riq, simplified Integ.Rep_Integ_inject, standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   268
lemmas Rep_Integ_same = 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   269
  Rep_Integ_equiv [THEN intrel_refl [THEN rev_iffD2], standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   270
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   271
lemma RI_int: "(a, 0) : Rep_Integ (int a)"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   272
  unfolding int_def by auto
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   273
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   274
lemmas RI_intrel [simp] = UNIV_I [THEN quotientI,
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   275
  THEN Integ.Abs_Integ_inverse [simplified Integ_def], standard]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   276
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   277
lemma RI_minus: "(a, b) : Rep_Integ x ==> (b, a) : Rep_Integ (- x)"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   278
  apply (rule_tac z=x in eq_Abs_Integ)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   279
  apply (clarsimp simp: minus)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   280
  done
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   281
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   282
lemma RI_add: 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   283
  "(a, b) : Rep_Integ x ==> (c, d) : Rep_Integ y ==> 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   284
   (a + c, b + d) : Rep_Integ (x + y)"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   285
  apply (rule_tac z=x in eq_Abs_Integ)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   286
  apply (rule_tac z=y in eq_Abs_Integ) 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   287
  apply (clarsimp simp: add)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   288
  done
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   289
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   290
lemma mem_same: "a : S ==> a = b ==> b : S"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   291
  by fast
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   292
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   293
(* two alternative proofs of this *)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   294
lemma RI_eq_diff': "(a, b) : Rep_Integ (int a - int b)"
37887
2ae085b07f2f diff_minus subsumes diff_def
haftmann
parents: 37655
diff changeset
   295
  apply (unfold diff_minus)
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   296
  apply (rule mem_same)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   297
   apply (rule RI_minus RI_add RI_int)+
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   298
  apply simp
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   299
  done
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   300
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   301
lemma RI_eq_diff: "((a, b) : Rep_Integ x) = (int a - int b = x)"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   302
  apply safe
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   303
   apply (rule Rep_Integ_same)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   304
    prefer 2
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   305
    apply (erule asm_rl)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   306
   apply (rule RI_eq_diff')+
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   307
  done
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   308
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   309
lemma mod_power_lem:
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   310
  "a > 1 ==> a ^ n mod a ^ m = (if m <= n then 0 else (a :: int) ^ n)"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   311
  apply clarsimp
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   312
  apply safe
30042
31039ee583fa Removed subsumed lemmas
nipkow
parents: 30034
diff changeset
   313
   apply (simp add: dvd_eq_mod_eq_0 [symmetric])
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   314
   apply (drule le_iff_add [THEN iffD1])
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   315
   apply (force simp: zpower_zadd_distrib)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   316
  apply (rule mod_pos_pos_trivial)
25875
536dfdc25e0a added simp attributes/ proofs fixed
nipkow
parents: 25592
diff changeset
   317
   apply (simp)
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   318
  apply (rule power_strict_increasing)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   319
   apply auto
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   320
  done
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   321
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   322
lemma min_pm [simp]: "min a b + (a - b) = (a :: nat)" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   323
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   324
lemmas min_pm1 [simp] = trans [OF add_commute min_pm]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   325
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   326
lemma rev_min_pm [simp]: "min b a + (a - b) = (a::nat)" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   327
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   328
lemmas rev_min_pm1 [simp] = trans [OF add_commute rev_min_pm]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   329
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   330
lemma pl_pl_rels: 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   331
  "a + b = c + d ==> 
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   332
   a >= c & b <= d | a <= c & b >= (d :: nat)" by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   333
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   334
lemmas pl_pl_rels' = add_commute [THEN [2] trans, THEN pl_pl_rels]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   335
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   336
lemma minus_eq: "(m - k = m) = (k = 0 | m = (0 :: nat))"  by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   337
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   338
lemma pl_pl_mm: "(a :: nat) + b = c + d ==> a - c = d - b"  by arith
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   339
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   340
lemmas pl_pl_mm' = add_commute [THEN [2] trans, THEN pl_pl_mm]
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   341
 
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   342
lemma min_minus [simp] : "min m (m - k) = (m - k :: nat)" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   343
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   344
lemmas min_minus' [simp] = trans [OF min_max.inf_commute min_minus]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   345
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   346
lemma nat_no_eq_iff: 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   347
  "(number_of b :: int) >= 0 ==> (number_of c :: int) >= 0 ==> 
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   348
   (number_of b = (number_of c :: nat)) = (b = c)" 
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   349
  apply (unfold nat_number_of_def) 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   350
  apply safe
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   351
  apply (drule (2) eq_nat_nat_iff [THEN iffD1])
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   352
  apply (simp add: number_of_eq)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   353
  done
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   354
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   355
lemmas dme = box_equals [OF div_mod_equality add_0_right add_0_right]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   356
lemmas dtle = xtr3 [OF dme [symmetric] le_add1]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   357
lemmas th2 = order_trans [OF order_refl [THEN [2] mult_le_mono] dtle]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   358
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   359
lemma td_gal: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   360
  "0 < c ==> (a >= b * c) = (a div c >= (b :: nat))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   361
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   362
   apply (erule (1) xtr4 [OF div_le_mono div_mult_self_is_m])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   363
  apply (erule th2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   364
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   365
  
26072
f65a7fa2da6c <= and < on nat no longer depend on wellfounded relations
haftmann
parents: 25937
diff changeset
   366
lemmas td_gal_lt = td_gal [simplified not_less [symmetric], simplified]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   367
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   368
lemma div_mult_le: "(a :: nat) div b * b <= a"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   369
  apply (cases b)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   370
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   371
   apply (rule order_refl [THEN th2])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   372
  apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   373
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   374
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   375
lemmas sdl = split_div_lemma [THEN iffD1, symmetric]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   376
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   377
lemma given_quot: "f > (0 :: nat) ==> (f * l + (f - 1)) div f = l"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   378
  by (rule sdl, assumption) (simp (no_asm))
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   379
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   380
lemma given_quot_alt: "f > (0 :: nat) ==> (l * f + f - Suc 0) div f = l"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   381
  apply (frule given_quot)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   382
  apply (rule trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   383
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   384
   apply (erule asm_rl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   385
  apply (rule_tac f="%n. n div f" in arg_cong)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   386
  apply (simp add : mult_ac)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   387
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   388
    
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   389
lemma diff_mod_le: "(a::nat) < d ==> b dvd d ==> a - a mod b <= d - b"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   390
  apply (unfold dvd_def)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   391
  apply clarify
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   392
  apply (case_tac k)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   393
   apply clarsimp
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   394
  apply clarify
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   395
  apply (cases "b > 0")
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   396
   apply (drule mult_commute [THEN xtr1])
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   397
   apply (frule (1) td_gal_lt [THEN iffD1])
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   398
   apply (clarsimp simp: le_simps)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   399
   apply (rule mult_div_cancel [THEN [2] xtr4])
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   400
   apply (rule mult_mono)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   401
      apply auto
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   402
  done
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   403
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   404
lemma less_le_mult':
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   405
  "w * c < b * c ==> 0 \<le> c ==> (w + 1) * c \<le> b * (c::int)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   406
  apply (rule mult_right_mono)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   407
   apply (rule zless_imp_add1_zle)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   408
   apply (erule (1) mult_right_less_imp_less)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   409
  apply assumption
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   410
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   411
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   412
lemmas less_le_mult = less_le_mult' [simplified left_distrib, simplified]
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   413
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   414
lemmas less_le_mult_minus = iffD2 [OF le_diff_eq less_le_mult, 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   415
  simplified left_diff_distrib, standard]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   416
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   417
lemma lrlem':
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   418
  assumes d: "(i::nat) \<le> j \<or> m < j'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   419
  assumes R1: "i * k \<le> j * k \<Longrightarrow> R"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   420
  assumes R2: "Suc m * k' \<le> j' * k' \<Longrightarrow> R"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   421
  shows "R" using d
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   422
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   423
   apply (rule R1, erule mult_le_mono1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   424
  apply (rule R2, erule Suc_le_eq [THEN iffD2 [THEN mult_le_mono1]])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   425
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   426
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   427
lemma lrlem: "(0::nat) < sc ==>
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   428
    (sc - n + (n + lb * n) <= m * n) = (sc + lb * n <= m * n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   429
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   430
   apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   431
  apply (case_tac "sc >= n")
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   432
   apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   433
  apply (insert linorder_le_less_linear [of m lb])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   434
  apply (erule_tac k=n and k'=n in lrlem')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   435
   apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   436
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   437
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   438
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   439
lemma gen_minus: "0 < n ==> f n = f (Suc (n - 1))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   440
  by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   441
27570
9964e59a688c Simplified proofs
chaieb
parents: 26560
diff changeset
   442
lemma mpl_lem: "j <= (i :: nat) ==> k < j ==> i - j + k < i" by arith
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   443
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   444
lemma nonneg_mod_div:
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   445
  "0 <= a ==> 0 <= b ==> 0 <= (a mod b :: int) & 0 <= a div b"
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   446
  apply (cases "b = 0", clarsimp)
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   447
  apply (auto intro: pos_imp_zdiv_nonneg_iff [THEN iffD2])
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24414
diff changeset
   448
  done
24399
371f8c6b2101 move if_simps from BinBoolList to Num_Lemmas
huffman
parents: 24394
diff changeset
   449
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   450
end