| 23250 |      1 | structure HOL = 
 | 
|  |      2 | struct
 | 
|  |      3 | 
 | 
|  |      4 | type 'a eq = {eq : 'a -> 'a -> bool};
 | 
|  |      5 | fun eq (A_:'a eq) = #eq A_;
 | 
|  |      6 | 
 | 
|  |      7 | end; (*struct HOL*)
 | 
|  |      8 | 
 | 
| 22490 |      9 | structure Orderings = 
 | 
|  |     10 | struct
 | 
|  |     11 | 
 | 
|  |     12 | type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};
 | 
|  |     13 | fun less_eq (A_:'a ord) = #less_eq A_;
 | 
|  |     14 | fun less (A_:'a ord) = #less A_;
 | 
|  |     15 | 
 | 
| 23250 |     16 | type 'a order = {Orderings__order_ord : 'a ord};
 | 
|  |     17 | fun order_ord (A_:'a order) = #Orderings__order_ord A_;
 | 
| 22490 |     18 | 
 | 
| 23250 |     19 | type 'a linorder = {Orderings__linorder_order : 'a order};
 | 
|  |     20 | fun linorder_order (A_:'a linorder) = #Orderings__linorder_order A_;
 | 
| 22490 |     21 | 
 | 
| 23250 |     22 | end; (*struct Orderings*)
 | 
| 22490 |     23 | 
 | 
|  |     24 | structure Nat = 
 | 
|  |     25 | struct
 | 
|  |     26 | 
 | 
|  |     27 | datatype nat = Zero_nat | Suc of nat;
 | 
|  |     28 | 
 | 
| 23107 |     29 | fun eq_nat Zero_nat (Suc m) = false
 | 
|  |     30 |   | eq_nat (Suc n) Zero_nat = false
 | 
|  |     31 |   | eq_nat (Suc n) (Suc m) = eq_nat n m
 | 
|  |     32 |   | eq_nat Zero_nat Zero_nat = true;
 | 
| 22490 |     33 | 
 | 
| 23250 |     34 | val eq_nata = {eq = eq_nat} : nat HOL.eq;
 | 
| 22490 |     35 | 
 | 
|  |     36 | fun less_nat n (Suc m) = less_eq_nat n m
 | 
|  |     37 |   | less_nat n Zero_nat = false
 | 
|  |     38 | and less_eq_nat (Suc n) m = less_nat n m
 | 
|  |     39 |   | less_eq_nat Zero_nat m = true;
 | 
|  |     40 | 
 | 
|  |     41 | val ord_nat = {less_eq = less_eq_nat, less = less_nat} :
 | 
|  |     42 |   nat Orderings.ord;
 | 
|  |     43 | 
 | 
| 23250 |     44 | val order_nat = {Orderings__order_ord = ord_nat} : nat Orderings.order;
 | 
|  |     45 | 
 | 
|  |     46 | val linorder_nat = {Orderings__linorder_order = order_nat} :
 | 
|  |     47 |   nat Orderings.linorder;
 | 
|  |     48 | 
 | 
| 22490 |     49 | end; (*struct Nat*)
 | 
|  |     50 | 
 | 
|  |     51 | structure Codegen = 
 | 
|  |     52 | struct
 | 
|  |     53 | 
 | 
|  |     54 | datatype ('a, 'b) searchtree = Leaf of 'a * 'b |
 | 
|  |     55 |   Branch of ('a, 'b) searchtree * 'a * ('a, 'b) searchtree;
 | 
|  |     56 | 
 | 
| 22798 |     57 | fun update (C1_, C2_) (it, entry) (Branch (t1, key, t2)) =
 | 
| 23250 |     58 |   (if Orderings.less_eq
 | 
|  |     59 |         ((Orderings.order_ord o Orderings.linorder_order) C2_) it key
 | 
| 22798 |     60 |     then Branch (update (C1_, C2_) (it, entry) t1, key, t2)
 | 
|  |     61 |     else Branch (t1, key, update (C1_, C2_) (it, entry) t2))
 | 
|  |     62 |   | update (C1_, C2_) (it, entry) (Leaf (key, vala)) =
 | 
| 23250 |     63 |     (if HOL.eq C1_ it key then Leaf (key, entry)
 | 
|  |     64 |       else (if Orderings.less_eq
 | 
|  |     65 |                  ((Orderings.order_ord o Orderings.linorder_order) C2_) it
 | 
|  |     66 |                  key
 | 
| 22490 |     67 |              then Branch (Leaf (it, entry), it, Leaf (key, vala))
 | 
|  |     68 |              else Branch (Leaf (key, vala), it, Leaf (it, entry))));
 | 
|  |     69 | 
 | 
| 23132 |     70 | val example : (Nat.nat, (Nat.nat list)) searchtree =
 | 
| 23250 |     71 |   update (Nat.eq_nata, Nat.linorder_nat)
 | 
| 23132 |     72 |     (Nat.Suc (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))),
 | 
|  |     73 |       [Nat.Suc (Nat.Suc Nat.Zero_nat), Nat.Suc (Nat.Suc Nat.Zero_nat)])
 | 
| 23250 |     74 |     (update (Nat.eq_nata, Nat.linorder_nat)
 | 
| 23132 |     75 |       (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat)),
 | 
|  |     76 |         [Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))])
 | 
| 23250 |     77 |       (update (Nat.eq_nata, Nat.linorder_nat)
 | 
| 23132 |     78 |         (Nat.Suc (Nat.Suc Nat.Zero_nat), [Nat.Suc (Nat.Suc Nat.Zero_nat)])
 | 
|  |     79 |         (Leaf (Nat.Suc Nat.Zero_nat, []))));
 | 
| 22490 |     80 | 
 | 
|  |     81 | end; (*struct Codegen*)
 |