src/HOL/Divides.thy
author nipkow
Wed, 15 May 2002 13:49:51 +0200
changeset 13152 2a54f99b44b3
parent 12338 de0f4a63baa5
child 13189 81ed5c6de890
permissions -rw-r--r--
Divides.ML -> Divides_lemmas.ML Converted Divides.thy to Isar.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     1
(*  Title:      HOL/Divides.thy
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     2
    ID:         $Id$
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
     4
    Copyright   1999  University of Cambridge
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     5
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     6
The division operators div, mod and the divides relation "dvd"
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     7
*)
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
     8
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
     9
theory Divides = NatArith files("Divides_lemmas.ML"):
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    10
8902
a705822f4e2a replaced {{ }} by { };
wenzelm
parents: 7029
diff changeset
    11
(*We use the same class for div and mod;
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    12
  moreover, dvd is defined whenever multiplication is*)
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    13
axclass
12338
de0f4a63baa5 renamed class "term" to "type" (actually "HOL.type");
wenzelm
parents: 10789
diff changeset
    14
  div < type
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    15
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    16
instance  nat :: div ..
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    17
instance  nat :: plus_ac0
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    18
proof qed (rule add_commute add_assoc add_0)+
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    19
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    20
consts
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    21
  div  :: "'a::div \<Rightarrow> 'a \<Rightarrow> 'a"          (infixl 70)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    22
  mod  :: "'a::div \<Rightarrow> 'a \<Rightarrow> 'a"          (infixl 70)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    23
  dvd  :: "'a::times \<Rightarrow> 'a \<Rightarrow> bool"      (infixl 50)
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    24
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    25
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    26
defs
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    27
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    28
  mod_def:   "m mod n == wfrec (trancl pred_nat)
7029
08d4eb8500dd new division laws taking advantage of (m div 0) = 0 and (m mod 0) = m
paulson
parents: 6865
diff changeset
    29
                          (%f j. if j<n | n=0 then j else f (j-n)) m"
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    30
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    31
  div_def:   "m div n == wfrec (trancl pred_nat) 
7029
08d4eb8500dd new division laws taking advantage of (m div 0) = 0 and (m mod 0) = m
paulson
parents: 6865
diff changeset
    32
                          (%f j. if j<n | n=0 then 0 else Suc (f (j-n))) m"
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    33
6865
5577ffe4c2f1 now div and mod are overloaded; dvd is polymorphic
paulson
parents: 3366
diff changeset
    34
(*The definition of dvd is polymorphic!*)
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    35
  dvd_def:   "m dvd n == EX k. n = m*k"
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    36
10559
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    37
(*This definition helps prove the harder properties of div and mod.
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    38
  It is copied from IntDiv.thy; should it be overloaded?*)
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    39
constdefs
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    40
  quorem :: "(nat*nat) * (nat*nat) => bool"
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    41
    "quorem == %((a,b), (q,r)).
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    42
                      a = b*q + r &
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    43
                      (if 0<b then 0<=r & r<b else b<r & r <=0)"
d3fd54fc659b many new div and mod properties (borrowed from Integ/IntDiv)
paulson
parents: 10214
diff changeset
    44
13152
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    45
use "Divides_lemmas.ML"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    46
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    47
lemma mod_div_equality2: "n * (m div n) + m mod n = (m::nat)"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    48
apply(insert mod_div_equality[of m n])
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    49
apply(simp only:mult_ac)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    50
done
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    51
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    52
lemma split_div:
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    53
assumes m: "m \<noteq> 0"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    54
shows "P(n div m :: nat) = (!i. !j<m. n = m*i + j \<longrightarrow> P i)"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    55
       (is "?P = ?Q")
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    56
proof
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    57
  assume P: ?P
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    58
  show ?Q
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    59
  proof (intro allI impI)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    60
    fix i j
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    61
    assume n: "n = m*i + j" and j: "j < m"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    62
    show "P i"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    63
    proof (cases)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    64
      assume "i = 0"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    65
      with n j P show "P i" by simp
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    66
    next
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    67
      assume "i \<noteq> 0"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    68
      with n j P show "P i" by (simp add:add_ac div_mult_self1)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    69
    qed
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    70
  qed
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    71
next
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    72
  assume Q: ?Q
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    73
  from m Q[THEN spec,of "n div m",THEN spec, of "n mod m"]
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    74
  show ?P by(simp add:mod_div_equality2)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    75
qed
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    76
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    77
lemma split_mod:
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    78
assumes m: "m \<noteq> 0"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    79
shows "P(n mod m :: nat) = (!i. !j<m. n = m*i + j \<longrightarrow> P j)"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    80
       (is "?P = ?Q")
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    81
proof
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    82
  assume P: ?P
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    83
  show ?Q
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    84
  proof (intro allI impI)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    85
    fix i j
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    86
    assume "n = m*i + j" "j < m"
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    87
    thus "P j" using m P by(simp add:add_ac mult_ac)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    88
  qed
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    89
next
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    90
  assume Q: ?Q
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    91
  from m Q[THEN spec,of "n div m",THEN spec, of "n mod m"]
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    92
  show ?P by(simp add:mod_div_equality2)
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    93
qed
2a54f99b44b3 Divides.ML -> Divides_lemmas.ML
nipkow
parents: 12338
diff changeset
    94
3366
2402c6ab1561 Moving div and mod from Arith to Divides
paulson
parents:
diff changeset
    95
end