src/HOL/ex/Numeral.thy
changeset 35113 1a0c129bb2e0
parent 35028 108662d50512
child 35363 09489d8ffece
equal deleted inserted replaced
35112:ff6f60e6ab85 35113:1a0c129bb2e0
   309           val {leading_zeros, value, ...} = Syntax.read_xnum num;
   309           val {leading_zeros, value, ...} = Syntax.read_xnum num;
   310           val _ = leading_zeros = 0 andalso value > 0
   310           val _ = leading_zeros = 0 andalso value > 0
   311             orelse error ("Bad numeral: " ^ num);
   311             orelse error ("Bad numeral: " ^ num);
   312         in Const (@{const_name of_num}, @{typ num} --> dummyT) $ num_of_int value end
   312         in Const (@{const_name of_num}, @{typ num} --> dummyT) $ num_of_int value end
   313     | numeral_tr ts = raise TERM ("numeral_tr", ts);
   313     | numeral_tr ts = raise TERM ("numeral_tr", ts);
   314 in [("_Numerals", numeral_tr)] end
   314 in [(@{syntax_const "_Numerals"}, numeral_tr)] end
   315 *}
   315 *}
   316 
   316 
   317 typed_print_translation {*
   317 typed_print_translation {*
   318 let
   318 let
   319   fun dig b n = b + 2 * n; 
   319   fun dig b n = b + 2 * n; 
   323         dig 1 (int_of_num' n)
   323         dig 1 (int_of_num' n)
   324     | int_of_num' (Const (@{const_syntax One}, _)) = 1;
   324     | int_of_num' (Const (@{const_syntax One}, _)) = 1;
   325   fun num_tr' show_sorts T [n] =
   325   fun num_tr' show_sorts T [n] =
   326     let
   326     let
   327       val k = int_of_num' n;
   327       val k = int_of_num' n;
   328       val t' = Syntax.const "_Numerals" $ Syntax.free ("#" ^ string_of_int k);
   328       val t' = Syntax.const @{syntax_const "_Numerals"} $ Syntax.free ("#" ^ string_of_int k);
   329     in case T
   329     in case T
   330      of Type ("fun", [_, T']) =>
   330      of Type ("fun", [_, T']) =>  (* FIXME @{type_syntax} *)
   331          if not (! show_types) andalso can Term.dest_Type T' then t'
   331          if not (! show_types) andalso can Term.dest_Type T' then t'
   332          else Syntax.const Syntax.constrainC $ t' $ Syntax.term_of_typ show_sorts T'
   332          else Syntax.const Syntax.constrainC $ t' $ Syntax.term_of_typ show_sorts T'
   333       | T' => if T' = dummyT then t' else raise Match
   333       | T' => if T' = dummyT then t' else raise Match
   334     end;
   334     end;
   335 in [(@{const_syntax of_num}, num_tr')] end
   335 in [(@{const_syntax of_num}, num_tr')] end