src/Pure/General/int.ML
author haftmann
Sat, 19 May 2007 11:33:30 +0200
changeset 23024 70435ffe077d
parent 22995 d8b4f2dc2b1d
permissions -rw-r--r--
fixed text
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/General/int.ML
372e3471fca2 added module int
haftmann
parents:
diff changeset
     2
    ID:         $Id$
372e3471fca2 added module int
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
372e3471fca2 added module int
haftmann
parents:
diff changeset
     4
372e3471fca2 added module int
haftmann
parents:
diff changeset
     5
Unbounded integers.
372e3471fca2 added module int
haftmann
parents:
diff changeset
     6
*)
372e3471fca2 added module int
haftmann
parents:
diff changeset
     7
372e3471fca2 added module int
haftmann
parents:
diff changeset
     8
signature INTT =
372e3471fca2 added module int
haftmann
parents:
diff changeset
     9
sig
372e3471fca2 added module int
haftmann
parents:
diff changeset
    10
  type int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    11
  val zero: int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    12
  val one: int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    13
  val two: int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    14
  val int: Int.int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    15
  val machine_int: int -> Int.int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    16
  val string_of_int: int -> string
372e3471fca2 added module int
haftmann
parents:
diff changeset
    17
  val int_of_string: string -> int option
372e3471fca2 added module int
haftmann
parents:
diff changeset
    18
  val eq: int * int -> bool
372e3471fca2 added module int
haftmann
parents:
diff changeset
    19
  val cmp: int * int -> order
372e3471fca2 added module int
haftmann
parents:
diff changeset
    20
  val le: int -> int -> bool
372e3471fca2 added module int
haftmann
parents:
diff changeset
    21
  val cmp_zero: int -> order
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    22
  val min: int -> int -> int
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    23
  val max: int -> int -> int
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    24
  val inc: int -> int
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    25
  val add: int -> int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    26
  val sub: int -> int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    27
  val mult: int -> int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    28
  val divmod: int -> int -> int * int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    29
  val div: int -> int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    30
  val mod: int -> int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    31
  val neg: int -> int
372e3471fca2 added module int
haftmann
parents:
diff changeset
    32
  val exp: int -> int
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    33
  val log: int -> int
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    34
  val pow: int -> int -> int (* exponent -> base -> result *)
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    35
end;
372e3471fca2 added module int
haftmann
parents:
diff changeset
    36
372e3471fca2 added module int
haftmann
parents:
diff changeset
    37
structure Intt: INTT =
372e3471fca2 added module int
haftmann
parents:
diff changeset
    38
struct
372e3471fca2 added module int
haftmann
parents:
diff changeset
    39
372e3471fca2 added module int
haftmann
parents:
diff changeset
    40
open IntInf;
372e3471fca2 added module int
haftmann
parents:
diff changeset
    41
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    42
val int = fromInt;
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    43
372e3471fca2 added module int
haftmann
parents:
diff changeset
    44
val zero = int 0;
372e3471fca2 added module int
haftmann
parents:
diff changeset
    45
val one = int 1;
372e3471fca2 added module int
haftmann
parents:
diff changeset
    46
val two = int 2;
372e3471fca2 added module int
haftmann
parents:
diff changeset
    47
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    48
val machine_int = toInt;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    49
val string_of_int = toString;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    50
val int_of_string = fromString;
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    51
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    52
val eq = op = : int * int -> bool;
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    53
val cmp = compare;
372e3471fca2 added module int
haftmann
parents:
diff changeset
    54
val le = curry (op <=);
372e3471fca2 added module int
haftmann
parents:
diff changeset
    55
val cmp_zero = curry cmp zero;
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    56
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    57
val min = curry min;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    58
val max = curry max;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    59
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    60
val inc = curry (op +) one;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    61
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    62
val add = curry (op +);
372e3471fca2 added module int
haftmann
parents:
diff changeset
    63
val sub = curry (op -);
372e3471fca2 added module int
haftmann
parents:
diff changeset
    64
val mult = curry ( op * );
372e3471fca2 added module int
haftmann
parents:
diff changeset
    65
val divmod = curry divMod;
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    66
nonfix div val div = curry div;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    67
nonfix mod val mod = curry mod;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    68
val neg = ~;
22995
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    69
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    70
fun pow k l =
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    71
  let
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    72
    fun pw 0 = 1
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    73
      | pw k = mult l (pw (sub k 1));
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    74
  in if k < zero
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    75
    then error "pow: negative exponent"
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    76
    else pw k
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    77
  end;
d8b4f2dc2b1d refined pow function
haftmann
parents: 22964
diff changeset
    78
22964
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    79
fun exp k = pow k two;
2284e0d02e7f reorganized float arithmetic
haftmann
parents: 22954
diff changeset
    80
val log = int o log2;
22954
372e3471fca2 added module int
haftmann
parents:
diff changeset
    81
372e3471fca2 added module int
haftmann
parents:
diff changeset
    82
end;