| 
23250
 | 
     1  | 
structure HOL = 
  | 
| 
 | 
     2  | 
struct
  | 
| 
 | 
     3  | 
  | 
| 
26513
 | 
     4  | 
type 'a eq = {eq : 'a -> 'a -> bool};
 | 
| 
 | 
     5  | 
fun eq (A_:'a eq) = #eq A_;
  | 
| 
23250
 | 
     6  | 
  | 
| 
24193
 | 
     7  | 
type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};
 | 
| 
 | 
     8  | 
fun less_eq (A_:'a ord) = #less_eq A_;
  | 
| 
 | 
     9  | 
fun less (A_:'a ord) = #less A_;
  | 
| 
 | 
    10  | 
  | 
| 
26513
 | 
    11  | 
fun eqop A_ a = eq A_ a;
  | 
| 
 | 
    12  | 
  | 
| 
23250
 | 
    13  | 
end; (*struct HOL*)
  | 
| 
 | 
    14  | 
  | 
| 
22490
 | 
    15  | 
structure Orderings = 
  | 
| 
 | 
    16  | 
struct
  | 
| 
 | 
    17  | 
  | 
| 
28052
 | 
    18  | 
type 'a preorder = {Orderings__ord_preorder : 'a HOL.ord};
 | 
| 
 | 
    19  | 
fun ord_preorder (A_:'a preorder) = #Orderings__ord_preorder A_;
  | 
| 
 | 
    20  | 
  | 
| 
 | 
    21  | 
type 'a order = {Orderings__preorder_order : 'a preorder};
 | 
| 
 | 
    22  | 
fun preorder_order (A_:'a order) = #Orderings__preorder_order A_;
  | 
| 
22490
 | 
    23  | 
  | 
| 
24193
 | 
    24  | 
type 'a linorder = {Orderings__order_linorder : 'a order};
 | 
| 
 | 
    25  | 
fun order_linorder (A_:'a linorder) = #Orderings__order_linorder A_;
  | 
| 
22490
 | 
    26  | 
  | 
| 
23250
 | 
    27  | 
end; (*struct Orderings*)
  | 
| 
22490
 | 
    28  | 
  | 
| 
 | 
    29  | 
structure Nat = 
  | 
| 
 | 
    30  | 
struct
  | 
| 
 | 
    31  | 
  | 
| 
24421
 | 
    32  | 
datatype nat = Suc of nat | Zero_nat;
  | 
| 
22490
 | 
    33  | 
  | 
| 
28143
 | 
    34  | 
fun eq_nat (Suc a) Zero_nat = false
  | 
| 
 | 
    35  | 
  | eq_nat Zero_nat (Suc a) = false
  | 
| 
27190
 | 
    36  | 
  | eq_nat (Suc nat) (Suc nat') = eq_nat nat nat'
  | 
| 
28143
 | 
    37  | 
  | eq_nat Zero_nat Zero_nat = true;
  | 
| 
22490
 | 
    38  | 
  | 
| 
26513
 | 
    39  | 
val eq_nata = {eq = eq_nat} : nat HOL.eq;
 | 
| 
22490
 | 
    40  | 
  | 
| 
26318
 | 
    41  | 
fun less_nat m (Suc n) = less_eq_nat m n
  | 
| 
22490
 | 
    42  | 
  | less_nat n Zero_nat = false
  | 
| 
26318
 | 
    43  | 
and less_eq_nat (Suc m) n = less_nat m n
  | 
| 
 | 
    44  | 
  | less_eq_nat Zero_nat n = true;
  | 
| 
22490
 | 
    45  | 
  | 
| 
24193
 | 
    46  | 
val ord_nat = {less_eq = less_eq_nat, less = less_nat} : nat HOL.ord;
 | 
| 
22490
 | 
    47  | 
  | 
| 
28052
 | 
    48  | 
val preorder_nat = {Orderings__ord_preorder = ord_nat} :
 | 
| 
 | 
    49  | 
  nat Orderings.preorder;
  | 
| 
 | 
    50  | 
  | 
| 
 | 
    51  | 
val order_nat = {Orderings__preorder_order = preorder_nat} :
 | 
| 
 | 
    52  | 
  nat Orderings.order;
  | 
| 
23250
 | 
    53  | 
  | 
| 
24193
 | 
    54  | 
val linorder_nat = {Orderings__order_linorder = order_nat} :
 | 
| 
23250
 | 
    55  | 
  nat Orderings.linorder;
  | 
| 
 | 
    56  | 
  | 
| 
22490
 | 
    57  | 
end; (*struct Nat*)
  | 
| 
 | 
    58  | 
  | 
| 
 | 
    59  | 
structure Codegen = 
  | 
| 
 | 
    60  | 
struct
  | 
| 
 | 
    61  | 
  | 
| 
24421
 | 
    62  | 
datatype ('a, 'b) searchtree =
 | 
| 
 | 
    63  | 
  Branch of ('a, 'b) searchtree * 'a * ('a, 'b) searchtree |
 | 
| 
 | 
    64  | 
  Leaf of 'a * 'b;
  | 
| 
22490
 | 
    65  | 
  | 
| 
28143
 | 
    66  | 
fun update (A1_, A2_) (it, entry) (Leaf (key, vala)) =
  | 
| 
 | 
    67  | 
  (if HOL.eqop A1_ it key then Leaf (key, entry)
  | 
| 
 | 
    68  | 
    else (if HOL.less_eq
  | 
| 
 | 
    69  | 
               ((Orderings.ord_preorder o Orderings.preorder_order o
  | 
| 
 | 
    70  | 
                  Orderings.order_linorder)
  | 
| 
 | 
    71  | 
                 A2_)
  | 
| 
 | 
    72  | 
               it key
  | 
| 
 | 
    73  | 
           then Branch (Leaf (it, entry), it, Leaf (key, vala))
  | 
| 
 | 
    74  | 
           else Branch (Leaf (key, vala), it, Leaf (it, entry))))
  | 
| 
 | 
    75  | 
  | update (A1_, A2_) (it, entry) (Branch (t1, key, t2)) =
  | 
| 
 | 
    76  | 
    (if HOL.less_eq
  | 
| 
 | 
    77  | 
          ((Orderings.ord_preorder o Orderings.preorder_order o
  | 
| 
 | 
    78  | 
             Orderings.order_linorder)
  | 
| 
 | 
    79  | 
            A2_)
  | 
| 
 | 
    80  | 
          it key
  | 
| 
 | 
    81  | 
      then Branch (update (A1_, A2_) (it, entry) t1, key, t2)
  | 
| 
 | 
    82  | 
      else Branch (t1, key, update (A1_, A2_) (it, entry) t2));
  | 
| 
22490
 | 
    83  | 
  | 
| 
23132
 | 
    84  | 
val example : (Nat.nat, (Nat.nat list)) searchtree =
  | 
| 
26513
 | 
    85  | 
  update (Nat.eq_nata, Nat.linorder_nat)
  | 
| 
23132
 | 
    86  | 
    (Nat.Suc (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))),
  | 
| 
 | 
    87  | 
      [Nat.Suc (Nat.Suc Nat.Zero_nat), Nat.Suc (Nat.Suc Nat.Zero_nat)])
  | 
| 
26513
 | 
    88  | 
    (update (Nat.eq_nata, Nat.linorder_nat)
  | 
| 
23132
 | 
    89  | 
      (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat)),
  | 
| 
 | 
    90  | 
        [Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))])
  | 
| 
26513
 | 
    91  | 
      (update (Nat.eq_nata, Nat.linorder_nat)
  | 
| 
23132
 | 
    92  | 
        (Nat.Suc (Nat.Suc Nat.Zero_nat), [Nat.Suc (Nat.Suc Nat.Zero_nat)])
  | 
| 
 | 
    93  | 
        (Leaf (Nat.Suc Nat.Zero_nat, []))));
  | 
| 
22490
 | 
    94  | 
  | 
| 
 | 
    95  | 
end; (*struct Codegen*)
  |