src/HOL/Integ/Bin.thy
author wenzelm
Fri, 08 Mar 2002 16:24:06 +0100
changeset 13049 ce180e5b7fa0
parent 11868 56db9f3a6b3e
child 13491 ddf6ae639f21
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     1
(*  Title:	HOL/Integ/Bin.thy
6910
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
     2
    ID:         $Id$
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     3
    Authors:	Lawrence C Paulson, Cambridge University Computer Laboratory
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     4
		David Spelt, University of Twente 
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     5
    Copyright	1994  University of Cambridge
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     6
    Copyright   1996 University of Twente
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     7
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     8
Arithmetic on binary integers.
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
     9
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    10
   The sign Pls stands for an infinite string of leading F's.
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    11
   The sign Min stands for an infinite string of leading T's.
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    12
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    13
A number can have multiple representations, namely leading F's with sign
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    14
Pls and leading T's with sign Min.  See ZF/ex/twos-compl.ML/int_of_binary
2988
d38f330e58b3 Renamed sign constructors to eliminate clash with the Plus infix of Sum.thy
paulson
parents: 1632
diff changeset
    15
for the numerical interpretation.
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    16
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    17
The representation expects that (m mod 2) is 0 or 1, even if m is negative;
11868
56db9f3a6b3e Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
paulson
parents: 9207
diff changeset
    18
For instance, -5 div 2 = -3 and -5 mod 2 = 1; thus -5 = (-3)*2 + 1
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    19
*)
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    20
6910
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    21
Bin = Int + Numeral +
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    22
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    23
consts
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    24
  NCons            :: [bin,bool]=>bin
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    25
  bin_succ         :: bin=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    26
  bin_pred         :: bin=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    27
  bin_minus        :: bin=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    28
  bin_add,bin_mult :: [bin,bin]=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    29
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    30
(*NCons inserts a bit, suppressing leading 0s and 1s*)
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    31
primrec
5540
0f16c3b66ab4 much renaming and reorganization
paulson
parents: 5512
diff changeset
    32
  NCons_Pls "NCons Pls b = (if b then (Pls BIT b) else Pls)"
0f16c3b66ab4 much renaming and reorganization
paulson
parents: 5512
diff changeset
    33
  NCons_Min "NCons Min b = (if b then Min else (Min BIT b))"
0f16c3b66ab4 much renaming and reorganization
paulson
parents: 5512
diff changeset
    34
  NCons_BIT "NCons (w BIT x) b = (w BIT x) BIT b"
6910
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    35
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    36
instance
6988
eed63543a3af renamed sort "numeral" to "number"
paulson
parents: 6910
diff changeset
    37
  int :: number
eed63543a3af renamed sort "numeral" to "number"
paulson
parents: 6910
diff changeset
    38
11868
56db9f3a6b3e Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
paulson
parents: 9207
diff changeset
    39
primrec (*the type constraint is essential!*)
56db9f3a6b3e Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
paulson
parents: 9207
diff changeset
    40
  number_of_Pls  "number_of Pls = 0"
56db9f3a6b3e Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
paulson
parents: 9207
diff changeset
    41
  number_of_Min  "number_of Min = - (1::int)"
56db9f3a6b3e Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
paulson
parents: 9207
diff changeset
    42
  number_of_BIT  "number_of(w BIT x) = (if x then 1 else 0) +
56db9f3a6b3e Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
paulson
parents: 9207
diff changeset
    43
	                               (number_of w) + (number_of w)" 
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    44
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    45
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    46
  bin_succ_Pls  "bin_succ Pls = Pls BIT True" 
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    47
  bin_succ_Min  "bin_succ Min = Pls"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    48
  bin_succ_BIT  "bin_succ(w BIT x) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    49
  	            (if x then bin_succ w BIT False
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    50
	                  else NCons w True)"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    51
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    52
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    53
  bin_pred_Pls  "bin_pred Pls = Min"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    54
  bin_pred_Min  "bin_pred Min = Min BIT False"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    55
  bin_pred_BIT  "bin_pred(w BIT x) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    56
	            (if x then NCons w False
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    57
		          else (bin_pred w) BIT True)"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    58
 
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    59
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    60
  bin_minus_Pls  "bin_minus Pls = Pls"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    61
  bin_minus_Min  "bin_minus Min = Pls BIT True"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    62
  bin_minus_BIT  "bin_minus(w BIT x) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    63
	             (if x then bin_pred (NCons (bin_minus w) False)
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    64
		           else bin_minus w BIT False)"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    65
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    66
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    67
  bin_add_Pls  "bin_add Pls w = w"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    68
  bin_add_Min  "bin_add Min w = bin_pred w"
9207
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    69
  bin_add_BIT
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    70
    "bin_add (v BIT x) w = 
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    71
       (case w of Pls => v BIT x
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    72
                | Min => bin_pred (v BIT x)
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    73
                | (w BIT y) =>
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    74
      	            NCons (bin_add v (if (x & y) then bin_succ w else w))
0c294bd701ea removed the mutual recursion from "bin_add"
paulson
parents: 6988
diff changeset
    75
	                  (x~=y))"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    76
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    77
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    78
  bin_mult_Pls  "bin_mult Pls w = Pls"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    79
  bin_mult_Min  "bin_mult Min w = bin_minus w"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    80
  bin_mult_BIT  "bin_mult (v BIT x) w =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    81
	            (if x then (bin_add (NCons (bin_mult v w) False) w)
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    82
	                  else (NCons (bin_mult v w) False))"
5491
22f8331cdf47 revised treatment of integers
paulson
parents: 5184
diff changeset
    83
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    84
end