src/HOL/Integ/Int.thy
author paulson
Mon, 24 Nov 2003 15:33:07 +0100
changeset 14266 08b34c902618
parent 14264 3d0c6238162a
child 14267 b963e9cee2a0
permissions -rw-r--r--
conversion of integers to use Ring_and_Field; new lemmas for Ring_and_Field
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13577
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
     1
(*  Title:      Integ/Int.thy
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
     2
    ID:         $Id$
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
     4
    Copyright   1998  University of Cambridge
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
     5
*)
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
     6
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
     7
header {*Type "int" is a Linear Order and Other Lemmas*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
     8
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
     9
theory Int = IntDef:
13577
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    10
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    11
instance int :: order
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    12
proof qed (assumption | rule zle_refl zle_trans zle_anti_sym int_less_le)+
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    13
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    14
instance int :: plus_ac0
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    15
proof qed (rule zadd_commute zadd_assoc zadd_0)+
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    16
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    17
instance int :: linorder
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    18
proof qed (rule zle_linear)
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    19
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    20
constdefs
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    21
   nat  :: "int => nat"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    22
    "nat(Z) == if neg Z then 0 else (THE m. Z = int m)"
13577
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    23
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
    24
defs (overloaded)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    25
    zabs_def:  "abs(i::int) == if i < 0 then -i else i"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    26
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    27
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    28
lemma int_0 [simp]: "int 0 = (0::int)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    29
by (simp add: Zero_int_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    30
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    31
lemma int_1 [simp]: "int 1 = 1"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    32
by (simp add: One_int_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    33
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    34
lemma int_Suc0_eq_1: "int (Suc 0) = 1"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    35
by (simp add: One_int_def One_nat_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    36
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    37
lemma neg_eq_less_0: "neg x = (x < 0)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    38
by (unfold zdiff_def zless_def, auto)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    39
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
    40
lemma not_neg_eq_ge_0: "(~neg x) = (0 \<le> x)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    41
apply (unfold zle_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    42
apply (simp add: neg_eq_less_0)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    43
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    44
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    45
subsection{*To simplify inequalities when Numeral1 can get simplified to 1*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    46
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    47
lemma not_neg_0: "~ neg 0"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    48
by (simp add: One_int_def neg_eq_less_0)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    49
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    50
lemma not_neg_1: "~ neg 1"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    51
by (simp add: One_int_def neg_eq_less_0)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    52
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    53
lemma iszero_0: "iszero 0"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    54
by (simp add: iszero_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    55
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    56
lemma not_iszero_1: "~ iszero 1"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    57
by (simp only: Zero_int_def One_int_def One_nat_def iszero_def int_int_eq)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    58
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    59
lemma int_0_less_1: "0 < (1::int)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    60
by (simp only: Zero_int_def One_int_def One_nat_def zless_int)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    61
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    62
lemma int_0_neq_1 [simp]: "0 \<noteq> (1::int)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    63
by (simp only: Zero_int_def One_int_def One_nat_def int_int_eq)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    64
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    65
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    66
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    67
subsection{*@{text Abel_Cancel} simproc on the integers*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    68
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    69
(* Lemmas needed for the simprocs *)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    70
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    71
(*Deletion of other terms in the formula, seeking the -x at the front of z*)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    72
lemma zadd_cancel_21: "((x::int) + (y + z) = y + u) = ((x + z) = u)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    73
apply (subst zadd_left_commute)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    74
apply (rule zadd_left_cancel)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    75
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    76
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    77
(*A further rule to deal with the case that
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    78
  everything gets cancelled on the right.*)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    79
lemma zadd_cancel_end: "((x::int) + (y + z) = y) = (x = -z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    80
apply (subst zadd_left_commute)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    81
apply (rule_tac t = y in zadd_0_right [THEN subst], subst zadd_left_cancel)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    82
apply (simp add: eq_zdiff_eq [symmetric])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    83
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    84
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    85
(*Legacy ML bindings, but no longer the structure Int.*)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    86
ML
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    87
{*
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    88
val Int_thy = the_context ()
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    89
val zabs_def = thm "zabs_def"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    90
val nat_def  = thm "nat_def"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    91
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    92
val int_0 = thm "int_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    93
val int_1 = thm "int_1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    94
val int_Suc0_eq_1 = thm "int_Suc0_eq_1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    95
val neg_eq_less_0 = thm "neg_eq_less_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    96
val not_neg_eq_ge_0 = thm "not_neg_eq_ge_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    97
val not_neg_0 = thm "not_neg_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    98
val not_neg_1 = thm "not_neg_1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
    99
val iszero_0 = thm "iszero_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   100
val not_iszero_1 = thm "not_iszero_1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   101
val int_0_less_1 = thm "int_0_less_1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   102
val int_0_neq_1 = thm "int_0_neq_1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   103
val zadd_cancel_21 = thm "zadd_cancel_21";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   104
val zadd_cancel_end = thm "zadd_cancel_end";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   105
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   106
structure Int_Cancel_Data =
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   107
struct
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   108
  val ss		= HOL_ss
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   109
  val eq_reflection	= eq_reflection
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   110
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   111
  val sg_ref 		= Sign.self_ref (Theory.sign_of (the_context()))
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   112
  val T		= HOLogic.intT
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   113
  val zero		= Const ("0", HOLogic.intT)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   114
  val restrict_to_left  = restrict_to_left
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   115
  val add_cancel_21	= zadd_cancel_21
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   116
  val add_cancel_end	= zadd_cancel_end
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   117
  val add_left_cancel	= zadd_left_cancel
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   118
  val add_assoc		= zadd_assoc
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   119
  val add_commute	= zadd_commute
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   120
  val add_left_commute	= zadd_left_commute
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   121
  val add_0		= zadd_0
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   122
  val add_0_right	= zadd_0_right
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   123
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   124
  val eq_diff_eq	= eq_zdiff_eq
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   125
  val eqI_rules		= [zless_eqI, zeq_eqI, zle_eqI]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   126
  fun dest_eqI th = 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   127
      #1 (HOLogic.dest_bin "op =" HOLogic.boolT
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   128
	      (HOLogic.dest_Trueprop (concl_of th)))
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   129
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   130
  val diff_def		= zdiff_def
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   131
  val minus_add_distrib	= zminus_zadd_distrib
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   132
  val minus_minus	= zminus_zminus
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   133
  val minus_0		= zminus_0
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   134
  val add_inverses	= [zadd_zminus_inverse, zadd_zminus_inverse2]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   135
  val cancel_simps	= [zadd_zminus_cancel, zminus_zadd_cancel]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   136
end;
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   137
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   138
structure Int_Cancel = Abel_Cancel (Int_Cancel_Data);
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   139
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   140
Addsimprocs [Int_Cancel.sum_conv, Int_Cancel.rel_conv];
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   141
*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   142
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   143
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   144
subsection{*Misc Results*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   145
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   146
lemma zminus_zdiff_eq [simp]: "- (z - y) = y - (z::int)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   147
by simp
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   148
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   149
lemma zless_eq_neg: "(w<z) = neg(w-z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   150
by (simp add: zless_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   151
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   152
lemma eq_eq_iszero: "(w=z) = iszero(w-z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   153
by (simp add: iszero_def zdiff_eq_eq)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   154
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   155
lemma zle_eq_not_neg: "(w\<le>z) = (~ neg(z-w))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   156
by (simp add: zle_def zless_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   157
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   158
subsection{*Inequality reasoning*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   159
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   160
lemma zless_add1_eq: "(w < z + (1::int)) = (w<z | w=z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   161
apply (auto simp add: zless_iff_Suc_zadd int_Suc gr0_conv_Suc zero_reorient)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   162
apply (rule_tac x = "Suc n" in exI)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   163
apply (simp add: int_Suc)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   164
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   165
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   166
lemma add1_zle_eq: "(w + (1::int) \<le> z) = (w<z)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   167
apply (simp add: zle_def zless_add1_eq)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   168
apply (auto intro: zless_asym zle_anti_sym
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   169
            simp add: order_less_imp_le symmetric zle_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   170
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   171
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   172
lemma add1_left_zle_eq: "((1::int) + w \<le> z) = (w<z)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   173
apply (subst zadd_commute)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   174
apply (rule add1_zle_eq)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   175
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   176
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   177
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   178
subsection{*Monotonicity results*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   179
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   180
lemma zadd_right_cancel_zless [simp]: "(v+z < w+z) = (v < (w::int))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   181
by simp
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   182
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   183
lemma zadd_left_cancel_zless [simp]: "(z+v < z+w) = (v < (w::int))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   184
by simp
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   185
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   186
lemma zadd_right_cancel_zle [simp] : "(v+z \<le> w+z) = (v \<le> (w::int))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   187
by simp
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   188
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   189
lemma zadd_left_cancel_zle [simp] : "(z+v \<le> z+w) = (v \<le> (w::int))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   190
by simp
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   191
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   192
(*"v\<le>w ==> v+z \<le> w+z"*)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   193
lemmas zadd_zless_mono1 = zadd_right_cancel_zless [THEN iffD2, standard]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   194
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   195
(*"v\<le>w ==> z+v \<le> z+w"*)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   196
lemmas zadd_zless_mono2 = zadd_left_cancel_zless [THEN iffD2, standard]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   197
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   198
(*"v\<le>w ==> v+z \<le> w+z"*)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   199
lemmas zadd_zle_mono1 = zadd_right_cancel_zle [THEN iffD2, standard]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   200
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   201
(*"v\<le>w ==> z+v \<le> z+w"*)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   202
lemmas zadd_zle_mono2 = zadd_left_cancel_zle [THEN iffD2, standard]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   203
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   204
lemma zadd_zle_mono: "[| w'\<le>w; z'\<le>z |] ==> w' + z' \<le> w + (z::int)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   205
by (erule zadd_zle_mono1 [THEN zle_trans], simp)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   206
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   207
lemma zadd_zless_mono: "[| w'<w; z'\<le>z |] ==> w' + z' < w + (z::int)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   208
by (erule zadd_zless_mono1 [THEN order_less_le_trans], simp)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   209
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   210
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   211
subsection{*Comparison laws*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   212
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   213
lemma zminus_zless_zminus [simp]: "(- x < - y) = (y < (x::int))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   214
by (simp add: zless_def zdiff_def zadd_ac)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   215
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   216
lemma zminus_zle_zminus [simp]: "(- x \<le> - y) = (y \<le> (x::int))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   217
by (simp add: zle_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   218
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   219
text{*The next several equations can make the simplifier loop!*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   220
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   221
lemma zless_zminus: "(x < - y) = (y < - (x::int))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   222
by (simp add: zless_def zdiff_def zadd_ac)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   223
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   224
lemma zminus_zless: "(- x < y) = (- y < (x::int))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   225
by (simp add: zless_def zdiff_def zadd_ac)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   226
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   227
lemma zle_zminus: "(x \<le> - y) = (y \<le> - (x::int))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   228
by (simp add: zle_def zminus_zless)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   229
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   230
lemma zminus_zle: "(- x \<le> y) = (- y \<le> (x::int))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   231
by (simp add: zle_def zless_zminus)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   232
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   233
lemma equation_zminus: "(x = - y) = (y = - (x::int))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   234
by auto
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   235
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   236
lemma zminus_equation: "(- x = y) = (- (y::int) = x)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   237
by auto
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   238
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   239
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   240
subsection{*Instances of the equations above, for zero*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   241
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   242
(*instantiate a variable to zero and simplify*)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   243
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   244
declare zless_zminus [of 0, simplified, simp]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   245
declare zminus_zless [of _ 0, simplified, simp]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   246
declare zle_zminus   [of 0, simplified, simp]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   247
declare zminus_zle [of _ 0, simplified, simp]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   248
declare equation_zminus [of 0, simplified, simp]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   249
declare zminus_equation [of _ 0, simplified, simp]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   250
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   251
lemma negative_zless_0: "- (int (Suc n)) < 0"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   252
by (simp add: zless_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   253
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   254
lemma negative_zless [iff]: "- (int (Suc n)) < int m"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   255
by (rule negative_zless_0 [THEN order_less_le_trans], simp)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   256
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   257
lemma negative_zle_0: "- int n \<le> 0"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   258
by (simp add: zminus_zle)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   259
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   260
lemma negative_zle [iff]: "- int n \<le> int m"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   261
by (simp add: zless_def zle_def zdiff_def zadd_int)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   262
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   263
lemma not_zle_0_negative [simp]: "~(0 \<le> - (int (Suc n)))"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   264
by (subst zle_zminus, simp)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   265
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   266
lemma int_zle_neg: "(int n \<le> - int m) = (n = 0 & m = 0)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   267
apply safe 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   268
apply (drule_tac [2] zle_zminus [THEN iffD1])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   269
apply (auto dest: zle_trans [OF _ negative_zle_0]) 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   270
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   271
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   272
lemma not_int_zless_negative [simp]: "~(int n < - int m)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   273
by (simp add: zle_def [symmetric])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   274
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   275
lemma negative_eq_positive [simp]: "(- int n = int m) = (n = 0 & m = 0)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   276
apply (rule iffI)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   277
apply (rule int_zle_neg [THEN iffD1])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   278
apply (drule sym)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   279
apply (simp_all (no_asm_simp))
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   280
done
13577
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
   281
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   282
lemma zle_iff_zadd: "(w \<le> z) = (EX n. z = w + int n)"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   283
by (force intro: exI [of _ "0::nat"] 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   284
            intro!: not_sym [THEN not0_implies_Suc]
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   285
            simp add: zless_iff_Suc_zadd int_le_less)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   286
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   287
lemma abs_int_eq [simp]: "abs (int m) = int m"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   288
by (simp add: zabs_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   289
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   290
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   291
subsection{*nat: magnitide of an integer, as a natural number*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   292
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   293
lemma nat_int [simp]: "nat(int n) = n"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   294
by (unfold nat_def, auto)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   295
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   296
lemma nat_zminus_int [simp]: "nat(- (int n)) = 0"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   297
apply (unfold nat_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   298
apply (auto simp add: neg_eq_less_0 zero_reorient zminus_zless)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   299
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   300
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   301
lemma nat_zero [simp]: "nat 0 = 0"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   302
apply (unfold Zero_int_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   303
apply (rule nat_int)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   304
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   305
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   306
lemma not_neg_nat: "~ neg z ==> int (nat z) = z"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   307
apply (drule not_neg_eq_ge_0 [THEN iffD1])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   308
apply (drule zle_imp_zless_or_eq)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   309
apply (auto simp add: zless_iff_Suc_zadd)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   310
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   311
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   312
lemma negD: "neg x ==> EX n. x = - (int (Suc n))"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   313
by (auto simp add: neg_eq_less_0 zless_iff_Suc_zadd zdiff_eq_eq [symmetric] zdiff_def)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   314
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   315
lemma neg_nat: "neg z ==> nat z = 0"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   316
by (unfold nat_def, auto)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   317
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   318
lemma zless_nat_eq_int_zless: "(m < nat z) = (int m < z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   319
apply (case_tac "neg z")
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   320
apply (erule_tac [2] not_neg_nat [THEN subst])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   321
apply (auto simp add: neg_nat)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   322
apply (auto dest: order_less_trans simp add: neg_eq_less_0)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   323
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   324
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   325
lemma nat_0_le [simp]: "0 \<le> z ==> int (nat z) = z"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   326
by (simp add: neg_eq_less_0 zle_def not_neg_nat)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   327
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   328
lemma nat_le_0 [simp]: "z \<le> 0 ==> nat z = 0"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   329
by (auto simp add: order_le_less neg_eq_less_0 zle_def neg_nat)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   330
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   331
(*An alternative condition is  0 \<le> w  *)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   332
lemma nat_mono_iff: "0 < z ==> (nat w < nat z) = (w < z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   333
apply (subst zless_int [symmetric])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   334
apply (simp (no_asm_simp) add: not_neg_nat not_neg_eq_ge_0 order_le_less)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   335
apply (case_tac "neg w")
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   336
 apply (simp add: neg_eq_less_0 neg_nat)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   337
 apply (blast intro: order_less_trans)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   338
apply (simp add: not_neg_nat)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   339
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   340
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   341
lemma zless_nat_conj: "(nat w < nat z) = (0 < z & w < z)"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   342
apply (case_tac "0 < z")
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   343
apply (auto simp add: nat_mono_iff linorder_not_less)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   344
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   345
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   346
(* a case theorem distinguishing non-negative and negative int *)  
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   347
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   348
lemma int_cases: 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   349
     "[|!! n. z = int n ==> P;  !! n. z =  - (int (Suc n)) ==> P |] ==> P"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   350
apply (case_tac "neg z")
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   351
apply (fast dest!: negD)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   352
apply (drule not_neg_nat [symmetric], auto) 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   353
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   354
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   355
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   356
subsection{*Monotonicity of Multiplication*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   357
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   358
lemma zmult_zle_mono1_lemma: "i \<le> (j::int) ==> i * int k \<le> j * int k"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   359
apply (induct_tac "k")
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   360
apply (simp_all (no_asm_simp) add: int_Suc zadd_zmult_distrib2 zadd_zle_mono int_Suc0_eq_1)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   361
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   362
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   363
lemma zmult_zle_mono1: "[| i \<le> j;  (0::int) \<le> k |] ==> i*k \<le> j*k"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   364
apply (rule_tac t = k in not_neg_nat [THEN subst])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   365
apply (erule_tac [2] zmult_zle_mono1_lemma)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   366
apply (simp (no_asm_use) add: not_neg_eq_ge_0)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   367
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   368
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   369
lemma zmult_zle_mono1_neg: "[| i \<le> j;  k \<le> (0::int) |] ==> j*k \<le> i*k"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   370
apply (rule zminus_zle_zminus [THEN iffD1])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   371
apply (simp add: zmult_zminus_right [symmetric] zmult_zle_mono1 zle_zminus)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   372
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   373
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   374
lemma zmult_zle_mono2: "[| i \<le> j;  (0::int) \<le> k |] ==> k*i \<le> k*j"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   375
apply (drule zmult_zle_mono1)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   376
apply (simp_all add: zmult_commute)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   377
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   378
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   379
lemma zmult_zle_mono2_neg: "[| i \<le> j;  k \<le> (0::int) |] ==> k*j \<le> k*i"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   380
apply (drule zmult_zle_mono1_neg)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   381
apply (simp_all add: zmult_commute)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   382
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   383
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   384
(* \<le> monotonicity, BOTH arguments*)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   385
lemma zmult_zle_mono: "[| i \<le> j;  k \<le> l;  (0::int) \<le> j;  (0::int) \<le> k |] ==> i*k \<le> j*l"
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   386
apply (erule zmult_zle_mono1 [THEN order_trans], assumption)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   387
apply (erule zmult_zle_mono2, assumption)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   388
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   389
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   390
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   391
subsection{*strict, in 1st argument; proof is by induction on k>0*}
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   392
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   393
lemma zmult_zless_mono2_lemma: "i<j ==> 0<k --> int k * i < int k * j"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   394
apply (induct_tac "k", simp) 
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   395
apply (simp add: int_Suc)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   396
apply (case_tac "n=0")
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   397
apply (simp_all add: zadd_zmult_distrib zadd_zless_mono int_Suc0_eq_1 order_le_less)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   398
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   399
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   400
lemma zmult_zless_mono2: "[| i<j;  (0::int) < k |] ==> k*i < k*j"
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   401
apply (rule_tac t = k in not_neg_nat [THEN subst])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   402
apply (erule_tac [2] zmult_zless_mono2_lemma [THEN mp])
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   403
apply (simp add: not_neg_eq_ge_0 order_le_less)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   404
apply (frule conjI [THEN zless_nat_conj [THEN iffD2]], auto)
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   405
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   406
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   407
text{*The Integers Form an Ordered Ring*}
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   408
instance int :: ordered_ring
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   409
proof
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   410
  fix i j k :: int
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   411
  show "(i + j) + k = i + (j + k)" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   412
  show "i + j = j + i" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   413
  show "0 + i = i" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   414
  show "- i + i = 0" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   415
  show "i - j = i + (-j)" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   416
  show "(i * j) * k = i * (j * k)" by (rule zmult_assoc)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   417
  show "i * j = j * i" by (rule zmult_commute)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   418
  show "1 * i = i" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   419
  show "(i + j) * k = i * k + j * k" by (simp add: int_distrib)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   420
  show "0 \<noteq> (1::int)" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   421
  show "i \<le> j ==> k + i \<le> k + j" by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   422
  show "i < j ==> 0 < k ==> k * i < k * j" by (simp add: zmult_zless_mono2)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   423
  show "\<bar>i\<bar> = (if i < 0 then -i else i)" by (simp only: zabs_def)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   424
qed
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   425
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   426
lemma zmult_zless_mono1: "[| i<j;  (0::int) < k |] ==> i*k < j*k"
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   427
  by (rule Ring_and_Field.mult_strict_right_mono)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   428
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   429
(* < monotonicity, BOTH arguments*)
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   430
lemma zmult_zless_mono:
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   431
     "[| i < j;  k < l;  (0::int) < j;  (0::int) < k |] ==> i*k < j*l"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   432
  by (rule Ring_and_Field.mult_strict_mono)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   433
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   434
lemma zmult_zless_mono1_neg: "[| i<j;  k < (0::int) |] ==> j*k < i*k"
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   435
  by (rule Ring_and_Field.mult_strict_right_mono_neg)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   436
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   437
lemma zmult_zless_mono2_neg: "[| i<j;  k < (0::int) |] ==> k*j < k*i"
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   438
  by (rule Ring_and_Field.mult_strict_left_mono_neg)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   439
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   440
lemma zmult_eq_0_iff [iff]: "(m*n = (0::int)) = (m = 0 | n = 0)"
14266
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   441
  by simp
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   442
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   443
lemma zmult_zless_cancel2: "(m*k < n*k) = (((0::int) < k & m<n) | (k<0 & n<m))"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   444
  by (rule Ring_and_Field.mult_less_cancel_right)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   445
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   446
lemma zmult_zless_cancel1:
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   447
     "(k*m < k*n) = (((0::int) < k & m<n) | (k < 0 & n<m))"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   448
  by (rule Ring_and_Field.mult_less_cancel_left)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   449
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   450
lemma zmult_zle_cancel2:
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   451
     "(m*k \<le> n*k) = (((0::int) < k --> m\<le>n) & (k < 0 --> n\<le>m))"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   452
  by (rule Ring_and_Field.mult_le_cancel_right)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   453
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   454
lemma zmult_zle_cancel1:
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   455
     "(k*m \<le> k*n) = (((0::int) < k --> m\<le>n) & (k < 0 --> n\<le>m))"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   456
  by (rule Ring_and_Field.mult_le_cancel_left)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   457
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   458
lemma zmult_cancel2: "(m*k = n*k) = (k = (0::int) | m=n)"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   459
 by (rule Ring_and_Field.mult_cancel_right)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   460
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   461
lemma zmult_cancel1 [simp]: "(k*m = k*n) = (k = (0::int) | m=n)"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   462
 by (rule Ring_and_Field.mult_cancel_left)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   463
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   464
(*Analogous to zadd_int*)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   465
lemma zdiff_int [rule_format]: "n\<le>m --> int m - int n = int (m-n)"
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   466
apply (induct_tac m n rule: diff_induct)
08b34c902618 conversion of integers to use Ring_and_Field;
paulson
parents: 14264
diff changeset
   467
apply (auto simp add: int_Suc symmetric zdiff_def)
14264
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   468
done
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   469
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   470
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   471
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   472
ML
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   473
{*
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   474
val zminus_zdiff_eq = thm "zminus_zdiff_eq";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   475
val zless_eq_neg = thm "zless_eq_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   476
val eq_eq_iszero = thm "eq_eq_iszero";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   477
val zle_eq_not_neg = thm "zle_eq_not_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   478
val zless_add1_eq = thm "zless_add1_eq";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   479
val add1_zle_eq = thm "add1_zle_eq";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   480
val add1_left_zle_eq = thm "add1_left_zle_eq";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   481
val zadd_right_cancel_zless = thm "zadd_right_cancel_zless";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   482
val zadd_left_cancel_zless = thm "zadd_left_cancel_zless";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   483
val zadd_right_cancel_zle = thm "zadd_right_cancel_zle";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   484
val zadd_left_cancel_zle = thm "zadd_left_cancel_zle";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   485
val zadd_zless_mono1 = thm "zadd_zless_mono1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   486
val zadd_zless_mono2 = thm "zadd_zless_mono2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   487
val zadd_zle_mono1 = thm "zadd_zle_mono1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   488
val zadd_zle_mono2 = thm "zadd_zle_mono2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   489
val zadd_zle_mono = thm "zadd_zle_mono";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   490
val zadd_zless_mono = thm "zadd_zless_mono";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   491
val zminus_zless_zminus = thm "zminus_zless_zminus";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   492
val zminus_zle_zminus = thm "zminus_zle_zminus";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   493
val zless_zminus = thm "zless_zminus";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   494
val zminus_zless = thm "zminus_zless";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   495
val zle_zminus = thm "zle_zminus";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   496
val zminus_zle = thm "zminus_zle";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   497
val equation_zminus = thm "equation_zminus";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   498
val zminus_equation = thm "zminus_equation";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   499
val negative_zless_0 = thm "negative_zless_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   500
val negative_zless = thm "negative_zless";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   501
val negative_zle_0 = thm "negative_zle_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   502
val negative_zle = thm "negative_zle";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   503
val not_zle_0_negative = thm "not_zle_0_negative";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   504
val int_zle_neg = thm "int_zle_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   505
val not_int_zless_negative = thm "not_int_zless_negative";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   506
val negative_eq_positive = thm "negative_eq_positive";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   507
val zle_iff_zadd = thm "zle_iff_zadd";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   508
val abs_int_eq = thm "abs_int_eq";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   509
val nat_int = thm "nat_int";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   510
val nat_zminus_int = thm "nat_zminus_int";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   511
val nat_zero = thm "nat_zero";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   512
val not_neg_nat = thm "not_neg_nat";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   513
val negD = thm "negD";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   514
val neg_nat = thm "neg_nat";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   515
val zless_nat_eq_int_zless = thm "zless_nat_eq_int_zless";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   516
val nat_0_le = thm "nat_0_le";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   517
val nat_le_0 = thm "nat_le_0";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   518
val zless_nat_conj = thm "zless_nat_conj";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   519
val int_cases = thm "int_cases";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   520
val zmult_zle_mono1 = thm "zmult_zle_mono1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   521
val zmult_zle_mono1_neg = thm "zmult_zle_mono1_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   522
val zmult_zle_mono2 = thm "zmult_zle_mono2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   523
val zmult_zle_mono2_neg = thm "zmult_zle_mono2_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   524
val zmult_zle_mono = thm "zmult_zle_mono";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   525
val zmult_zless_mono2 = thm "zmult_zless_mono2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   526
val zmult_zless_mono1 = thm "zmult_zless_mono1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   527
val zmult_zless_mono = thm "zmult_zless_mono";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   528
val zmult_zless_mono1_neg = thm "zmult_zless_mono1_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   529
val zmult_zless_mono2_neg = thm "zmult_zless_mono2_neg";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   530
val zmult_eq_0_iff = thm "zmult_eq_0_iff";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   531
val zmult_zless_cancel2 = thm "zmult_zless_cancel2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   532
val zmult_zless_cancel1 = thm "zmult_zless_cancel1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   533
val zmult_zle_cancel2 = thm "zmult_zle_cancel2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   534
val zmult_zle_cancel1 = thm "zmult_zle_cancel1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   535
val zmult_cancel2 = thm "zmult_cancel2";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   536
val zmult_cancel1 = thm "zmult_cancel1";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   537
val zdiff_int = thm "zdiff_int";
3d0c6238162a conversion of Integ/Int_lemmas.ML to Isar script
paulson
parents: 13588
diff changeset
   538
*}
13577
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
   539
25b14a786c08 conversion to Isar
nipkow
parents:
diff changeset
   540
end