doc-src/Codegen/Thy/examples/dirty_set.ML
author haftmann
Tue, 03 Mar 2009 11:00:51 +0100
changeset 30226 2f4684e2ea95
parent 22798 doc-src/IsarAdvanced/Codegen/Thy/examples/dirty_set.ML@e3962371f568
permissions -rw-r--r--
more canonical directory structure of manuals
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21190
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     1
structure ROOT = 
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     2
struct
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     3
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     4
structure Nat = 
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     5
struct
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     6
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     7
datatype nat = Zero_nat | Suc of nat;
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     8
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
     9
end; (*struct Nat*)
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    10
22386
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    11
structure Integer = 
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    12
struct
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    13
22798
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    14
datatype bit = B0 | B1;
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    15
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    16
datatype int = Pls | Min | Bit of int * bit | Number_of_int of int;
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    17
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    18
fun pred (Bit (k, B0)) = Bit (pred k, B1)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    19
  | pred (Bit (k, B1)) = Bit (k, B0)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    20
  | pred Min = Bit (Min, B0)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    21
  | pred Pls = Min;
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    22
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    23
fun uminus_int (Number_of_int w) = Number_of_int (uminus_int w)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    24
  | uminus_int (Bit (k, B0)) = Bit (uminus_int k, B0)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    25
  | uminus_int (Bit (k, B1)) = Bit (pred (uminus_int k), B1)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    26
  | uminus_int Min = Bit (Pls, B1)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    27
  | uminus_int Pls = Pls;
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    28
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    29
fun succ (Bit (k, B0)) = Bit (k, B1)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    30
  | succ (Bit (k, B1)) = Bit (succ k, B0)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    31
  | succ Min = Pls
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    32
  | succ Pls = Bit (Pls, B1);
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    33
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    34
fun plus_int (Number_of_int v) (Number_of_int w) =
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    35
  Number_of_int (plus_int v w)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    36
  | plus_int k Min = pred k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    37
  | plus_int k Pls = k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    38
  | plus_int (Bit (k, B1)) (Bit (l, B1)) = Bit (plus_int k (succ l), B0)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    39
  | plus_int (Bit (k, B1)) (Bit (l, B0)) = Bit (plus_int k l, B1)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    40
  | plus_int (Bit (k, B0)) (Bit (l, b)) = Bit (plus_int k l, b)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    41
  | plus_int Min k = pred k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    42
  | plus_int Pls k = k;
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    43
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    44
fun minus_int (Number_of_int v) (Number_of_int w) =
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    45
  Number_of_int (plus_int v (uminus_int w))
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    46
  | minus_int z w = plus_int z (uminus_int w);
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    47
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    48
fun less_eq_int (Number_of_int k) (Number_of_int l) = less_eq_int k l
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    49
  | less_eq_int (Bit (k1, B1)) (Bit (k2, B0)) = less_int k1 k2
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    50
  | less_eq_int (Bit (k1, v)) (Bit (k2, B1)) = less_eq_int k1 k2
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    51
  | less_eq_int (Bit (k1, B0)) (Bit (k2, v)) = less_eq_int k1 k2
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    52
  | less_eq_int (Bit (k, v)) Min = less_eq_int k Min
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    53
  | less_eq_int (Bit (k, B1)) Pls = less_int k Pls
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    54
  | less_eq_int (Bit (k, B0)) Pls = less_eq_int k Pls
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    55
  | less_eq_int Min (Bit (k, B1)) = less_eq_int Min k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    56
  | less_eq_int Min (Bit (k, B0)) = less_int Min k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    57
  | less_eq_int Min Min = true
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    58
  | less_eq_int Min Pls = true
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    59
  | less_eq_int Pls (Bit (k, v)) = less_eq_int Pls k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    60
  | less_eq_int Pls Min = false
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    61
  | less_eq_int Pls Pls = true
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    62
and less_int (Number_of_int k) (Number_of_int l) = less_int k l
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    63
  | less_int (Bit (k1, B0)) (Bit (k2, B1)) = less_eq_int k1 k2
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    64
  | less_int (Bit (k1, B1)) (Bit (k2, v)) = less_int k1 k2
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    65
  | less_int (Bit (k1, v)) (Bit (k2, B0)) = less_int k1 k2
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    66
  | less_int (Bit (k, B1)) Min = less_int k Min
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    67
  | less_int (Bit (k, B0)) Min = less_eq_int k Min
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    68
  | less_int (Bit (k, v)) Pls = less_int k Pls
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    69
  | less_int Min (Bit (k, v)) = less_int Min k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    70
  | less_int Min Min = false
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    71
  | less_int Min Pls = true
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    72
  | less_int Pls (Bit (k, B1)) = less_eq_int Pls k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    73
  | less_int Pls (Bit (k, B0)) = less_int Pls k
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    74
  | less_int Pls Min = false
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    75
  | less_int Pls Pls = false;
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    76
22386
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    77
fun nat_aux n i =
22798
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    78
  (if less_eq_int i (Number_of_int Pls) then n
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    79
    else nat_aux (Nat.Suc n)
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    80
           (minus_int i (Number_of_int (Bit (Pls, B1)))));
22386
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    81
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    82
fun nat i = nat_aux Nat.Zero_nat i;
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    83
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    84
end; (*struct Integer*)
4ebe883b02ff new code theorems
haftmann
parents: 22015
diff changeset
    85
21190
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    86
structure Codegen = 
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    87
struct
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    88
22015
12b94d7f7e1f adaptions
haftmann
parents: 21993
diff changeset
    89
val dummy_set : (Nat.nat -> Nat.nat) list = Nat.Suc :: [];
21190
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    90
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    91
val foobar_set : Nat.nat list =
22015
12b94d7f7e1f adaptions
haftmann
parents: 21993
diff changeset
    92
  Nat.Zero_nat ::
22798
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    93
    (Nat.Suc Nat.Zero_nat ::
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    94
      (Integer.nat
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    95
         (Integer.Number_of_int
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    96
           (Integer.Bit
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    97
             (Integer.Bit (Integer.Pls, Integer.B1), Integer.B0)))
e3962371f568 updated doc
haftmann
parents: 22386
diff changeset
    98
        :: []));
21190
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
    99
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
   100
end; (*struct Codegen*)
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
   101
08ec81dfc7fb (continued)
haftmann
parents:
diff changeset
   102
end; (*struct ROOT*)