src/HOL/Integ/Numeral.thy
changeset 15620 8ccdc8bc66a2
parent 15140 322485b816ac
child 16417 9bc16273c2d4
equal deleted inserted replaced
15619:cafa1cc0bb0a 15620:8ccdc8bc66a2
     5 *)
     5 *)
     6 
     6 
     7 header{*Arithmetic on Binary Integers*}
     7 header{*Arithmetic on Binary Integers*}
     8 
     8 
     9 theory Numeral
     9 theory Numeral
    10 imports IntDef
    10 imports IntDef Datatype
    11 files "Tools/numeral_syntax.ML"
    11 files "../Tools/numeral_syntax.ML"
    12 begin
    12 begin
    13 
    13 
    14 text{* The file @{text numeral_syntax.ML} hides the constructors Pls and Min.
    14 text{* The file @{text numeral_syntax.ML} hides the constructors Pls and Min.
    15    Only qualified access Numeral.Pls and Numeral.Min is allowed.
    15    Only qualified access Numeral.Pls and Numeral.Min is allowed.
       
    16    The datatype constructors bit.B0 and bit.B1 are similarly hidden.
    16    We do not hide Bit because we need the BIT infix syntax.*}
    17    We do not hide Bit because we need the BIT infix syntax.*}
    17 
    18 
    18 text{*This formalization defines binary arithmetic in terms of the integers
    19 text{*This formalization defines binary arithmetic in terms of the integers
    19 rather than using a datatype. This avoids multiple representations (leading
    20 rather than using a datatype. This avoids multiple representations (leading
    20 zeroes, etc.)  See @{text "ZF/Integ/twos-compl.ML"}, function @{text
    21 zeroes, etc.)  See @{text "ZF/Integ/twos-compl.ML"}, function @{text
    29 
    30 
    30 typedef (Bin)
    31 typedef (Bin)
    31   bin = "UNIV::int set"
    32   bin = "UNIV::int set"
    32     by (auto)
    33     by (auto)
    33 
    34 
       
    35 
       
    36 text{*This datatype avoids the use of type @{typ bool}, which would make
       
    37 all of the rewrite rules higher-order. If the use of datatype causes
       
    38 problems, this two-element type can easily be formalized using typedef.*}
       
    39 datatype bit = B0 | B1
       
    40 
    34 constdefs
    41 constdefs
    35   Pls :: "bin"
    42   Pls :: "bin"
    36    "Pls == Abs_Bin 0"
    43    "Pls == Abs_Bin 0"
    37 
    44 
    38   Min :: "bin"
    45   Min :: "bin"
    39    "Min == Abs_Bin (- 1)"
    46    "Min == Abs_Bin (- 1)"
    40 
    47 
    41   Bit :: "[bin,bool] => bin"    (infixl "BIT" 90)
    48   Bit :: "[bin,bit] => bin"    (infixl "BIT" 90)
    42    --{*That is, 2w+b*}
    49    --{*That is, 2w+b*}
    43    "w BIT b == Abs_Bin ((if b then 1 else 0) + Rep_Bin w + Rep_Bin w)"
    50    "w BIT b == Abs_Bin ((case b of B0 => 0 | B1 => 1) + Rep_Bin w + Rep_Bin w)"
    44 
    51 
    45 
    52 
    46 axclass
    53 axclass
    47   number < type  -- {* for numeric types: nat, int, real, \dots *}
    54   number < type  -- {* for numeric types: nat, int, real, \dots *}
    48 
    55 
    54   Numeral0 :: 'a
    61   Numeral0 :: 'a
    55   Numeral1 :: 'a
    62   Numeral1 :: 'a
    56 
    63 
    57 translations
    64 translations
    58   "Numeral0" == "number_of Numeral.Pls"
    65   "Numeral0" == "number_of Numeral.Pls"
    59   "Numeral1" == "number_of (Numeral.Pls BIT True)"
    66   "Numeral1" == "number_of (Numeral.Pls BIT bit.B1)"
    60 
    67 
    61 
    68 
    62 setup NumeralSyntax.setup
    69 setup NumeralSyntax.setup
    63 
    70 
    64 syntax (xsymbols)
    71 syntax (xsymbols)
   103 lemmas Bin_simps = 
   110 lemmas Bin_simps = 
   104        bin_succ_def bin_pred_def bin_minus_def bin_add_def bin_mult_def
   111        bin_succ_def bin_pred_def bin_minus_def bin_add_def bin_mult_def
   105        Pls_def Min_def Bit_def Abs_Bin_inverse Rep_Bin_inverse Bin_def
   112        Pls_def Min_def Bit_def Abs_Bin_inverse Rep_Bin_inverse Bin_def
   106 
   113 
   107 text{*Removal of leading zeroes*}
   114 text{*Removal of leading zeroes*}
   108 lemma Pls_0_eq [simp]: "Numeral.Pls BIT False = Numeral.Pls"
   115 lemma Pls_0_eq [simp]: "Numeral.Pls BIT bit.B0 = Numeral.Pls"
   109 by (simp add: Bin_simps)
   116 by (simp add: Bin_simps)
   110 
   117 
   111 lemma Min_1_eq [simp]: "Numeral.Min BIT True = Numeral.Min"
   118 lemma Min_1_eq [simp]: "Numeral.Min BIT bit.B1 = Numeral.Min"
   112 by (simp add: Bin_simps)
   119 by (simp add: Bin_simps)
   113 
   120 
   114 subsection{*The Functions @{term bin_succ},  @{term bin_pred} and @{term bin_minus}*}
   121 subsection{*The Functions @{term bin_succ},  @{term bin_pred} and @{term bin_minus}*}
   115 
   122 
   116 lemma bin_succ_Pls [simp]: "bin_succ Numeral.Pls = Numeral.Pls BIT True"
   123 lemma bin_succ_Pls [simp]: "bin_succ Numeral.Pls = Numeral.Pls BIT bit.B1"
   117 by (simp add: Bin_simps) 
   124 by (simp add: Bin_simps) 
   118 
   125 
   119 lemma bin_succ_Min [simp]: "bin_succ Numeral.Min = Numeral.Pls"
   126 lemma bin_succ_Min [simp]: "bin_succ Numeral.Min = Numeral.Pls"
   120 by (simp add: Bin_simps) 
   127 by (simp add: Bin_simps) 
   121 
   128 
   122 lemma bin_succ_1 [simp]: "bin_succ(w BIT True) = (bin_succ w) BIT False"
   129 lemma bin_succ_1 [simp]: "bin_succ(w BIT bit.B1) = (bin_succ w) BIT bit.B0"
   123 by (simp add: Bin_simps add_ac) 
   130 by (simp add: Bin_simps add_ac) 
   124 
   131 
   125 lemma bin_succ_0 [simp]: "bin_succ(w BIT False) = w BIT True"
   132 lemma bin_succ_0 [simp]: "bin_succ(w BIT bit.B0) = w BIT bit.B1"
   126 by (simp add: Bin_simps add_ac) 
   133 by (simp add: Bin_simps add_ac) 
   127 
   134 
   128 lemma bin_pred_Pls [simp]: "bin_pred Numeral.Pls = Numeral.Min"
   135 lemma bin_pred_Pls [simp]: "bin_pred Numeral.Pls = Numeral.Min"
   129 by (simp add: Bin_simps) 
   136 by (simp add: Bin_simps) 
   130 
   137 
   131 lemma bin_pred_Min [simp]: "bin_pred Numeral.Min = Numeral.Min BIT False"
   138 lemma bin_pred_Min [simp]: "bin_pred Numeral.Min = Numeral.Min BIT bit.B0"
   132 by (simp add: Bin_simps diff_minus) 
   139 by (simp add: Bin_simps diff_minus) 
   133 
   140 
   134 lemma bin_pred_1 [simp]: "bin_pred(w BIT True) = w BIT False"
   141 lemma bin_pred_1 [simp]: "bin_pred(w BIT bit.B1) = w BIT bit.B0"
   135 by (simp add: Bin_simps) 
   142 by (simp add: Bin_simps) 
   136 
   143 
   137 lemma bin_pred_0 [simp]: "bin_pred(w BIT False) = (bin_pred w) BIT True"
   144 lemma bin_pred_0 [simp]: "bin_pred(w BIT bit.B0) = (bin_pred w) BIT bit.B1"
   138 by (simp add: Bin_simps diff_minus add_ac) 
   145 by (simp add: Bin_simps diff_minus add_ac) 
   139 
   146 
   140 lemma bin_minus_Pls [simp]: "bin_minus Numeral.Pls = Numeral.Pls"
   147 lemma bin_minus_Pls [simp]: "bin_minus Numeral.Pls = Numeral.Pls"
   141 by (simp add: Bin_simps) 
   148 by (simp add: Bin_simps) 
   142 
   149 
   143 lemma bin_minus_Min [simp]: "bin_minus Numeral.Min = Numeral.Pls BIT True"
   150 lemma bin_minus_Min [simp]: "bin_minus Numeral.Min = Numeral.Pls BIT bit.B1"
   144 by (simp add: Bin_simps) 
   151 by (simp add: Bin_simps) 
   145 
   152 
   146 lemma bin_minus_1 [simp]:
   153 lemma bin_minus_1 [simp]:
   147      "bin_minus (w BIT True) = bin_pred (bin_minus w) BIT True"
   154      "bin_minus (w BIT bit.B1) = bin_pred (bin_minus w) BIT bit.B1"
   148 by (simp add: Bin_simps add_ac diff_minus) 
   155 by (simp add: Bin_simps add_ac diff_minus) 
   149 
   156 
   150  lemma bin_minus_0 [simp]: "bin_minus(w BIT False) = (bin_minus w) BIT False"
   157  lemma bin_minus_0 [simp]: "bin_minus(w BIT bit.B0) = (bin_minus w) BIT bit.B0"
   151 by (simp add: Bin_simps) 
   158 by (simp add: Bin_simps) 
   152 
   159 
   153 
   160 
   154 subsection{*Binary Addition and Multiplication:
   161 subsection{*Binary Addition and Multiplication:
   155          @{term bin_add} and @{term bin_mult}*}
   162          @{term bin_add} and @{term bin_mult}*}
   159 
   166 
   160 lemma bin_add_Min [simp]: "bin_add Numeral.Min w = bin_pred w"
   167 lemma bin_add_Min [simp]: "bin_add Numeral.Min w = bin_pred w"
   161 by (simp add: Bin_simps diff_minus add_ac) 
   168 by (simp add: Bin_simps diff_minus add_ac) 
   162 
   169 
   163 lemma bin_add_BIT_11 [simp]:
   170 lemma bin_add_BIT_11 [simp]:
   164      "bin_add (v BIT True) (w BIT True) = bin_add v (bin_succ w) BIT False"
   171      "bin_add (v BIT bit.B1) (w BIT bit.B1) = bin_add v (bin_succ w) BIT bit.B0"
   165 by (simp add: Bin_simps add_ac)
   172 by (simp add: Bin_simps add_ac)
   166 
   173 
   167 lemma bin_add_BIT_10 [simp]:
   174 lemma bin_add_BIT_10 [simp]:
   168      "bin_add (v BIT True) (w BIT False) = (bin_add v w) BIT True"
   175      "bin_add (v BIT bit.B1) (w BIT bit.B0) = (bin_add v w) BIT bit.B1"
   169 by (simp add: Bin_simps add_ac)
   176 by (simp add: Bin_simps add_ac)
   170 
   177 
   171 lemma bin_add_BIT_0 [simp]:
   178 lemma bin_add_BIT_0 [simp]:
   172      "bin_add (v BIT False) (w BIT y) = bin_add v w BIT y"
   179      "bin_add (v BIT bit.B0) (w BIT y) = bin_add v w BIT y"
   173 by (simp add: Bin_simps add_ac)
   180 by (simp add: Bin_simps add_ac)
   174 
   181 
   175 lemma bin_add_Pls_right [simp]: "bin_add w Numeral.Pls = w"
   182 lemma bin_add_Pls_right [simp]: "bin_add w Numeral.Pls = w"
   176 by (simp add: Bin_simps) 
   183 by (simp add: Bin_simps) 
   177 
   184 
   183 
   190 
   184 lemma bin_mult_Min [simp]: "bin_mult Numeral.Min w = bin_minus w"
   191 lemma bin_mult_Min [simp]: "bin_mult Numeral.Min w = bin_minus w"
   185 by (simp add: Bin_simps) 
   192 by (simp add: Bin_simps) 
   186 
   193 
   187 lemma bin_mult_1 [simp]:
   194 lemma bin_mult_1 [simp]:
   188      "bin_mult (v BIT True) w = bin_add ((bin_mult v w) BIT False) w"
   195      "bin_mult (v BIT bit.B1) w = bin_add ((bin_mult v w) BIT bit.B0) w"
   189 by (simp add: Bin_simps add_ac left_distrib)
   196 by (simp add: Bin_simps add_ac left_distrib)
   190 
   197 
   191 lemma bin_mult_0 [simp]: "bin_mult (v BIT False) w = (bin_mult v w) BIT False"
   198 lemma bin_mult_0 [simp]: "bin_mult (v BIT bit.B0) w = (bin_mult v w) BIT bit.B0"
   192 by (simp add: Bin_simps left_distrib)
   199 by (simp add: Bin_simps left_distrib)
   193 
   200 
   194 
   201 
   195 
   202 
   196 subsection{*Converting Numerals to Rings: @{term number_of}*}
   203 subsection{*Converting Numerals to Rings: @{term number_of}*}
   219 by (simp add: number_of_eq Bin_simps) 
   226 by (simp add: number_of_eq Bin_simps) 
   220 
   227 
   221 text{*The correctness of shifting.  But it doesn't seem to give a measurable
   228 text{*The correctness of shifting.  But it doesn't seem to give a measurable
   222   speed-up.*}
   229   speed-up.*}
   223 lemma double_number_of_BIT:
   230 lemma double_number_of_BIT:
   224      "(1+1) * number_of w = (number_of (w BIT False) ::'a::number_ring)"
   231      "(1+1) * number_of w = (number_of (w BIT bit.B0) ::'a::number_ring)"
   225 by (simp add: number_of_eq Bin_simps left_distrib) 
   232 by (simp add: number_of_eq Bin_simps left_distrib) 
   226 
   233 
   227 text{*Converting numerals 0 and 1 to their abstract versions*}
   234 text{*Converting numerals 0 and 1 to their abstract versions*}
   228 lemma numeral_0_eq_0 [simp]: "Numeral0 = (0::'a::number_ring)"
   235 lemma numeral_0_eq_0 [simp]: "Numeral0 = (0::'a::number_ring)"
   229 by (simp add: number_of_eq Bin_simps) 
   236 by (simp add: number_of_eq Bin_simps) 
   262 
   269 
   263 lemma number_of_Min: "number_of Numeral.Min = (- 1::'a::number_ring)"
   270 lemma number_of_Min: "number_of Numeral.Min = (- 1::'a::number_ring)"
   264 by (simp add: number_of_eq Bin_simps) 
   271 by (simp add: number_of_eq Bin_simps) 
   265 
   272 
   266 lemma number_of_BIT:
   273 lemma number_of_BIT:
   267      "number_of(w BIT x) = (if x then 1 else (0::'a::number_ring)) +
   274      "number_of(w BIT x) = (case x of bit.B0 => 0 | bit.B1 => (1::'a::number_ring)) +
   268 	                   (number_of w) + (number_of w)"
   275 	                   (number_of w) + (number_of w)"
   269 by (simp add: number_of_eq Bin_simps) 
   276 by (simp add: number_of_eq Bin_simps split: bit.split) 
   270 
   277 
   271 
   278 
   272 
   279 
   273 subsection{*Equality of Binary Numbers*}
   280 subsection{*Equality of Binary Numbers*}
   274 
   281 
   344 by (simp add: number_of_eq Ints_def) 
   351 by (simp add: number_of_eq Ints_def) 
   345 
   352 
   346 
   353 
   347 lemma iszero_number_of_BIT:
   354 lemma iszero_number_of_BIT:
   348      "iszero (number_of (w BIT x)::'a) = 
   355      "iszero (number_of (w BIT x)::'a) = 
   349       (~x & iszero (number_of w::'a::{ordered_idom,number_ring}))"
   356       (x=bit.B0 & iszero (number_of w::'a::{ordered_idom,number_ring}))"
   350 by (simp add: iszero_def number_of_eq Bin_simps double_eq_0_iff 
   357 by (simp add: iszero_def number_of_eq Bin_simps double_eq_0_iff 
   351               Ints_odd_nonzero Ints_def)
   358               Ints_odd_nonzero Ints_def split: bit.split)
   352 
   359 
   353 lemma iszero_number_of_0:
   360 lemma iszero_number_of_0:
   354      "iszero (number_of (w BIT False) :: 'a::{ordered_idom,number_ring}) = 
   361      "iszero (number_of (w BIT bit.B0) :: 'a::{ordered_idom,number_ring}) = 
   355       iszero (number_of w :: 'a)"
   362       iszero (number_of w :: 'a)"
   356 by (simp only: iszero_number_of_BIT simp_thms)
   363 by (simp only: iszero_number_of_BIT simp_thms)
   357 
   364 
   358 lemma iszero_number_of_1:
   365 lemma iszero_number_of_1:
   359      "~ iszero (number_of (w BIT True)::'a::{ordered_idom,number_ring})"
   366      "~ iszero (number_of (w BIT bit.B1)::'a::{ordered_idom,number_ring})"
   360 by (simp only: iszero_number_of_BIT simp_thms)
   367 by (simp add: iszero_number_of_BIT) 
   361 
       
   362 
   368 
   363 
   369 
   364 subsection{*The Less-Than Relation*}
   370 subsection{*The Less-Than Relation*}
   365 
   371 
   366 lemma less_number_of_eq_neg:
   372 lemma less_number_of_eq_neg:
   415 
   421 
   416 lemma neg_number_of_BIT:
   422 lemma neg_number_of_BIT:
   417      "neg (number_of (w BIT x)::'a) = 
   423      "neg (number_of (w BIT x)::'a) = 
   418       neg (number_of w :: 'a::{ordered_idom,number_ring})"
   424       neg (number_of w :: 'a::{ordered_idom,number_ring})"
   419 by (simp add: neg_def number_of_eq Bin_simps double_less_0_iff
   425 by (simp add: neg_def number_of_eq Bin_simps double_less_0_iff
   420               Ints_odd_less_0 Ints_def)
   426               Ints_odd_less_0 Ints_def split: bit.split)
   421 
   427 
   422 
   428 
   423 text{*Less-Than or Equals*}
   429 text{*Less-Than or Equals*}
   424 
   430 
   425 text{*Reduces @{term "a\<le>b"} to @{term "~ (b<a)"} for ALL numerals*}
   431 text{*Reduces @{term "a\<le>b"} to @{term "~ (b<a)"} for ALL numerals*}
   455        number_of_minus [symmetric] numeral_m1_eq_minus_1 [symmetric]
   461        number_of_minus [symmetric] numeral_m1_eq_minus_1 [symmetric]
   456        number_of_mult [symmetric]
   462        number_of_mult [symmetric]
   457        diff_number_of_eq abs_number_of 
   463        diff_number_of_eq abs_number_of 
   458 
   464 
   459 text{*For making a minimal simpset, one must include these default simprules.
   465 text{*For making a minimal simpset, one must include these default simprules.
   460   Also include @{text simp_thms} or at least @{term "(~False)=True"} *}
   466   Also include @{text simp_thms} *}
   461 lemmas bin_arith_simps = 
   467 lemmas bin_arith_simps = 
       
   468        Numeral.bit.distinct
   462        Pls_0_eq Min_1_eq
   469        Pls_0_eq Min_1_eq
   463        bin_pred_Pls bin_pred_Min bin_pred_1 bin_pred_0
   470        bin_pred_Pls bin_pred_Min bin_pred_1 bin_pred_0
   464        bin_succ_Pls bin_succ_Min bin_succ_1 bin_succ_0
   471        bin_succ_Pls bin_succ_Min bin_succ_1 bin_succ_0
   465        bin_add_Pls bin_add_Min bin_add_BIT_0 bin_add_BIT_10 bin_add_BIT_11
   472        bin_add_Pls bin_add_Min bin_add_BIT_0 bin_add_BIT_10 bin_add_BIT_11
   466        bin_minus_Pls bin_minus_Min bin_minus_1 bin_minus_0
   473        bin_minus_Pls bin_minus_Min bin_minus_1 bin_minus_0