src/HOL/ex/CodeCollections.thy
author haftmann
Fri, 02 Mar 2007 15:43:15 +0100
changeset 22384 33a46e6c7f04
parent 22179 1a3575de2afc
child 22473 753123c89d72
permissions -rw-r--r--
prefix of class interpretation not mandatory any longer
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22068
00bed5ac9884 renamed locale partial_order to order
haftmann
parents: 21924
diff changeset
     1
(*  ID:         $Id$
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     3
*)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     4
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     5
header {* Collection classes as examples for code generation *}
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     6
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     7
theory CodeCollections
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
     8
imports Main Product_ord List_lexord
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     9
begin
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    10
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    11
fun
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    12
  abs_sorted :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a list \<Rightarrow> bool" where
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    13
  "abs_sorted cmp [] \<longleftrightarrow> True"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    14
  "abs_sorted cmp [x] \<longleftrightarrow> True"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    15
  "abs_sorted cmp (x#y#xs) \<longleftrightarrow> cmp x y \<and> abs_sorted cmp (y#xs)"
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    16
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    17
abbreviation (in ord)
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    18
  "sorted \<equiv> abs_sorted less_eq"
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    19
22068
00bed5ac9884 renamed locale partial_order to order
haftmann
parents: 21924
diff changeset
    20
lemma (in order) sorted_weakening:
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    21
  assumes "sorted (x # xs)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    22
  shows "sorted xs"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    23
