| 
21190
 | 
     1  | 
structure ROOT = 
  | 
| 
 | 
     2  | 
struct
  | 
| 
 | 
     3  | 
  | 
| 
 | 
     4  | 
structure Nat = 
  | 
| 
 | 
     5  | 
struct
  | 
| 
 | 
     6  | 
  | 
| 
 | 
     7  | 
datatype nat = Zero_nat | Suc of nat;
  | 
| 
 | 
     8  | 
  | 
| 
 | 
     9  | 
end; (*struct Nat*)
  | 
| 
 | 
    10  | 
  | 
| 
22386
 | 
    11  | 
structure Integer = 
  | 
| 
 | 
    12  | 
struct
  | 
| 
 | 
    13  | 
  | 
| 
22798
 | 
    14  | 
datatype bit = B0 | B1;
  | 
| 
 | 
    15  | 
  | 
| 
 | 
    16  | 
datatype int = Pls | Min | Bit of int * bit | Number_of_int of int;
  | 
| 
 | 
    17  | 
  | 
| 
 | 
    18  | 
fun pred (Bit (k, B0)) = Bit (pred k, B1)
  | 
| 
 | 
    19  | 
  | pred (Bit (k, B1)) = Bit (k, B0)
  | 
| 
 | 
    20  | 
  | pred Min = Bit (Min, B0)
  | 
| 
 | 
    21  | 
  | pred Pls = Min;
  | 
| 
 | 
    22  | 
  | 
| 
 | 
    23  | 
fun uminus_int (Number_of_int w) = Number_of_int (uminus_int w)
  | 
| 
 | 
    24  | 
  | uminus_int (Bit (k, B0)) = Bit (uminus_int k, B0)
  | 
| 
 | 
    25  | 
  | uminus_int (Bit (k, B1)) = Bit (pred (uminus_int k), B1)
  | 
| 
 | 
    26  | 
  | uminus_int Min = Bit (Pls, B1)
  | 
| 
 | 
    27  | 
  | uminus_int Pls = Pls;
  | 
| 
 | 
    28  | 
  | 
| 
 | 
    29  | 
fun succ (Bit (k, B0)) = Bit (k, B1)
  | 
| 
 | 
    30  | 
  | succ (Bit (k, B1)) = Bit (succ k, B0)
  | 
| 
 | 
    31  | 
  | succ Min = Pls
  | 
| 
 | 
    32  | 
  | succ Pls = Bit (Pls, B1);
  | 
| 
 | 
    33  | 
  | 
| 
 | 
    34  | 
fun plus_int (Number_of_int v) (Number_of_int w) =
  | 
| 
 | 
    35  | 
  Number_of_int (plus_int v w)
  | 
| 
 | 
    36  | 
  | plus_int k Min = pred k
  | 
| 
 | 
    37  | 
  | plus_int k Pls = k
  | 
| 
 | 
    38  | 
  | plus_int (Bit (k, B1)) (Bit (l, B1)) = Bit (plus_int k (succ l), B0)
  | 
| 
 | 
    39  | 
  | plus_int (Bit (k, B1)) (Bit (l, B0)) = Bit (plus_int k l, B1)
  | 
| 
 | 
    40  | 
  | plus_int (Bit (k, B0)) (Bit (l, b)) = Bit (plus_int k l, b)
  | 
| 
 | 
    41  | 
  | plus_int Min k = pred k
  | 
| 
 | 
    42  | 
  | plus_int Pls k = k;
  | 
| 
 | 
    43  | 
  | 
| 
 | 
    44  | 
fun minus_int (Number_of_int v) (Number_of_int w) =
  | 
| 
 | 
    45  | 
  Number_of_int (plus_int v (uminus_int w))
  | 
| 
 | 
    46  | 
  | minus_int z w = plus_int z (uminus_int w);
  | 
| 
 | 
    47  | 
  | 
| 
 | 
    48  | 
fun less_eq_int (Number_of_int k) (Number_of_int l) = less_eq_int k l
  | 
| 
 | 
    49  | 
  | less_eq_int (Bit (k1, B1)) (Bit (k2, B0)) = less_int k1 k2
  | 
| 
 | 
    50  | 
  | less_eq_int (Bit (k1, v)) (Bit (k2, B1)) = less_eq_int k1 k2
  | 
| 
 | 
    51  | 
  | less_eq_int (Bit (k1, B0)) (Bit (k2, v)) = less_eq_int k1 k2
  | 
| 
 | 
    52  | 
  | less_eq_int (Bit (k, v)) Min = less_eq_int k Min
  | 
