src/HOL/Integ/Bin.thy
author paulson
Thu, 15 Jul 1999 10:34:37 +0200
changeset 7010 63120b6dca50
parent 6988 eed63543a3af
child 9207 0c294bd701ea
permissions -rw-r--r--
more renaming of theorems from _nat to _int (corresponding to a function that was similarly renamed some time ago Also new theorem zmult_int
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;
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    18
For instance, ~5 div 2 = ~3 and ~5 mod 2 = 1; thus ~5 = (~3)*2 + 1
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    19
2988
d38f330e58b3 Renamed sign constructors to eliminate clash with the Plus infix of Sum.thy
paulson
parents: 1632
diff changeset
    20
Division is not defined yet!  To do it efficiently requires computing the
d38f330e58b3 Renamed sign constructors to eliminate clash with the Plus infix of Sum.thy
paulson
parents: 1632
diff changeset
    21
quotient and remainder using ML and checking the answer using multiplication
d38f330e58b3 Renamed sign constructors to eliminate clash with the Plus infix of Sum.thy
paulson
parents: 1632
diff changeset
    22
by proof.  Then uniqueness of the quotient and remainder yields theorems
d38f330e58b3 Renamed sign constructors to eliminate clash with the Plus infix of Sum.thy
paulson
parents: 1632
diff changeset
    23
quoting the previously computed values.  (Or code an oracle...)
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    24
*)
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    25
6910
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    26
Bin = Int + Numeral +
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    27
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    28
consts
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    29
  NCons            :: [bin,bool]=>bin
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    30
  bin_succ         :: bin=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    31
  bin_pred         :: bin=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    32
  bin_minus        :: bin=>bin
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    33
  bin_add,bin_mult :: [bin,bin]=>bin
6910
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    34
  adding           :: [bin,bool,bin]=>bin
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    35
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    36
(*NCons inserts a bit, suppressing leading 0s and 1s*)
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    37
primrec
5540
0f16c3b66ab4 much renaming and reorganization
paulson
parents: 5512
diff changeset
    38
  NCons_Pls "NCons Pls b = (if b then (Pls BIT b) else Pls)"
0f16c3b66ab4 much renaming and reorganization
paulson
parents: 5512
diff changeset
    39
  NCons_Min "NCons Min b = (if b then Min else (Min BIT b))"
0f16c3b66ab4 much renaming and reorganization
paulson
parents: 5512
diff changeset
    40
  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
    41
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    42
instance
6988
eed63543a3af renamed sort "numeral" to "number"
paulson
parents: 6910
diff changeset
    43
  int :: number
eed63543a3af renamed sort "numeral" to "number"
paulson
parents: 6910
diff changeset
    44
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    45
primrec
6910
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    46
  number_of_Pls  "number_of Pls = int 0"
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    47
  number_of_Min  "number_of Min = - (int 1)"
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    48
  number_of_BIT  "number_of(w BIT x) = (if x then int 1 else int 0) +
7c3503ae3d78 use generic numeral encoding and syntax;
wenzelm
parents: 6396
diff changeset
    49
	                             (number_of w) + (number_of w)" 
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    50
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    51
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    52
  bin_succ_Pls  "bin_succ Pls = Pls BIT True" 
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    53
  bin_succ_Min  "bin_succ Min = Pls"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    54
  bin_succ_BIT  "bin_succ(w BIT x) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    55
  	            (if x then bin_succ w BIT False
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    56
	                  else NCons w True)"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    57
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    58
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    59
  bin_pred_Pls  "bin_pred Pls = Min"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    60
  bin_pred_Min  "bin_pred Min = Min BIT False"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    61
  bin_pred_BIT  "bin_pred(w BIT x) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    62
	            (if x then NCons w False
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    63
		          else (bin_pred w) BIT True)"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    64
 
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    65
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    66
  bin_minus_Pls  "bin_minus Pls = Pls"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    67
  bin_minus_Min  "bin_minus Min = Pls BIT True"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    68
  bin_minus_BIT  "bin_minus(w BIT x) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    69
	             (if x then bin_pred (NCons (bin_minus w) False)
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    70
		           else bin_minus w BIT False)"
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    71
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    72
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    73
  bin_add_Pls  "bin_add Pls w = w"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    74
  bin_add_Min  "bin_add Min w = bin_pred w"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    75
  bin_add_BIT  "bin_add (v BIT x) w = adding v x w"
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
  "adding v x Pls = v BIT x"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    79
  "adding v x Min = bin_pred (v BIT x)"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    80
  "adding v x (w BIT y) =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    81
 	     NCons (bin_add v (if (x & y) then bin_succ w else w))
5512
4327eec06849 much renaming and tidying
paulson
parents: 5510
diff changeset
    82
	           (x~=y)" 
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    83
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4709
diff changeset
    84
primrec
5546
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    85
  bin_mult_Pls  "bin_mult Pls w = Pls"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    86
  bin_mult_Min  "bin_mult Min w = bin_minus w"
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    87
  bin_mult_BIT  "bin_mult (v BIT x) w =
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    88
	            (if x then (bin_add (NCons (bin_mult v w) False) w)
a48cbe410618 renamed some axioms
paulson
parents: 5540
diff changeset
    89
	                  else (NCons (bin_mult v w) False))"
5491
22f8331cdf47 revised treatment of integers
paulson
parents: 5184
diff changeset
    90
1632
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    91
39e146ac224c Binary integers and their numeric syntax
paulson
parents:
diff changeset
    92
end