doc-src/TutorialI/Types/Numbers.thy
author haftmann
Fri, 27 Jun 2008 09:55:02 +0200
changeset 27376 ffe9b958bada
parent 23504 2b2323124e8e
child 27658 674496eb5965
permissions -rw-r--r--
adjusted import
paulson@10603
     1
(* ID:         $Id$ *)
haftmann@27376
     2
theory Numbers
haftmann@27376
     3
imports Complex_Main
haftmann@27376
     4
begin
paulson@10603
     5
paulson@10603
     6
ML "Pretty.setmargin 64"
wenzelm@22097
     7
ML "ThyOutput.indent := 0"  (*we don't want 5 for listing theorems*)
paulson@10603
     8
paulson@10603
     9
text{*
paulson@10603
    10
paulson@10603
    11
numeric literals; default simprules; can re-orient
paulson@10603
    12
*}
paulson@10603
    13
wenzelm@11711
    14
lemma "2 * m = m + m"
paulson@10880
    15
txt{*
paulson@10880
    16
@{subgoals[display,indent=0,margin=65]}
paulson@10880
    17
*};
paulson@10603
    18
oops
paulson@10603
    19
paulson@10880
    20
consts h :: "nat \<Rightarrow> nat"
paulson@10880
    21
recdef h "{}"
wenzelm@11711
    22
"h i = (if i = 3 then 2 else i)"
paulson@10880
    23
paulson@10603
    24
text{*
wenzelm@11711
    25
@{term"h 3 = 2"}
paulson@10880
    26
@{term"h i  = i"}
paulson@10880
    27
*}
paulson@10603
    28
paulson@10880
    29
text{*
paulson@10603
    30
@{thm[display] numeral_0_eq_0[no_vars]}
paulson@10603
    31
\rulename{numeral_0_eq_0}
paulson@10603
    32
paulson@10603
    33
@{thm[display] numeral_1_eq_1[no_vars]}
paulson@10603
    34
\rulename{numeral_1_eq_1}
paulson@10603
    35
paulson@10603
    36
@{thm[display] add_2_eq_Suc[no_vars]}
paulson@10603
    37
\rulename{add_2_eq_Suc}
paulson@10603
    38
paulson@10603
    39
@{thm[display] add_2_eq_Suc'[no_vars]}
paulson@10603
    40
\rulename{add_2_eq_Suc'}
paulson@10603
    41
paulson@10603
    42
@{thm[display] add_assoc[no_vars]}
paulson@10603
    43
\rulename{add_assoc}
paulson@10603
    44
paulson@10603
    45
@{thm[display] add_commute[no_vars]}
paulson@10603
    46
\rulename{add_commute}
paulson@10603
    47
paulson@10603
    48
@{thm[display] add_left_commute[no_vars]}
paulson@10603
    49
\rulename{add_left_commute}
paulson@10603
    50
paulson@10603
    51
these form add_ac; similarly there is mult_ac
paulson@10603
    52
*}
paulson@10603
    53
paulson@10603
    54
lemma "Suc(i + j*l*k + m*n) = f (n*m + i + k*j*l)"
paulson@10880
    55
txt{*
paulson@10880
    56
@{subgoals[display,indent=0,margin=65]}
paulson@10880
    57
*};
paulson@10603
    58
apply (simp add: add_ac mult_ac)
paulson@10880
    59
txt{*
paulson@10880
    60
@{subgoals[display,indent=0,margin=65]}
paulson@10880
    61
*};
paulson@10603
    62
oops
paulson@10603
    63
paulson@10603
    64
text{*
paulson@10603
    65
paulson@10603
    66
@{thm[display] div_le_mono[no_vars]}
paulson@10603
    67
\rulename{div_le_mono}
paulson@10603
    68
paulson@10603
    69
@{thm[display] diff_mult_distrib[no_vars]}
paulson@10603
    70
\rulename{diff_mult_distrib}
paulson@10603
    71
paulson@10603
    72
@{thm[display] mod_mult_distrib[no_vars]}
paulson@10603
    73
\rulename{mod_mult_distrib}
paulson@10603
    74
paulson@10603
    75
@{thm[display] nat_diff_split[no_vars]}
paulson@10603
    76
\rulename{nat_diff_split}
paulson@10603
    77
*}
paulson@10603
    78
paulson@10603
    79
paulson@12156
    80
lemma "(n - 1) * (n + 1) = n * n - (1::nat)"
wenzelm@12843
    81
apply (clarsimp split: nat_diff_split iff del: less_Suc0)
paulson@12156
    82
 --{* @{subgoals[display,indent=0,margin=65]} *}
paulson@12156
    83
apply (subgoal_tac "n=0", force, arith)
paulson@12156
    84
done
paulson@12156
    85
paulson@12156
    86
wenzelm@11711
    87
lemma "(n - 2) * (n + 2) = n * n - (4::nat)"
paulson@12156
    88
apply (simp split: nat_diff_split, clarify)
paulson@11480
    89
 --{* @{subgoals[display,indent=0,margin=65]} *}
paulson@11480
    90
apply (subgoal_tac "n=0 | n=1", force, arith)
paulson@10603
    91
done
paulson@10603
    92
paulson@10603
    93
text{*
paulson@10603
    94
@{thm[display] mod_if[no_vars]}
paulson@10603
    95
\rulename{mod_if}
paulson@10603
    96
paulson@10603
    97
@{thm[display] mod_div_equality[no_vars]}
paulson@10603
    98
\rulename{mod_div_equality}
paulson@10603
    99
paulson@10603
   100
paulson@10603
   101
@{thm[display] div_mult1_eq[no_vars]}
paulson@10603
   102
\rulename{div_mult1_eq}
paulson@10603
   103
paulson@10603
   104
@{thm[display] mod_mult1_eq[no_vars]}
paulson@10603
   105
\rulename{mod_mult1_eq}
paulson@10603
   106
paulson@10603
   107
@{thm[display] div_mult2_eq[no_vars]}
paulson@10603
   108
\rulename{div_mult2_eq}
paulson@10603
   109
paulson@10603
   110
@{thm[display] mod_mult2_eq[no_vars]}
paulson@10603
   111
\rulename{mod_mult2_eq}
paulson@10603
   112
paulson@10603
   113
@{thm[display] div_mult_mult1[no_vars]}
paulson@10603
   114
\rulename{div_mult_mult1}
paulson@10603
   115
paulson@10603
   116
@{thm[display] DIVISION_BY_ZERO_DIV[no_vars]}
paulson@10603
   117
\rulename{DIVISION_BY_ZERO_DIV}
paulson@10603
   118
paulson@10603
   119
@{thm[display] DIVISION_BY_ZERO_MOD[no_vars]}
paulson@10603
   120
\rulename{DIVISION_BY_ZERO_MOD}
paulson@10603
   121
paulson@10603
   122
@{thm[display] dvd_anti_sym[no_vars]}
paulson@10603
   123
\rulename{dvd_anti_sym}
paulson@10603
   124
paulson@10603
   125
@{thm[display] dvd_add[no_vars]}
paulson@10603
   126
\rulename{dvd_add}
paulson@10603
   127
paulson@10603
   128
For the integers, I'd list a few theorems that somehow involve negative 
paulson@13757
   129
numbers.*}
paulson@10603
   130
paulson@13757
   131
paulson@13757
   132
text{*
paulson@10603
   133
Division, remainder of negatives
paulson@10603
   134
paulson@10603
   135
paulson@10603
   136
@{thm[display] pos_mod_sign[no_vars]}
paulson@10603
   137
\rulename{pos_mod_sign}
paulson@10603
   138
paulson@10603
   139
@{thm[display] pos_mod_bound[no_vars]}
paulson@10603
   140
\rulename{pos_mod_bound}
paulson@10603
   141
paulson@10603
   142
@{thm[display] neg_mod_sign[no_vars]}
paulson@10603
   143
\rulename{neg_mod_sign}
paulson@10603
   144
paulson@10603
   145
@{thm[display] neg_mod_bound[no_vars]}
paulson@10603
   146
\rulename{neg_mod_bound}
paulson@10603
   147
paulson@10603
   148
@{thm[display] zdiv_zadd1_eq[no_vars]}
paulson@10603
   149
\rulename{zdiv_zadd1_eq}
paulson@10603
   150
paulson@10603
   151
@{thm[display] zmod_zadd1_eq[no_vars]}
paulson@10603
   152
\rulename{zmod_zadd1_eq}
paulson@10603
   153
paulson@10603
   154
@{thm[display] zdiv_zmult1_eq[no_vars]}
paulson@10603
   155
\rulename{zdiv_zmult1_eq}
paulson@10603
   156
paulson@10603
   157
@{thm[display] zmod_zmult1_eq[no_vars]}
paulson@10603
   158
\rulename{zmod_zmult1_eq}
paulson@10603
   159
paulson@10603
   160
@{thm[display] zdiv_zmult2_eq[no_vars]}
paulson@10603
   161
\rulename{zdiv_zmult2_eq}
paulson@10603
   162
paulson@10603
   163
@{thm[display] zmod_zmult2_eq[no_vars]}
paulson@10603
   164
\rulename{zmod_zmult2_eq}
paulson@10603
   165
*}  
paulson@10603
   166
paulson@11174
   167
lemma "abs (x+y) \<le> abs x + abs (y :: int)"
paulson@10880
   168
by arith
paulson@10880
   169
wenzelm@11711
   170
lemma "abs (2*x) = 2 * abs (x :: int)"
paulson@16585
   171
by (simp add: abs_if) 
paulson@11174
   172
paulson@13757
   173
paulson@13757
   174
text {*Induction rules for the Integers
paulson@13757
   175
paulson@13757
   176
@{thm[display] int_ge_induct[no_vars]}
paulson@13757
   177
\rulename{int_ge_induct}
paulson@13757
   178
paulson@13757
   179
@{thm[display] int_gr_induct[no_vars]}
paulson@13757
   180
\rulename{int_gr_induct}
paulson@13757
   181
paulson@13757
   182
@{thm[display] int_le_induct[no_vars]}
paulson@13757
   183
\rulename{int_le_induct}
paulson@13757
   184
paulson@13757
   185
@{thm[display] int_less_induct[no_vars]}
paulson@13757
   186
\rulename{int_less_induct}
paulson@13757
   187
*}  
paulson@13757
   188
paulson@14400
   189
text {*FIELDS
paulson@10603
   190
paulson@14295
   191
@{thm[display] dense[no_vars]}
paulson@14295
   192
\rulename{dense}
paulson@10764
   193
paulson@14288
   194
@{thm[display] times_divide_eq_right[no_vars]}
paulson@14288
   195
\rulename{times_divide_eq_right}
paulson@10764
   196
paulson@14288
   197
@{thm[display] times_divide_eq_left[no_vars]}
paulson@14288
   198
\rulename{times_divide_eq_left}
paulson@10764
   199
paulson@14288
   200
@{thm[display] divide_divide_eq_right[no_vars]}
paulson@14288
   201
\rulename{divide_divide_eq_right}
paulson@10764
   202
paulson@14288
   203
@{thm[display] divide_divide_eq_left[no_vars]}
paulson@14288
   204
\rulename{divide_divide_eq_left}
paulson@10764
   205
paulson@14295
   206
@{thm[display] minus_divide_left[no_vars]}
paulson@14295
   207
\rulename{minus_divide_left}
paulson@10764
   208
paulson@14295
   209
@{thm[display] minus_divide_right[no_vars]}
paulson@14295
   210
\rulename{minus_divide_right}
paulson@10764
   211
paulson@10764
   212
This last NOT a simprule
paulson@10764
   213
paulson@14295
   214
@{thm[display] add_divide_distrib[no_vars]}
paulson@14295
   215
\rulename{add_divide_distrib}
paulson@10764
   216
*}
paulson@10603
   217
wenzelm@11711
   218
lemma "3/4 < (7/8 :: real)"
paulson@11174
   219
by simp 
paulson@11174
   220
wenzelm@11711
   221
lemma "P ((3/4) * (8/15 :: real))"
paulson@11174
   222
txt{*
paulson@11174
   223
@{subgoals[display,indent=0,margin=65]}
paulson@11174
   224
*};
paulson@11174
   225
apply simp 
paulson@11174
   226
txt{*
paulson@11174
   227
@{subgoals[display,indent=0,margin=65]}
paulson@11174
   228
*};
paulson@11174
   229
oops
paulson@11174
   230
wenzelm@11711
   231
lemma "(3/4) * (8/15) < (x :: real)"
paulson@11174
   232
txt{*
paulson@11174
   233
@{subgoals[display,indent=0,margin=65]}
paulson@11174
   234
*};
paulson@11174
   235
apply simp 
paulson@11174
   236
txt{*
paulson@11174
   237
@{subgoals[display,indent=0,margin=65]}
paulson@11174
   238
*};
paulson@11174
   239
oops
paulson@11174
   240
paulson@14400
   241
text{*
paulson@14400
   242
Ring and Field
paulson@14400
   243
paulson@14400
   244
Requires a field, or else an ordered ring
paulson@14400
   245
paulson@14400
   246
@{thm[display] mult_eq_0_iff[no_vars]}
paulson@14400
   247
\rulename{mult_eq_0_iff}
paulson@14400
   248
paulson@14400
   249
@{thm[display] mult_cancel_right[no_vars]}
paulson@14400
   250
\rulename{mult_cancel_right}
paulson@23504
   251
paulson@23504
   252
@{thm[display] mult_cancel_left[no_vars]}
paulson@23504
   253
\rulename{mult_cancel_left}
paulson@14400
   254
*}
paulson@14400
   255
paulson@14400
   256
ML{*set show_sorts*}
paulson@14400
   257
paulson@14400
   258
text{*
paulson@14400
   259
effect of show sorts on the above
paulson@23504
   260
paulson@23504
   261
@{thm[display] mult_cancel_left[no_vars]}
paulson@23504
   262
\rulename{mult_cancel_left}
paulson@14400
   263
*}
paulson@14400
   264
paulson@14400
   265
ML{*reset show_sorts*}
paulson@14400
   266
paulson@14400
   267
paulson@14400
   268
text{*
paulson@14400
   269
absolute value
paulson@14400
   270
paulson@14400
   271
@{thm[display] abs_mult[no_vars]}
paulson@14400
   272
\rulename{abs_mult}
paulson@14400
   273
paulson@14400
   274
@{thm[display] abs_le_iff[no_vars]}
paulson@14400
   275
\rulename{abs_le_iff}
paulson@14400
   276
paulson@14400
   277
@{thm[display] abs_triangle_ineq[no_vars]}
paulson@14400
   278
\rulename{abs_triangle_ineq}
paulson@14400
   279
paulson@14400
   280
@{thm[display] power_add[no_vars]}
paulson@14400
   281
\rulename{power_add}
paulson@14400
   282
paulson@14400
   283
@{thm[display] power_mult[no_vars]}
paulson@14400
   284
\rulename{power_mult}
paulson@14400
   285
paulson@14400
   286
@{thm[display] power_abs[no_vars]}
paulson@14400
   287
\rulename{power_abs}
paulson@14400
   288
paulson@14400
   289
paulson@14400
   290
*}
paulson@11174
   291
paulson@11174
   292
paulson@10603
   293
end