| 
 | 
    53  | 
  | less_eq_int (Bit (k, B1)) Pls = less_int k Pls
  | 
| 
 | 
    54  | 
  | less_eq_int (Bit (k, B0)) Pls = less_eq_int k Pls
  | 
| 
 | 
    55  | 
  | less_eq_int Min (Bit (k, B1)) = less_eq_int Min k
  | 
| 
 | 
    56  | 
  | less_eq_int Min (Bit (k, B0)) = less_int Min k
  | 
| 
 | 
    57  | 
  | less_eq_int Min Min = true
  | 
| 
 | 
    58  | 
  | less_eq_int Min Pls = true
  | 
| 
 | 
    59  | 
  | less_eq_int Pls (Bit (k, v)) = less_eq_int Pls k
  | 
| 
 | 
    60  | 
  | less_eq_int Pls Min = false
  | 
| 
 | 
    61  | 
  | less_eq_int Pls Pls = true
  | 
| 
 | 
    62  | 
and less_int (Number_of_int k) (Number_of_int l) = less_int k l
  | 
| 
 | 
    63  | 
  | less_int (Bit (k1, B0)) (Bit (k2, B1)) = less_eq_int k1 k2
  | 
| 
 | 
    64  | 
  | less_int (Bit (k1, B1)) (Bit (k2, v)) = less_int k1 k2
  | 
| 
 | 
    65  | 
  | less_int (Bit (k1, v)) (Bit (k2, B0)) = less_int k1 k2
  | 
| 
 | 
    66  | 
  | less_int (Bit (k, B1)) Min = less_int k Min
  | 
| 
 | 
    67  | 
  | less_int (Bit (k, B0)) Min = less_eq_int k Min
  | 
| 
 | 
    68  | 
  | less_int (Bit (k, v)) Pls = less_int k Pls
  | 
| 
 | 
    69  | 
  | less_int Min (Bit (k, v)) = less_int Min k
  | 
| 
 | 
    70  | 
  | less_int Min Min = false
  | 
| 
 | 
    71  | 
  | less_int Min Pls = true
  | 
| 
 | 
    72  | 
  | less_int Pls (Bit (k, B1)) = less_eq_int Pls k
  | 
| 
 | 
    73  | 
  | less_int Pls (Bit (k, B0)) = less_int Pls k
  | 
| 
 | 
    74  | 
  | less_int Pls Min = false
  | 
| 
 | 
    75  | 
  | less_int Pls Pls = false;
  | 
| 
 | 
    76  | 
  | 
| 
22386
 | 
    77  | 
fun nat_aux n i =
  | 
| 
22798
 | 
    78  | 
  (if less_eq_int i (Number_of_int Pls) then n
  | 
| 
 | 
    79  | 
    else nat_aux (Nat.Suc n)
  | 
| 
 | 
    80  | 
           (minus_int i (Number_of_int (Bit (Pls, B1)))));
  | 
| 
22386
 | 
    81  | 
  | 
| 
 | 
    82  | 
fun nat i = nat_aux Nat.Zero_nat i;
  | 
| 
 | 
    83  | 
  | 
| 
 | 
    84  | 
end; (*struct Integer*)
  | 
| 
 | 
    85  | 
  | 
| 
21190
 | 
    86  | 
structure Codegen = 
  | 
| 
 | 
    87  | 
struct
  | 
| 
 | 
    88  | 
  | 
| 
22015
 | 
    89  | 
val dummy_set : (Nat.nat -> Nat.nat) list = Nat.Suc :: [];
  | 
| 
21190
 | 
    90  | 
  | 
| 
 | 
    91  | 
val foobar_set : Nat.nat list =
  | 
| 
22015
 | 
    92  | 
  Nat.Zero_nat ::
  | 
| 
22798
 | 
    93  | 
    (Nat.Suc Nat.Zero_nat ::
  | 
| 
 | 
    94  | 
      (Integer.nat
  | 
| 
 | 
    95  | 
         (Integer.Number_of_int
  | 
| 
 | 
    96  | 
           (Integer.Bit
  | 
| 
 | 
    97  | 
             (Integer.Bit (Integer.Pls, Integer.B1), Integer.B0)))
  | 
| 
 | 
    98  | 
        :: []));
  | 
| 
21190
 | 
    99  | 
  | 
| 
 | 
   100  | 
end; (*struct Codegen*)
  | 
| 
 | 
   101  | 
  | 
| 
 | 
   102  | 
end; (*struct ROOT*)
  |