src/HOL/Real/rat_arith.ML
author wenzelm
Wed, 08 Nov 2006 13:48:29 +0100
changeset 21243 afffe1f72143
parent 20254 58b71535ed00
child 22548 6ce4bddf3bcb
permissions -rw-r--r--
removed theory NatArith (now part of Nat);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
     1
(*  Title:      HOL/Real/rat_arith.ML
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     2
    ID:         $Id$
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     4
    Copyright   2004 University of Cambridge
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     5
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     6
Simprocs for common factor cancellation & Rational coefficient handling
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     7
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     8
Instantiation of the generic linear arithmetic package for type rat.
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
     9
*)
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    10
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    11
local
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    12
14390
55fe71faadda further tweaks to the numeric theories
paulson
parents: 14387
diff changeset
    13
val simprocs = field_cancel_numeral_factors
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    14
14390
55fe71faadda further tweaks to the numeric theories
paulson
parents: 14387
diff changeset
    15
val simps = [order_less_irrefl, neg_less_iff_less, True_implies_equals,
14369
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14368
diff changeset
    16
             inst "a" "(number_of ?v)" right_distrib,
14387
e96d5c42c4b0 Polymorphic treatment of binary arithmetic using axclasses
paulson
parents: 14378
diff changeset
    17
             divide_1, divide_zero_left,
e96d5c42c4b0 Polymorphic treatment of binary arithmetic using axclasses
paulson
parents: 14378
diff changeset
    18
             times_divide_eq_right, times_divide_eq_left,
14390
55fe71faadda further tweaks to the numeric theories
paulson
parents: 14387
diff changeset
    19
             minus_divide_left RS sym, minus_divide_right RS sym,
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    20
             of_int_0, of_int_1, of_int_add, of_int_minus, of_int_diff,
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    21
             of_int_mult, of_int_of_nat_eq]
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    22
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    23
val nat_inj_thms = [of_nat_le_iff RS iffD2,
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    24
                    of_nat_eq_iff RS iffD2]
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    25
(* not needed because x < (y::nat) can be rewritten as Suc x <= y:
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    26
                    of_nat_less_iff RS iffD2 *)
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    27
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    28
val int_inj_thms = [of_int_le_iff RS iffD2,
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    29
                    of_int_eq_iff RS iffD2]
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    30
(* not needed because x < (y::int) can be rewritten as x + 1 <= y:
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    31
                    of_int_less_iff RS iffD2 *)
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    32
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    33
in
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    34
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    35
val fast_rat_arith_simproc =
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    36
 Simplifier.simproc (the_context ())
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    37
  "fast_rat_arith" ["(m::rat) < n","(m::rat) <= n", "(m::rat) = n"]
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    38
  Fast_Arith.lin_arith_prover
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    39
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    40
val ratT = Type ("Rational.rat", [])
14387
e96d5c42c4b0 Polymorphic treatment of binary arithmetic using axclasses
paulson
parents: 14378
diff changeset
    41
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    42
val rat_arith_setup =
18708
4b3dadb4fe33 setup: theory -> theory;
wenzelm
parents: 17876
diff changeset
    43
  Fast_Arith.map_data (fn {add_mono_thms, mult_mono_thms, inj_thms, lessD, neqE, simpset} =>
15121
1198032bad25 Initial changes to extend arithmetic from individual types to type classes.
nipkow
parents: 14390
diff changeset
    44
   {add_mono_thms = add_mono_thms,
15184
d2c19aea17bc made mult_mono_thms generic.
nipkow
parents: 15121
diff changeset
    45
    mult_mono_thms = mult_mono_thms,
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    46
    inj_thms = int_inj_thms @ nat_inj_thms @ inj_thms,
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    47
    lessD = lessD,  (*Can't change LA_Data_Ref.lessD: the rats are dense!*)
15923
01d5d0c1c078 fixed lin.arith
nipkow
parents: 15186
diff changeset
    48
    neqE =  neqE,
14387
e96d5c42c4b0 Polymorphic treatment of binary arithmetic using axclasses
paulson
parents: 14378
diff changeset
    49
    simpset = simpset addsimps simps
18708
4b3dadb4fe33 setup: theory -> theory;
wenzelm
parents: 17876
diff changeset
    50
                      addsimprocs simprocs}) #>
21243
afffe1f72143 removed theory NatArith (now part of Nat);
wenzelm
parents: 20254
diff changeset
    51
  arith_inj_const ("Nat.of_nat", HOLogic.natT --> ratT) #>
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    52
  arith_inj_const ("IntDef.of_int", HOLogic.intT --> ratT) #>
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 18708
diff changeset
    53
  (fn thy => (change_simpset_of thy (fn ss => ss addsimprocs [fast_rat_arith_simproc]); thy))
14365
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    54
3d4df8c166ae replacing HOL/Real/PRat, PNat by the rational number development
paulson
parents:
diff changeset
    55
end;