doc-src/IsarAdvanced/Codegen/Thy/examples/tree.ML
author blanchet
Tue, 17 Feb 2009 14:01:54 +0100
changeset 29956 62f931b257b7
parent 28143 e5c6c4aac52c
permissions -rw-r--r--
Reintroduce set_interpreter for Collect and op :. I removed them by accident when removing old code that dealt with the "set" type. Incidentally, there is still some broken "set" code in Refute that should be fixed (see TODO in refute.ML).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     1
structure HOL = 
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     2
struct
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     3
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
     4
type 'a eq = {eq : 'a -> 'a -> bool};
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
     5
fun eq (A_:'a eq) = #eq A_;
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
     6
24193
926dde4d96de updated
haftmann
parents: 23850
diff changeset
     7
type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};
926dde4d96de updated
haftmann
parents: 23850
diff changeset
     8
fun less_eq (A_:'a ord) = #less_eq A_;
926dde4d96de updated
haftmann
parents: 23850
diff changeset
     9
fun less (A_:'a ord) = #less A_;
926dde4d96de updated
haftmann
parents: 23850
diff changeset
    10
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
    11
fun eqop A_ a = eq A_ a;
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
    12
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    13
end; (*struct HOL*)
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    14
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    15
structure Orderings = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    16
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    17
28052
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    18
type 'a preorder = {Orderings__ord_preorder : 'a HOL.ord};
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    19
fun ord_preorder (A_:'a preorder) = #Orderings__ord_preorder A_;
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    20
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    21
type 'a order = {Orderings__preorder_order : 'a preorder};
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    22
fun preorder_order (A_:'a order) = #Orderings__preorder_order A_;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    23
24193
926dde4d96de updated
haftmann
parents: 23850
diff changeset
    24
type 'a linorder = {Orderings__order_linorder : 'a order};
926dde4d96de updated
haftmann
parents: 23850
diff changeset
    25
fun order_linorder (A_:'a linorder) = #Orderings__order_linorder A_;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    26
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    27
end; (*struct Orderings*)
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    28
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    29
structure Nat = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    30
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    31
24421
acfb2413faa3 updated
haftmann
parents: 24193
diff changeset
    32
datatype nat = Suc of nat | Zero_nat;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    33
28143
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    34
fun eq_nat (Suc a) Zero_nat = false
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    35
  | eq_nat Zero_nat (Suc a) = false
27190
431f695fc865 updated generated file;
wenzelm
parents: 26513
diff changeset
    36
  | eq_nat (Suc nat) (Suc nat') = eq_nat nat nat'
28143
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    37
  | eq_nat Zero_nat Zero_nat = true;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    38
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
    39
val eq_nata = {eq = eq_nat} : nat HOL.eq;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    40
26318
967323f93c67 updated generated files;
wenzelm
parents: 25731
diff changeset
    41
fun less_nat m (Suc n) = less_eq_nat m n
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    42
  | less_nat n Zero_nat = false
26318
967323f93c67 updated generated files;
wenzelm
parents: 25731
diff changeset
    43
and less_eq_nat (Suc m) n = less_nat m n
967323f93c67 updated generated files;
wenzelm
parents: 25731
diff changeset
    44
  | less_eq_nat Zero_nat n = true;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    45
24193
926dde4d96de updated
haftmann
parents: 23850
diff changeset
    46
val ord_nat = {less_eq = less_eq_nat, less = less_nat} : nat HOL.ord;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    47
28052
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    48
val preorder_nat = {Orderings__ord_preorder = ord_nat} :
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    49
  nat Orderings.preorder;
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    50
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    51
val order_nat = {Orderings__preorder_order = preorder_nat} :
4dc09699cf93 updated
haftmann
parents: 27190
diff changeset
    52
  nat Orderings.order;
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    53
24193
926dde4d96de updated
haftmann
parents: 23850
diff changeset
    54
val linorder_nat = {Orderings__order_linorder = order_nat} :
23250
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    55
  nat Orderings.linorder;
9886802cbbd6 updated documentation
haftmann
parents: 23132
diff changeset
    56
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    57
end; (*struct Nat*)
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    58
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    59
structure Codegen = 
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    60
struct
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    61
24421
acfb2413faa3 updated
haftmann
parents: 24193
diff changeset
    62
datatype ('a, 'b) searchtree =
acfb2413faa3 updated
haftmann
parents: 24193
diff changeset
    63
  Branch of ('a, 'b) searchtree * 'a * ('a, 'b) searchtree |
acfb2413faa3 updated
haftmann
parents: 24193
diff changeset
    64
  Leaf of 'a * 'b;
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    65
28143
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    66
fun update (A1_, A2_) (it, entry) (Leaf (key, vala)) =
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    67
  (if HOL.eqop A1_ it key then Leaf (key, entry)
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    68
    else (if HOL.less_eq
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    69
               ((Orderings.ord_preorder o Orderings.preorder_order o
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    70
                  Orderings.order_linorder)
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    71
                 A2_)
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    72
               it key
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    73
           then Branch (Leaf (it, entry), it, Leaf (key, vala))
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    74
           else Branch (Leaf (key, vala), it, Leaf (it, entry))))
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    75
  | update (A1_, A2_) (it, entry) (Branch (t1, key, t2)) =
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    76
    (if HOL.less_eq
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    77
          ((Orderings.ord_preorder o Orderings.preorder_order o
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    78
             Orderings.order_linorder)
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    79
            A2_)
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    80
          it key
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    81
      then Branch (update (A1_, A2_) (it, entry) t1, key, t2)
e5c6c4aac52c different bookkeeping for code equations
haftmann
parents: 28052
diff changeset
    82
      else Branch (t1, key, update (A1_, A2_) (it, entry) t2));
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    83
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    84
val example : (Nat.nat, (Nat.nat list)) searchtree =
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
    85
  update (Nat.eq_nata, Nat.linorder_nat)
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    86
    (Nat.Suc (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))),
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    87
      [Nat.Suc (Nat.Suc Nat.Zero_nat), Nat.Suc (Nat.Suc Nat.Zero_nat)])
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
    88
    (update (Nat.eq_nata, Nat.linorder_nat)
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    89
      (Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat)),
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    90
        [Nat.Suc (Nat.Suc (Nat.Suc Nat.Zero_nat))])
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 26318
diff changeset
    91
      (update (Nat.eq_nata, Nat.linorder_nat)
23132
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    92
        (Nat.Suc (Nat.Suc Nat.Zero_nat), [Nat.Suc (Nat.Suc Nat.Zero_nat)])
ae52b82dc5d8 updated
haftmann
parents: 23107
diff changeset
    93
        (Leaf (Nat.Suc Nat.Zero_nat, []))));
22490
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    94
1822ec4fcecd added example file
haftmann
parents:
diff changeset
    95
end; (*struct Codegen*)