doc-src/IsarAdvanced/Codegen/Thy/examples/tree.ML
author haftmann
Tue, 05 Jun 2007 15:16:11 +0200
changeset 23250 9886802cbbd6
parent 23132 ae52b82dc5d8
child 23850 f1434532a562
permissions -rw-r--r--
updated documentation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
     1
structure ROOT = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
     2
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
     3
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     4
structure HOL = 
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     5
struct
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     6
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     7
type 'a eq = {eq : 'a -> 'a -> bool};
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     8
fun eq (A_:'a eq) = #eq A_;
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     9
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    10
end; (*struct HOL*)
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    11
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    12
structure Orderings = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    13
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    14
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    15
type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    16
fun less_eq (A_:'a ord) = #less_eq A_;
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    17
fun less (A_:'a ord) = #less A_;
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    18
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    19
type 'a order = {Orderings__order_ord : 'a ord};
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    20
fun order_ord (A_:'a order) = #Orderings__order_ord A_;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    21
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    22
type 'a linorder = {Orderings__linorder_order : 'a order};
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    23
fun linorder_order (A_:'a linorder) = #Orderings__linorder_order A_;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    24
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    25
end; (*struct Orderings*)
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    26
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    27
structure Nat = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    28
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    29
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    30
datatype nat = Zero_nat | Suc of nat;
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    31
23107
0c3c55b7c98f *** empty log message ***
haftmann
parents: 22798
diff changeset
    32
fun eq_nat Zero_nat (Suc m) = false
0c3c55b7c98f *** empty log message ***
haftmann
parents: 22798
diff changeset
    33
  | eq_nat (Suc n) Zero_nat = false
0c3c55b7c98f *** empty log message ***
haftmann
parents: 22798
diff changeset
    34
  | eq_nat (Suc n) (Suc m) = eq_nat n m
0c3c55b7c98f *** empty log message ***
haftmann
parents: 22798
diff changeset
    35
  | eq_nat Zero_nat Zero_nat = true;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    36
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    37
val eq_nata = {eq = eq_nat} : nat HOL.eq;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    38
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    39
fun less_nat n (Suc m) = less_eq_nat n m
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    40
  | less_nat n Zero_nat = false
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    41
and less_eq_nat (Suc n) m = less_nat n m
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    42
  | less_eq_nat Zero_nat m = true;
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    43
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    44
val ord_nat = {less_eq = less_eq_nat, less = less_nat} :
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    45
  nat Orderings.ord;
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    46
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    47
val order_nat = {Orderings__order_ord = ord_nat} : nat Orderings.order;
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    48
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    49
val linorder_nat = {Orderings__linorder_order = order_nat} :
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    50
  nat Orderings.linorder;
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    51
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    52
end; (*struct Nat*)
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    53
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    54
structure Codegen = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    55
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    56
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    57
datatype ('a, 'b) searchtree = Leaf of 'a * 'b |
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    58
  Branch of ('a, 'b) searchtree * 'a * ('a, 'b) searchtree;
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    59
22798
e3962371f568 updated doc
haftmann
parents: 22490
diff changeset
    60
fun update (C1_, C2_) (it, entry) (Branch (t1, key, t2)) =
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    61
  (if Orderings.less_eq
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    62
        ((Orderings.order_ord o Orderings.linorder_order) C2_) it key
22798
e3962371f568 updated doc
haftmann
parents: 22490
diff changeset
    63
    then Branch (update (C1_, C2_) (it, entry) t1, key, t2)
e3962371f568 updated doc
haftmann
parents: 22490
diff changeset
    64
    else Branch (t1, key, update (C1_, C2_) (it, entry) t2))
e3962371f568 updated doc
haftmann
parents: 22490
diff changeset
    65
  | update (C1_, C2_) (it, entry) (Leaf (key, vala)) =
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    66
    (if HOL.eq C1_ it key then Leaf (key, entry)
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    67
      else (if Orderings.less_eq
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    68
                 ((Orderings.order_ord o Orderings.linorder_order) C2_) it
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    69
                 key
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    70
             then Branch (Leaf (it, entry), it, Leaf (key, vala))
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    71
             else Branch (Leaf (key, vala), it, Leaf (it, entry))));
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    72
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    73
val example : (Nat.nat, (Nat.nat list)) searchtree =
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    74
  update (Nat.eq_nata, Nat.linorder_nat)
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    75
    (Nat.Suc (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))),
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    76
      [Nat.Suc (Nat.Suc Nat.Zero_nat), Nat.Suc (Nat.Suc Nat.Zero_nat)])
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    77
    (update (Nat.eq_nata, Nat.linorder_nat)
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    78
      (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat)),
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    79
        [Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))])
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    80
      (update (Nat.eq_nata, Nat.linorder_nat)
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    81
        (Nat.Suc (Nat.Suc Nat.Zero_nat), [Nat.Suc (Nat.Suc Nat.Zero_nat)])
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    82
        (Leaf (Nat.Suc Nat.Zero_nat, []))));
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    83
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    84
end; (*struct Codegen*)
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    85
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    86
end; (*struct ROOT*)