src/HOL/Integ/IntArith.thy
author kleing
Tue, 13 May 2003 08:59:21 +0200
changeset 14024 213dcc39358f
parent 13849 2584233cf3ef
child 14259 79f7d3451b1e
permissions -rw-r--r--
HOL-Real -> HOL-Complex
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12023
wenzelm
parents: 11868
diff changeset
     1
wenzelm
parents: 11868
diff changeset
     2
header {* Integer arithmetic *}
wenzelm
parents: 11868
diff changeset
     3
9436
62bb04ab4b01 rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents: 9214
diff changeset
     4
theory IntArith = Bin
62bb04ab4b01 rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents: 9214
diff changeset
     5
files ("int_arith1.ML") ("int_arith2.ML"):
62bb04ab4b01 rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents: 9214
diff changeset
     6
12023
wenzelm
parents: 11868
diff changeset
     7
use "int_arith1.ML"
wenzelm
parents: 11868
diff changeset
     8
setup int_arith_setup
wenzelm
parents: 11868
diff changeset
     9
use "int_arith2.ML"
13837
8dd150d36c65 Reorganized, moving many results about the integer dvd relation from IntPrimes
paulson
parents: 13685
diff changeset
    10
12023
wenzelm
parents: 11868
diff changeset
    11
declare zabs_split [arith_split]
wenzelm
parents: 11868
diff changeset
    12
13837
8dd150d36c65 Reorganized, moving many results about the integer dvd relation from IntPrimes
paulson
parents: 13685
diff changeset
    13
lemma zabs_eq_iff:
8dd150d36c65 Reorganized, moving many results about the integer dvd relation from IntPrimes
paulson
parents: 13685
diff changeset
    14
    "(abs (z::int) = w) = (z = w \<and> 0 <= z \<or> z = -w \<and> z < 0)"
8dd150d36c65 Reorganized, moving many results about the integer dvd relation from IntPrimes
paulson
parents: 13685
diff changeset
    15
  by (auto simp add: zabs_def)
8dd150d36c65 Reorganized, moving many results about the integer dvd relation from IntPrimes
paulson
parents: 13685
diff changeset
    16
13849
2584233cf3ef new simprule for int (nat n)
paulson
parents: 13837
diff changeset
    17
lemma int_nat_eq [simp]: "int (nat z) = (if 0 \<le> z then z else 0)"
2584233cf3ef new simprule for int (nat n)
paulson
parents: 13837
diff changeset
    18
  by simp
2584233cf3ef new simprule for int (nat n)
paulson
parents: 13837
diff changeset
    19
13575
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    20
lemma split_nat[arith_split]:
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    21
  "P(nat(i::int)) = ((ALL n. i = int n \<longrightarrow> P n) & (i < 0 \<longrightarrow> P 0))"
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    22
  (is "?P = (?L & ?R)")
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    23
proof (cases "i < 0")
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    24
  case True thus ?thesis by simp
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    25
next
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    26
  case False
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    27
  have "?P = ?L"
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    28
  proof
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    29
    assume ?P thus ?L using False by clarsimp
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    30
  next
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    31
    assume ?L thus ?P using False by simp
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    32
  qed
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    33
  with False show ?thesis by simp
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    34
qed
ecb6ecd9af13 added nat_split
nipkow
parents: 12023
diff changeset
    35
13685
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    36
subsubsection "Induction principles for int"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    37
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    38
                     (* `set:int': dummy construction *)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    39
theorem int_ge_induct[case_names base step,induct set:int]:
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    40
  assumes ge: "k \<le> (i::int)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    41
        base: "P(k)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    42
        step: "\<And>i. \<lbrakk>k \<le> i; P i\<rbrakk> \<Longrightarrow> P(i+1)"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    43
  shows "P i"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    44
proof -
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    45
  { fix n have "\<And>i::int. n = nat(i-k) \<Longrightarrow> k <= i \<Longrightarrow> P i"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    46
    proof (induct n)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    47
      case 0
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    48
      hence "i = k" by arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    49
      thus "P i" using base by simp
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    50
    next
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    51
      case (Suc n)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    52
      hence "n = nat((i - 1) - k)" by arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    53
      moreover
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    54
      have ki1: "k \<le> i - 1" using Suc.prems by arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    55
      ultimately
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    56
      have "P(i - 1)" by(rule Suc.hyps)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    57
      from step[OF ki1 this] show ?case by simp
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    58
    qed
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    59
  }
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    60
  from this ge show ?thesis by fast
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    61
qed
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    62
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    63
                     (* `set:int': dummy construction *)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    64
theorem int_gr_induct[case_names base step,induct set:int]:
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    65
  assumes gr: "k < (i::int)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    66
        base: "P(k+1)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    67
        step: "\<And>i. \<lbrakk>k < i; P i\<rbrakk> \<Longrightarrow> P(i+1)"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    68
  shows "P i"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    69
apply(rule int_ge_induct[of "k + 1"])
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    70
  using gr apply arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    71
 apply(rule base)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    72
apply(rule step)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    73
 apply simp+
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    74
done
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    75
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    76
theorem int_le_induct[consumes 1,case_names base step]:
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    77
  assumes le: "i \<le> (k::int)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    78
        base: "P(k)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    79
        step: "\<And>i. \<lbrakk>i \<le> k; P i\<rbrakk> \<Longrightarrow> P(i - 1)"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    80
  shows "P i"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    81
proof -
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    82
  { fix n have "\<And>i::int. n = nat(k-i) \<Longrightarrow> i <= k \<Longrightarrow> P i"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    83
    proof (induct n)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    84
      case 0
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    85
      hence "i = k" by arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    86
      thus "P i" using base by simp
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    87
    next
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    88
      case (Suc n)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    89
      hence "n = nat(k - (i+1))" by arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    90
      moreover
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    91
      have ki1: "i + 1 \<le> k" using Suc.prems by arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    92
      ultimately
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    93
      have "P(i+1)" by(rule Suc.hyps)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    94
      from step[OF ki1 this] show ?case by simp
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    95
    qed
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    96
  }
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    97
  from this le show ?thesis by fast
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    98
qed
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
    99
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   100
theorem int_less_induct[consumes 1,case_names base step]:
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   101
  assumes less: "(i::int) < k" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   102
        base: "P(k - 1)" and
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   103
        step: "\<And>i. \<lbrakk>i < k; P i\<rbrakk> \<Longrightarrow> P(i - 1)"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   104
  shows "P i"
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   105
apply(rule int_le_induct[of _ "k - 1"])
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   106
  using less apply arith
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   107
 apply(rule base)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   108
apply(rule step)
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   109
 apply simp+
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   110
done
0b8fbcf65d73 added induction thms
nipkow
parents: 13575
diff changeset
   111
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
   112
end
13849
2584233cf3ef new simprule for int (nat n)
paulson
parents: 13837
diff changeset
   113