src/HOL/Num.thy
changeset 58410 6d46ad54a2ab
parent 58310 91ea607a34d8
child 58421 37cbbd8eb460
--- a/src/HOL/Num.thy	Sun Sep 21 16:56:06 2014 +0200
+++ b/src/HOL/Num.thy	Sun Sep 21 16:56:11 2014 +0200
@@ -280,31 +280,14 @@
 syntax
   "_Numeral" :: "num_const \<Rightarrow> 'a"    ("_")
 
+ML_file "Tools/numeral.ML"
+
 parse_translation {*
   let
-    fun num_of_int n =
-      if n > 0 then
-        (case IntInf.quotRem (n, 2) of
-          (0, 1) => Syntax.const @{const_syntax One}
-        | (n, 0) => Syntax.const @{const_syntax Bit0} $ num_of_int n
-        | (n, 1) => Syntax.const @{const_syntax Bit1} $ num_of_int n)
-      else raise Match
-    val numeral = Syntax.const @{const_syntax numeral}
-    val uminus = Syntax.const @{const_syntax uminus}
-    val one = Syntax.const @{const_syntax Groups.one}
-    val zero = Syntax.const @{const_syntax Groups.zero}
     fun numeral_tr [(c as Const (@{syntax_const "_constrain"}, _)) $ t $ u] =
           c $ numeral_tr [t] $ u
       | numeral_tr [Const (num, _)] =
-          let
-            val {value, ...} = Lexicon.read_xnum num;
-          in
-            if value = 0 then zero else
-            if value > 0
-            then numeral $ num_of_int value
-            else if value = ~1 then uminus $ one
-            else uminus $ (numeral $ num_of_int (~ value))
-          end
+          (Numeral.mk_number_syntax o #value o Lexicon.read_xnum) num
       | numeral_tr ts = raise TERM ("numeral_tr", ts);
   in [(@{syntax_const "_Numeral"}, K numeral_tr)] end
 *}
@@ -334,8 +317,6 @@
   end
 *}
 
-ML_file "Tools/numeral.ML"
-
 
 subsection {* Class-specific numeral rules *}