using prems proof (induct xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    24
  case Nil show ?case by simp 
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    25
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    26
  case (Cons x' xs)
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    27
  from this have "sorted (x # x' # xs)" by auto
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    28
  then show "sorted (x' # xs)"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    29
    by auto
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    30
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    31
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    32
instance unit :: order
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    33
  "u \<le> v \<equiv> True"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    34
  "u < v \<equiv> False"
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
    35
  by default (simp_all add: less_eq_unit_def less_unit_def)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    36
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    37
fun le_option' :: "'a\<Colon>order option \<Rightarrow> 'a option \<Rightarrow> bool"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    38
  where "le_option' None y \<longleftrightarrow> True"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    39
  | "le_option' (Some x) None \<longleftrightarrow> False"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    40
  | "le_option' (Some x) (Some y) \<longleftrightarrow> x \<le> y"
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    41
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    42
instance option :: (order) order
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    43
  "x \<le> y \<equiv> le_option' x y"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    44
  "x < y \<equiv> x \<le> y \<and> x \<noteq> y"
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
    45
proof (default, unfold less_eq_option_def less_option_def)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    46
  fix x
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    47
  show "le_option' x x" by (cases x) simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    48
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    49
  fix x y z
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    50
  assume "le_option' x y" "le_option' y z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    51
  then show "le_option' x z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    52
    by (cases x, simp_all, cases y, simp_all, cases z, simp_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    53
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    54
  fix x y
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    55
  assume "le_option' x y" "le_option' y x"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    56
  then show "x = y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    57
    by (cases x, simp_all, cases y, simp_all, cases y, simp_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    58
next
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    59
  fix x y
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    60
  show "le_option' x y \<and> x \<noteq> y \<longleftrightarrow> le_option' x y \<and> x \<noteq> y" ..
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    61
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    62
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    63
lemma [simp, code]:
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    64
  "None \<le> y \<longleftrightarrow> True"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    65
  "Some x \<le> None \<longleftrightarrow> False"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    66
  "Some v \<le> Some w \<longleftrightarrow> v \<le> w"
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
    67
  unfolding less_eq_option_def less_option_def le_option'.simps by rule+
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    68
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    69
lemma forall_all [simp]:
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    70
  "list_all P xs \<longleftrightarrow> (\<forall>x\<in>set xs. P x)"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    71
  by (induct xs) auto
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    72
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    73
lemma exists_ex [simp]:
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    74
  "list_ex P xs \<longleftrightarrow> (\<exists>x\<in>set xs. P x)"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    75
  by (induct xs) auto
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    76
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
    77
class finite =
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    78
  fixes fin :: "'a list"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    79
  assumes member_fin: "x \<in> set fin"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    80
begin
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    81
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    82
lemma set_enum_UNIV:
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    83
  "set fin = UNIV"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    84
  using member_fin by auto
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    85
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    86
lemma all_forall [code func, code inline]:
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    87
  "(\<forall>x. P x) \<longleftrightarrow> list_all P fin"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    88
  using set_enum_UNIV by simp_all
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    89
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    90
lemma ex_exists [code func, code inline]:
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    91
  "(\<exists>x. P x) \<longleftrightarrow> list_ex P fin"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    92
  using set_enum_UNIV by simp_all
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    93
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    94
end
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    95
  
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
    96
instance bool :: finite
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
    97
  "fin == [False, True]"
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
    98
  by default (simp_all add: fin_bool_def)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    99
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
   100
instance unit :: finite
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
   101
  "fin == [()]"
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   102
  by default (simp_all add: fin_unit_def)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   103
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   104
fun
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   105
  product :: "'a list \<Rightarrow> 'b list \<Rightarrow> ('a * 'b) list"
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   106
  where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   107
  "product [] ys = []"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   108
  "product (x#xs) ys = map (Pair x) ys @ product xs ys"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   109
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   110
lemma product_all:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   111
  assumes "x \<in> set xs" "y \<in> set ys"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   112
  shows "(x, y) \<in> set (product xs ys)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   113
using prems proof (induct xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   114
  case Nil
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   115
  then have False by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   116
  then show ?case ..
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   117
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   118
  case (Cons z xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   119
  then show ?case
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   120
  proof (cases "x = z")
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   121
    case True
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   122
    with Cons have "(x, y) \<in> set (product (x # xs) ys)" by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   123
    with True show ?thesis by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   124
  next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   125
    case False
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   126
    with Cons have "x \<in> set xs" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   127
    with Cons have "(x, y) \<in> set (product xs ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   128
    then show "(x, y) \<in> set (product (z#xs) ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   129
  qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   130
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   131
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
   132
instance * :: (finite, finite) finite
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
   133
  "fin == product fin fin"
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   134
apply default
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   135
apply (simp_all add: "fin_*_def")
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   136
apply (unfold split_paired_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   137
apply (rule product_all)
22384
33a46e6c7f04 prefix of class interpretation not mandatory any longer
haftmann
parents: 22179
diff changeset
   138
apply (rule member_fin)+
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   139
done
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   140
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
   141
instance option :: (finite) finite
21924
fe474e69e603 simplified class_package
haftmann
parents: 21545
diff changeset
   142
  "fin == None # map Some fin"
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   143
proof (default, unfold fin_option_def)
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
   144
  fix x :: "'a::finite option"
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   145
  show "x \<in> set (None # map Some fin)"
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   146
  proof (cases x)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   147
    case None then show ?thesis by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   148
  next
22384
33a46e6c7f04 prefix of class interpretation not mandatory any longer
haftmann
parents: 22179
diff changeset
   149
    case (Some x) then show ?thesis by (auto intro: member_fin)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   150
  qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   151
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   152
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   153
consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   154
  get_first :: "('a \<Rightarrow> bool) \<Rightarrow> 'a list \<Rightarrow> 'a option"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   155
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   156
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   157
  "get_first p [] = None"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   158
  "get_first p (x#xs) = (if p x then Some x else get_first p xs)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   159
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   160
consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   161
  get_index :: "('a \<Rightarrow> bool) \<Rightarrow> nat \<Rightarrow> 'a list \<Rightarrow> nat option"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   162
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   163
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   164
  "get_index p n [] = None"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   165
  "get_index p n (x#xs) = (if p x then Some n else get_index p (Suc n) xs)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   166
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   167
(*definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   168
  between :: "'a::enum \<Rightarrow> 'a \<Rightarrow> 'a option" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   169
  "between x y = get_first (\<lambda>z. x << z & z << y) enum"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   170
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   171
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   172
  index :: "'a::enum \<Rightarrow> nat" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   173
  "index x = the (get_index (\<lambda>y. y = x) 0 enum)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   174
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   175
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   176
  add :: "'a::enum \<Rightarrow> 'a \<Rightarrow> 'a" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   177
  "add x y =
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   178
    (let
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   179
      enm = enum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   180
    in enm ! ((index x + index y) mod length enm))"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   181
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   182
consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   183
  sum :: "'a::{enum, infimum} list \<Rightarrow> 'a"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   184
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   185
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   186
  "sum [] = inf"
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   187
  "sum (x#xs) = add x (sum xs)"*)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   188
21460
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   189
(*definition "test1 = sum [None, Some True, None, Some False]"*)
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   190
(*definition "test2 = (inf :: nat \<times> unit)"*)
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   191
definition "test3 \<longleftrightarrow> (\<exists>x \<Colon> bool option. case x of Some P \<Rightarrow> P | None \<Rightarrow> False)"
cda5cd8bfd16 example tuned
haftmann
parents: 21404
diff changeset
   192
22179
1a3575de2afc adjusted to changes in class package
haftmann
parents: 22068
diff changeset
   193
code_gen test3 (SML #) (OCaml -) (Haskell -)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   194
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   195
end