equal
deleted
inserted
replaced
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 |