src/HOL/Hyperreal/HyperArith.thy
author huffman
Thu, 14 Sep 2006 20:31:10 +0200
changeset 20539 a7b2f90f698d
parent 20254 58b71535ed00
child 20730 da903f59e9ba
permissions -rw-r--r--
removed duplicate lemmas
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
     1
(*  Title:      HOL/HyperArith.thy
14369
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     2
    ID:         $Id$
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     4
    Copyright   1999  University of Cambridge
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     5
*)
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     6
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     7
header{*Binary arithmetic and Simplification for the Hyperreals*}
c50188fe6366 tidying up arithmetic for the hyperreals
paulson
parents: 14352
diff changeset
     8
15131
c69542757a4d New theory header syntax.
nipkow
parents: 15013
diff changeset
     9
theory HyperArith
15140
322485b816ac import -> imports
nipkow
parents: 15131
diff changeset
    10
imports HyperDef
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15140
diff changeset
    11
uses ("hypreal_arith.ML")
15131
c69542757a4d New theory header syntax.
nipkow
parents: 15013
diff changeset
    12
begin
14387
e96d5c42c4b0 Polymorphic treatment of binary arithmetic using axclasses
paulson
parents: 14378
diff changeset
    13
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    14
subsection{*Absolute Value Function for the Hyperreals*}
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    15
15003
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14387
diff changeset
    16
lemma hrabs_add_less:
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14387
diff changeset
    17
     "[| abs x < r; abs y < s |] ==> abs(x+y) < r + (s::hypreal)"
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14387
diff changeset
    18
by (simp add: abs_if split: split_if_asm)
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    19
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    20
lemma hrabs_less_gt_zero: "abs x < r ==> (0::hypreal) < r"
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    21
by (blast intro!: order_le_less_trans abs_ge_zero)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    22
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    23
lemma hrabs_disj: "abs x = (x::hypreal) | abs x = -x"
15003
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14387
diff changeset
    24
by (simp add: abs_if)
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    25
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    26
lemma hrabs_add_lemma_disj: "(y::hypreal) + - x + (y + - z) = abs (x + - z) ==> y = z | x = y"
15003
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14387
diff changeset
    27
by (simp add: abs_if split add: split_if_asm)
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    28
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    29
lemma hypreal_of_real_hrabs:
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    30
    "abs (hypreal_of_real r) = hypreal_of_real (abs r)"
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17298
diff changeset
    31
by (rule star_of_abs [symmetric])
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    32
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    33
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    34
subsection{*Embedding the Naturals into the Hyperreals*}
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    35
19765
dfe940911617 misc cleanup;
wenzelm
parents: 17429
diff changeset
    36
definition
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    37
  hypreal_of_nat   :: "nat => hypreal"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 17429
diff changeset
    38
  "hypreal_of_nat m = of_nat m"
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    39
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    40
lemma SNat_eq: "Nats = {n. \<exists>N. n = hypreal_of_nat N}"
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    41
by (force simp add: hypreal_of_nat_def Nats_def) 
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    42
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    43
lemma hypreal_of_nat_add [simp]:
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    44
     "hypreal_of_nat (m + n) = hypreal_of_nat m + hypreal_of_nat n"
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    45
by (simp add: hypreal_of_nat_def)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    46
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    47
lemma hypreal_of_nat_mult: "hypreal_of_nat (m * n) = hypreal_of_nat m * hypreal_of_nat n"
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    48
by (simp add: hypreal_of_nat_def)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    49
declare hypreal_of_nat_mult [simp]
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    50
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    51
lemma hypreal_of_nat_less_iff:
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    52
      "(n < m) = (hypreal_of_nat n < hypreal_of_nat m)"
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    53
apply (simp add: hypreal_of_nat_def)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    54
done
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    55
declare hypreal_of_nat_less_iff [symmetric, simp]
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    56
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    57
(*------------------------------------------------------------*)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    58
(* naturals embedded in hyperreals                            *)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    59
(* is a hyperreal c.f. NS extension                           *)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    60
(*------------------------------------------------------------*)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    61
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    62
lemma hypreal_of_nat_eq:
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    63
     "hypreal_of_nat (n::nat) = hypreal_of_real (real n)"
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    64
apply (induct n) 
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    65
apply (simp_all add: hypreal_of_nat_def real_of_nat_def)
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    66
done
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    67
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    68
lemma hypreal_of_nat:
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17298
diff changeset
    69
     "hypreal_of_nat m = star_n (%n. real m)"
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17298
diff changeset
    70
apply (fold star_of_def)
17298
ad73fb6144cf replace type hypreal with real star
huffman
parents: 16924
diff changeset
    71
apply (induct m)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17298
diff changeset
    72
apply (simp_all add: hypreal_of_nat_def real_of_nat_def star_n_add)
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    73
done
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    74
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    75
lemma hypreal_of_nat_Suc:
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    76
     "hypreal_of_nat (Suc n) = hypreal_of_nat n + (1::hypreal)"
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    77
by (simp add: hypreal_of_nat_def)
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    78
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    79
(*"neg" is used in rewrite rules for binary comparisons*)
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    80
lemma hypreal_of_nat_number_of [simp]:
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    81
     "hypreal_of_nat (number_of v :: nat) =
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    82
         (if neg (number_of v :: int) then 0
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    83
          else (number_of v :: hypreal))"
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    84
by (simp add: hypreal_of_nat_eq)
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    85
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    86
lemma hypreal_of_nat_zero [simp]: "hypreal_of_nat 0 = 0"
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    87
by (simp add: hypreal_of_nat_def) 
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    88
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    89
lemma hypreal_of_nat_one [simp]: "hypreal_of_nat 1 = 1"
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    90
by (simp add: hypreal_of_nat_def) 
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    91
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    92
lemma hypreal_of_nat_le_iff [simp]:
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    93
     "(hypreal_of_nat n \<le> hypreal_of_nat m) = (n \<le> m)"
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    94
by (simp add: hypreal_of_nat_def) 
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    95
14378
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    96
lemma hypreal_of_nat_ge_zero [simp]: "0 \<le> hypreal_of_nat n"
69c4d5997669 generic of_nat and of_int functions, and generalization of iszero
paulson
parents: 14371
diff changeset
    97
by (simp add: hypreal_of_nat_def) 
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    98
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
    99
14309
f508492af9b4 moving HyperArith0.ML to other theories
paulson
parents: 10751
diff changeset
   100
(*
14371
c78c7da09519 Conversion of HyperNat to Isar format and its declaration as a semiring
paulson
parents: 14370
diff changeset
   101
FIXME: we should declare this, as for type int, but many proofs would break.
14309
f508492af9b4 moving HyperArith0.ML to other theories
paulson
parents: 10751
diff changeset
   102
It replaces x+-y by x-y.
f508492af9b4 moving HyperArith0.ML to other theories
paulson
parents: 10751
diff changeset
   103
Addsimps [symmetric hypreal_diff_def]
f508492af9b4 moving HyperArith0.ML to other theories
paulson
parents: 10751
diff changeset
   104
*)
f508492af9b4 moving HyperArith0.ML to other theories
paulson
parents: 10751
diff changeset
   105
20254
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 19765
diff changeset
   106
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 19765
diff changeset
   107
use "hypreal_arith.ML"
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 19765
diff changeset
   108
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 19765
diff changeset
   109
setup hypreal_arith_setup
58b71535ed00 lin_arith_prover splits certain operators (e.g. min, max, abs)
webertj
parents: 19765
diff changeset
   110
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   111
end