src/HOL/Num.thy
changeset 52143 36ffe23b25f8
parent 51143 0a2371e7ced3
child 52187 1f7b3aadec69
--- a/src/HOL/Num.thy	Sat May 25 15:00:53 2013 +0200
+++ b/src/HOL/Num.thy	Sat May 25 15:37:53 2013 +0200
@@ -291,50 +291,54 @@
   "_Numeral" :: "num_const \<Rightarrow> 'a"    ("_")
 
 parse_translation {*
-let
-  fun num_of_int n = if n > 0 then case IntInf.quotRem (n, 2)
-     of (0, 1) => Syntax.const @{const_name One}
-      | (n, 0) => Syntax.const @{const_name Bit0} $ num_of_int n
-      | (n, 1) => Syntax.const @{const_name Bit1} $ num_of_int n
-    else raise Match;
-  val pos = Syntax.const @{const_name numeral}
-  val neg = Syntax.const @{const_name neg_numeral}
-  val one = Syntax.const @{const_name Groups.one}
-  val zero = Syntax.const @{const_name 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 pos $ num_of_int value
-          else neg $ num_of_int (~value)
-        end
-    | numeral_tr ts = raise TERM ("numeral_tr", ts);
-in [("_Numeral", numeral_tr)] end
+  let
+    fun num_of_int n =
+      if n > 0 then
+        (case IntInf.quotRem (n, 2) of
+          (0, 1) => Syntax.const @{const_name One}
+        | (n, 0) => Syntax.const @{const_name Bit0} $ num_of_int n
+        | (n, 1) => Syntax.const @{const_name Bit1} $ num_of_int n)
+      else raise Match
+    val pos = Syntax.const @{const_name numeral}
+    val neg = Syntax.const @{const_name neg_numeral}
+    val one = Syntax.const @{const_name Groups.one}
+    val zero = Syntax.const @{const_name 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 pos $ num_of_int value
+            else neg $ num_of_int (~value)
+          end
+      | numeral_tr ts = raise TERM ("numeral_tr", ts);
+  in [("_Numeral", K numeral_tr)] end
 *}
 
-typed_print_translation (advanced) {*
-let
-  fun dest_num (Const (@{const_syntax Bit0}, _) $ n) = 2 * dest_num n
-    | dest_num (Const (@{const_syntax Bit1}, _) $ n) = 2 * dest_num n + 1
-    | dest_num (Const (@{const_syntax One}, _)) = 1;
-  fun num_tr' sign ctxt T [n] =
-    let
-      val k = dest_num n;
-      val t' = Syntax.const @{syntax_const "_Numeral"} $
-        Syntax.free (sign ^ string_of_int k);
-    in
-      case T of
-        Type (@{type_name fun}, [_, T']) =>
-          if not (Printer.show_type_constraint ctxt) andalso can Term.dest_Type T' then t'
-          else Syntax.const @{syntax_const "_constrain"} $ t' $ Syntax_Phases.term_of_typ ctxt T'
-      | T' => if T' = dummyT then t' else raise Match
-    end;
-in [(@{const_syntax numeral}, num_tr' ""),
-    (@{const_syntax neg_numeral}, num_tr' "-")] end
+typed_print_translation {*
+  let
+    fun dest_num (Const (@{const_syntax Bit0}, _) $ n) = 2 * dest_num n
+      | dest_num (Const (@{const_syntax Bit1}, _) $ n) = 2 * dest_num n + 1
+      | dest_num (Const (@{const_syntax One}, _)) = 1;
+    fun num_tr' sign ctxt T [n] =
+      let
+        val k = dest_num n;
+        val t' = Syntax.const @{syntax_const "_Numeral"} $
+          Syntax.free (sign ^ string_of_int k);
+      in
+        (case T of
+          Type (@{type_name fun}, [_, T']) =>
+            if not (Printer.show_type_constraint ctxt) andalso can Term.dest_Type T' then t'
+            else Syntax.const @{syntax_const "_constrain"} $ t' $ Syntax_Phases.term_of_typ ctxt T'
+        | T' => if T' = dummyT then t' else raise Match)
+      end;
+  in
+   [(@{const_syntax numeral}, num_tr' ""),
+    (@{const_syntax neg_numeral}, num_tr' "-")]
+  end
 *}
 
 ML_file "Tools/numeral.ML"