src/ZF/ex/Bin.thy
author lcp
Tue, 25 Apr 1995 11:14:03 +0200
changeset 1072 0140ff702b23
parent 935 a94ef3eed456
child 1155 928a16e02f9f
permissions -rw-r--r--
updated version
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
     1
(*  Title:      ZF/ex/Bin.thy
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
     2
    ID:         $Id$
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
     4
    Copyright   1994  University of Cambridge
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
     5
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
     6
Arithmetic on binary integers.
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
     7
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
     8
   The sign Plus stands for an infinite string of leading 0's.
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
     9
   The sign Minus stands for an infinite string of leading 1's.
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    10
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    11
A number can have multiple representations, namely leading 0's with sign
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    12
Plus and leading 1's with sign Minus.  See twos-compl.ML/int_of_binary for
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    13
the numerical interpretation.
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    14
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    15
The representation expects that (m mod 2) is 0 or 1, even if m is negative;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    16
For instance, ~5 div 2 = ~3 and ~5 mod 2 = 1; thus ~5 = (~3)*2 + 1
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    17
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    18
Division is not defined yet!
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    19
*)
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    20
935
a94ef3eed456 Changed Univ to Datatype in parents
lcp
parents: 905
diff changeset
    21
Bin = Integ + Datatype + "twos_compl" +
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    22
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    23
consts
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    24
  bin_rec          :: "[i, i, i, [i,i,i]=>i] => i"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    25
  integ_of_bin     :: "i=>i"
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    26
  norm_Bcons       :: "[i,i]=>i"
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    27
  bin_succ         :: "i=>i"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    28
  bin_pred         :: "i=>i"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    29
  bin_minus        :: "i=>i"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    30
  bin_add,bin_mult :: "[i,i]=>i"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    31
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    32
  bin              :: "i"
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    33
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    34
syntax
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    35
  "_Int"           :: "xnum => i"        ("_")
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    36
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    37
datatype
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    38
  "bin" = Plus
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    39
        | Minus
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    40
        | Bcons ("w: bin", "b: bool")
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    41
  type_intrs "[bool_into_univ]"
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    42
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    43
753
ec86863e87c8 replaced "rules" by "defs"
lcp
parents: 589
diff changeset
    44
defs
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    45
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    46
  bin_rec_def
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    47
      "bin_rec(z,a,b,h) == \
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    48
\      Vrec(z, %z g. bin_case(a, b, %w x. h(w, x, g`w), z))"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    49
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    50
  integ_of_bin_def
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    51
      "integ_of_bin(w) == bin_rec(w, $#0, $~($#1), %w x r. $#x $+ r $+ r)"
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    52
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    53
    (** recall that cond(1,b,c)=b and cond(0,b,c)=0 **)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    54
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    55
  (*norm_Bcons adds a bit, suppressing leading 0s and 1s*)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    56
  norm_Bcons_def
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    57
      "norm_Bcons(w,b) ==   \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    58
\       bin_case(cond(b,Bcons(w,b),w), cond(b,w,Bcons(w,b)),   \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    59
\                %w' x'. Bcons(w,b), w)"
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    60
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    61
  bin_succ_def
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    62
      "bin_succ(w0) ==   \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    63
\       bin_rec(w0, Bcons(Plus,1), Plus,   \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    64
\               %w x r. cond(x, Bcons(r,0), norm_Bcons(w,1)))"
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    65
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    66
  bin_pred_def
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    67
      "bin_pred(w0) == \
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    68
\       bin_rec(w0, Minus, Bcons(Minus,0),   \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    69
\               %w x r. cond(x, norm_Bcons(w,0), Bcons(r,1)))"
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    70
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    71
  bin_minus_def
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    72
      "bin_minus(w0) == \
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    73
\       bin_rec(w0, Plus, Bcons(Plus,1),   \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    74
\               %w x r. cond(x, bin_pred(Bcons(r,0)), Bcons(r,0)))"
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    75
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    76
  bin_add_def
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    77
      "bin_add(v0,w0) ==                        \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    78
\       bin_rec(v0,                             \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    79
\         lam w:bin. w,                 \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    80
\         lam w:bin. bin_pred(w),       \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    81
\         %v x r. lam w1:bin.           \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    82
\                  bin_rec(w1, Bcons(v,x), bin_pred(Bcons(v,x)),    \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    83
\                    %w y s. norm_Bcons(r`cond(x and y, bin_succ(w), w), \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    84
\                                          x xor y)))    ` w0"
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    85
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    86
  bin_mult_def
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    87
      "bin_mult(v0,w) ==                        \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    88
\       bin_rec(v0, Plus, bin_minus(w),         \
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    89
\         %v x r. cond(x, bin_add(norm_Bcons(r,0),w), norm_Bcons(r,0)))"
515
abcc438e7c27 installation of new inductive/datatype sections
lcp
parents:
diff changeset
    90
end
905
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    91
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    92
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    93
ML
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    94
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    95
(** Concrete syntax for integers **)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    96
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    97
local
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    98
  open Syntax;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
    99
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   100
  (* Bits *)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   101
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   102
  fun mk_bit 0 = const "0"
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   103
    | mk_bit 1 = const "succ" $ const "0"
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   104
    | mk_bit _ = sys_error "mk_bit";
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   105
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   106
  fun dest_bit (Const ("0", _)) = 0
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   107
    | dest_bit (Const ("succ", _) $ Const ("0", _)) = 1
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   108
    | dest_bit _ = raise Match;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   109
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   110
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   111
  (* Bit strings *)   (*we try to handle superfluous leading digits nicely*)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   112
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   113
  fun prefix_len _ [] = 0
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   114
    | prefix_len pred (x :: xs) =
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   115
        if pred x then 1 + prefix_len pred xs else 0;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   116
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   117
  fun mk_bin str =
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   118
    let
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   119
      val (sign, digs) =
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   120
        (case explode str of
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   121
          "#" :: "~" :: cs => (~1, cs)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   122
        | "#" :: cs => (1, cs)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   123
        | _ => raise ERROR);
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   124
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   125
      val zs = prefix_len (equal "0") digs;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   126
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   127
      fun bin_of 0 = replicate zs 0
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   128
        | bin_of ~1 = replicate zs 1 @ [~1]
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   129
        | bin_of n = (n mod 2) :: bin_of (n div 2);
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   130
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   131
      fun term_of [] = const "Plus"
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   132
        | term_of [~1] = const "Minus"
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   133
        | term_of (b :: bs) = const "Bcons" $ term_of bs $ mk_bit b;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   134
    in
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   135
      term_of (bin_of (sign * (#1 (scan_int digs))))
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   136
    end;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   137
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   138
  fun dest_bin tm =
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   139
    let
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   140
      fun bin_of (Const ("Plus", _)) = []
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   141
        | bin_of (Const ("Minus", _)) = [~1]
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   142
        | bin_of (Const ("Bcons", _) $ bs $ b) = dest_bit b :: bin_of bs
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   143
        | bin_of _ = raise Match;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   144
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   145
      fun int_of [] = 0
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   146
        | int_of (b :: bs) = b + 2 * int_of bs;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   147
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   148
      val rev_digs = bin_of tm;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   149
      val (sign, zs) =
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   150
        (case rev rev_digs of
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   151
          ~1 :: bs => ("~", prefix_len (equal 1) bs)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   152
        | bs => ("", prefix_len (equal 0) bs));
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   153
      val num = string_of_int (abs (int_of rev_digs));
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   154
    in
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   155
      "#" ^ sign ^ implode (replicate zs "0") ^ num
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   156
    end;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   157
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   158
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   159
  (* translation of integer constant tokens to and from binary *)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   160
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   161
  fun int_tr (*"_Int"*) [t as Free (str, _)] =
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   162
        (const "integ_of_bin" $
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   163
          (mk_bin str handle ERROR => raise_term "int_tr" [t]))
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   164
    | int_tr (*"_Int"*) ts = raise_term "int_tr" ts;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   165
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   166
  fun int_tr' (*"integ_of"*) [t] = const "_Int" $ free (dest_bin t)
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   167
    | int_tr' (*"integ_of"*) _ = raise Match;
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   168
in
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   169
  val parse_translation = [("_Int", int_tr)];
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   170
  val print_translation = [("integ_of_bin", int_tr')];
80b581036036 Added integer numerals (mostly due to Markus Wenzel)
lcp
parents: 753
diff changeset
   171
end;