src/HOL/ex/CodeCollections.thy
author wenzelm
Fri, 17 Nov 2006 02:20:03 +0100
changeset 21404 eb85850d3eb7
parent 21319 cf814e36f788
child 21460 cda5cd8bfd16
permissions -rw-r--r--
more robust syntax for definition/abbreviation/notation;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
     1
(*  ID:         $Id$
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
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20528
diff changeset
     8
imports Main
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
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    11
section {* Collection classes as examples for code generation *}
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    12
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    13
class ordered = eq +
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    14
  constrains eq :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    15
  fixes le :: "'a \<Rightarrow> 'a \<Rightarrow> bool" (infix "\<^loc><<=" 65)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    16
  fixes lt :: "'a \<Rightarrow> 'a \<Rightarrow> bool" (infix "\<^loc><<" 65)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    17
  assumes order_refl: "x \<^loc><<= x"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    18
  assumes order_trans: "x \<^loc><<= y ==> y \<^loc><<= z ==> x \<^loc><<= z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    19
  assumes order_antisym: "x \<^loc><<= y ==> y \<^loc><<= x ==> x = y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    20
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    21
declare order_refl [simp, intro]
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    22
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    23
defs
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    24
  lt_def: "x << y == (x <<= y \<and> x \<noteq> y)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    25
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    26
lemma lt_intro [intro]:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    27
  assumes "x <<= y" and "x \<noteq> y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    28
  shows "x << y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    29
unfolding lt_def ..
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    30
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    31
lemma lt_elim [elim]:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    32
  assumes "(x::'a::ordered) << y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    33
  and Q: "!!x y::'a::ordered. x <<= y \<Longrightarrow> x \<noteq> y \<Longrightarrow> P"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    34
  shows P
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    35
proof -
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    36
  from prems have R1: "x <<= y" and R2: "x \<noteq> y" by (simp_all add: lt_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    37
  show P by (rule Q [OF R1 R2])
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    38
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    39
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    40
lemma lt_trans:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    41
  assumes "x << y" and "y << z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    42
  shows "x << z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    43
proof
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    44
  from prems lt_def have prems': "x <<= y" "y <<= z" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    45
  show "x <<= z" by (rule order_trans, auto intro: prems')
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    46
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    47
  show "x \<noteq> z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    48
  proof
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    49
    from prems lt_def have prems': "x <<= y" "y <<= z" "x \<noteq> y" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    50
    assume "x = z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    51
    with prems' have "x <<= y" and "y <<= x" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    52
    with order_antisym have "x = y" .
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    53
    with prems' show False by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    54
  qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    55
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    56
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    57
definition (in ordered)
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    58
  min :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    59
  "min x y = (if x \<^loc><<= y then x else y)"
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    60
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    61
definition (in ordered)
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    62
  max :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    63
  "max x y = (if x \<^loc><<= y then y else x)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    64
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    65
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    66
  min :: "'a::ordered \<Rightarrow> 'a \<Rightarrow> 'a" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    67
  "min x y = (if x <<= y then x else y)"
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    68
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    69
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
    70
  max :: "'a::ordered \<Rightarrow> 'a \<Rightarrow> 'a" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    71
  "max x y = (if x <<= y then y else x)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    72
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    73
fun abs_sorted :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a list \<Rightarrow> bool"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    74
where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    75
  "abs_sorted cmp [] = True"
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    76
| "abs_sorted cmp [x] = True"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    77
| "abs_sorted cmp (x#y#xs) = (cmp x y \<and> abs_sorted cmp (y#xs))"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    78
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    79
thm abs_sorted.simps
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    80
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    81
abbreviation (in ordered)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    82
  "sorted \<equiv> abs_sorted le"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    83
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    84
abbreviation
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    85
  "sorted \<equiv> abs_sorted le"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    86
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    87
lemma (in ordered) sorted_weakening:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    88
  assumes "sorted (x # xs)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    89
  shows "sorted xs"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    90
using prems proof (induct xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    91
  case Nil show ?case by simp 
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    92
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    93
  case (Cons x' xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    94
  from this(5) have "sorted (x # x' # xs)" .
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    95
  then show "sorted (x' # xs)"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
    96
    by auto
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    97
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    98
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
    99
instance bool :: ordered
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   100
  "p <<= q == (p --> q)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   101
  by default (unfold ordered_bool_def, blast+)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   102
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   103
instance nat :: ordered
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   104
  "m <<= n == m <= n"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   105
  by default (simp_all add: ordered_nat_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   106
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   107
instance int :: ordered
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   108
  "k <<= l == k <= l"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   109
  by default (simp_all add: ordered_int_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   110
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   111
instance unit :: ordered
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   112
  "u <<= v == True"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   113
  by default (simp_all add:  ordered_unit_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   114
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   115
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   116
fun le_option' :: "'a::ordered option \<Rightarrow> 'a option \<Rightarrow> bool"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   117
where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   118
  "le_option' None y = True"
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   119
| "le_option' (Some x) None = False"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   120
| "le_option' (Some x) (Some y) = x <<= y"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   121
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20528
diff changeset
   122
instance option :: (ordered) ordered
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   123
  "x <<= y == le_option' x y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   124
proof (default, unfold ordered_option_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   125
  fix x
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   126
  show "le_option' x x" by (cases x) simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   127
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   128
  fix x y z
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   129
  assume "le_option' x y" "le_option' y z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   130
  then show "le_option' x z"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   131
    by (cases x, simp_all, cases y, simp_all, cases z, simp_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   132
    (erule order_trans, assumption)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   133
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   134
  fix x y
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   135
  assume "le_option' x y" "le_option' y x"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   136
  then show "x = y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   137
    by (cases x, simp_all, cases y, simp_all, cases y, simp_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   138
    (erule order_antisym, assumption)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   139
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   140
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   141
lemma [simp, code]:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   142
  "None <<= y = True"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   143
  "Some x <<= None = False"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   144
  "Some v <<= Some w = v <<= w"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   145
  unfolding ordered_option_def le_option'.simps by rule+
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   146
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   147
fun le_pair' :: "'a::ordered \<times> 'b::ordered \<Rightarrow> 'a \<times> 'b \<Rightarrow> bool"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   148
where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   149
  "le_pair' (x1, y1) (x2, y2) = (x1 << x2 \<or> x1 = x2 \<and> y1 <<= y2)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   150
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20528
diff changeset
   151
instance * :: (ordered, ordered) ordered
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   152
  "x <<= y == le_pair' x y"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   153
apply (default, unfold "ordered_*_def", unfold split_paired_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   154
apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   155
apply (auto intro: lt_trans order_trans)[1]
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   156
unfolding lt_def apply (auto intro: order_antisym)[1]
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   157
done
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   158
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   159
lemma [simp, code]:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   160
  "(x1, y1) <<= (x2, y2) = (x1 << x2 \<or> x1 = x2 \<and> y1 <<= y2)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   161
  unfolding "ordered_*_def" le_pair'.simps ..
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   162
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   163
(*   
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   164
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   165
fun le_list' :: "'a::ordered list \<Rightarrow> 'a list \<Rightarrow> bool"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   166
where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   167
  "le_list' [] ys = True"
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   168
| "le_list' (x#xs) [] = False"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   169
| "le_list' (x#xs) (y#ys) = (x << y \<or> x = y \<and> le_list' xs ys)"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   170
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   171
instance (ordered) list :: ordered
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   172
  "xs <<= ys == le_list' xs ys"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   173
proof (default, unfold "ordered_list_def")
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   174
  fix xs
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   175
  show "le_list' xs xs" by (induct xs) simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   176
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   177
  fix xs ys zs
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   178
  assume "le_list' xs ys" and "le_list' ys zs"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   179
  then show "le_list' xs zs"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   180
  apply (induct xs zs rule: le_list'.induct)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   181
  apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   182
  apply (cases ys) apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   183
  
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   184
  apply (induct ys) apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   185
  apply (induct ys)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   186
  apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   187
  apply (induct zs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   188
  apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   189
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   190
  fix xs ys
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   191
  assume "le_list' xs ys" and "le_list' ys xs"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   192
  show "xs = ys" sorry
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   193
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   194
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   195
lemma [simp, code]:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   196
  "[] <<= ys = True"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   197
  "(x#xs) <<= [] = False"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   198
  "(x#xs) <<= (y#ys) = (x << y \<or> x = y \<and> xs <<= ys)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   199
  unfolding "ordered_list_def" le_list'.simps by rule+*)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   200
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   201
class infimum = ordered +
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   202
  fixes inf
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   203
  assumes inf: "inf \<^loc><<= x"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   204
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   205
lemma (in infimum)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   206
  assumes prem: "a \<^loc><<= inf"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   207
  shows no_smaller: "a = inf"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   208
using prem inf by (rule order_antisym)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   209
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   210
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   211
ML {* set quick_and_dirty *}
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   212
function abs_max_of :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a list \<Rightarrow> 'a"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   213
where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   214
  "abs_max_of cmp inff [] = inff"
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   215
| "abs_max_of cmp inff [x] = x"
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   216
| "abs_max_of cmp inff (x#xs) =
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   217
     ordered.max cmp x (abs_max_of cmp inff xs)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   218
apply pat_completeness sorry
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   219
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   220
abbreviation (in infimum)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   221
  "max_of xs \<equiv> abs_max_of le inf"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   222
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   223
abbreviation
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   224
  "max_of xs \<equiv> abs_max_of le inf"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   225
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   226
instance bool :: infimum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   227
  "inf == False"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   228
  by default (simp add: infimum_bool_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   229
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   230
instance nat :: infimum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   231
  "inf == 0"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   232
  by default (simp add: infimum_nat_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   233
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   234
instance unit :: infimum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   235
  "inf == ()"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   236
  by default (simp add: infimum_unit_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   237
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20528
diff changeset
   238
instance option :: (ordered) infimum
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   239
  "inf == None"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   240
  by default (simp add: infimum_option_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   241
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20528
diff changeset
   242
instance * :: (infimum, infimum) infimum
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   243
  "inf == (inf, inf)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   244
  by default (unfold "infimum_*_def", unfold split_paired_all, auto intro: inf)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   245
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   246
class enum = ordered +
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   247
  fixes enum :: "'a list"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   248
  assumes member_enum: "x \<in> set enum"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   249
  and ordered_enum: "abs_sorted le enum"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   250
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   251
(*
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   252
FIXME:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   253
- abbreviations must be propagated before locale introduction
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   254
- then also now shadowing may occur
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   255
*)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   256
(*abbreviation (in enum)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   257
  "local.sorted \<equiv> abs_sorted le"*)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   258
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   259
instance bool :: enum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   260
  (* FIXME: better name handling of definitions *)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   261
  "_1": "enum == [False, True]"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   262
  by default (simp_all add: enum_bool_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   263
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   264
instance unit :: enum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   265
  "_2": "enum == [()]"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   266
  by default (simp_all add: enum_unit_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   267
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   268
(*consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   269
  product :: "'a list \<Rightarrow> 'b list \<Rightarrow> ('a * 'b) list"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   270
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   271
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   272
  "product [] ys = []"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   273
  "product (x#xs) ys = map (Pair x) ys @ product xs ys"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   274
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   275
lemma product_all:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   276
  assumes "x \<in> set xs" "y \<in> set ys"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   277
  shows "(x, y) \<in> set (product xs ys)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   278
using prems proof (induct xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   279
  case Nil
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   280
  then have False by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   281
  then show ?case ..
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   282
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   283
  case (Cons z xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   284
  then show ?case
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   285
  proof (cases "x = z")
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   286
    case True
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   287
    with Cons have "(x, y) \<in> set (product (x # xs) ys)" by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   288
    with True show ?thesis by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   289
  next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   290
    case False
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   291
    with Cons have "x \<in> set xs" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   292
    with Cons have "(x, y) \<in> set (product xs ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   293
    then show "(x, y) \<in> set (product (z#xs) ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   294
  qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   295
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   296
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   297
lemma product_sorted:
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   298
  assumes "sorted xs" "sorted ys"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   299
  shows "sorted (product xs ys)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   300
using prems proof (induct xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   301
  case Nil
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   302
  then show ?case by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   303
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   304
  case (Cons x xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   305
  from Cons ordered.sorted_weakening have "sorted xs" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   306
  with Cons have "sorted (product xs ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   307
  then show ?case apply simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   308
  proof -
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   309
    assume 
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   310
apply simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   311
  
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   312
  proof (cases "x = z")
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   313
    case True
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   314
    with Cons have "(x, y) \<in> set (product (x # xs) ys)" by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   315
    with True show ?thesis by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   316
  next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   317
    case False
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   318
    with Cons have "x \<in> set xs" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   319
    with Cons have "(x, y) \<in> set (product xs ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   320
    then show "(x, y) \<in> set (product (z#xs) ys)" by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   321
  qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   322
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   323
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   324
instance (enum, enum) * :: enum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   325
  "_3": "enum == product enum enum"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   326
apply default
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   327
apply (simp_all add: "enum_*_def")
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   328
apply (unfold split_paired_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   329
apply (rule product_all)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   330
apply (rule member_enum)+
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   331
sorry*)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   332
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20528
diff changeset
   333
instance option :: (enum) enum
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   334
  "_4": "enum == None # map Some enum"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   335
proof (default, unfold enum_option_def)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   336
  fix x :: "'a::enum option"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   337
  show "x \<in> set (None # map Some enum)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   338
  proof (cases x)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   339
    case None then show ?thesis by auto
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   340
  next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   341
    case (Some x) then show ?thesis by (auto intro: member_enum)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   342
  qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   343
next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   344
  show "sorted (None # map Some (enum :: ('a::enum) list))"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   345
  sorry
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   346
  (*proof (cases "enum :: 'a list")
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   347
    case Nil then show ?thesis by simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   348
  next
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   349
   case (Cons x xs)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   350
   then have "sorted (None # map Some (x # xs))" sorry
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   351
   then show ?thesis apply simp
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   352
  apply simp_all
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   353
  apply auto*)
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   354
qed
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   355
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   356
ML {* reset quick_and_dirty *}
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   357
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   358
consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   359
  get_first :: "('a \<Rightarrow> bool) \<Rightarrow> 'a list \<Rightarrow> 'a option"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   360
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   361
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   362
  "get_first p [] = None"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   363
  "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
   364
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   365
consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   366
  get_index :: "('a \<Rightarrow> bool) \<Rightarrow> nat \<Rightarrow> 'a list \<Rightarrow> nat option"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   367
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   368
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   369
  "get_index p n [] = None"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   370
  "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
   371
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   372
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   373
  between :: "'a::enum \<Rightarrow> 'a \<Rightarrow> 'a option" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   374
  "between x y = get_first (\<lambda>z. x << z & z << y) enum"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   375
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   376
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   377
  index :: "'a::enum \<Rightarrow> nat" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   378
  "index x = the (get_index (\<lambda>y. y = x) 0 enum)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   379
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   380
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   381
  add :: "'a::enum \<Rightarrow> 'a \<Rightarrow> 'a" where
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   382
  "add x y =
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   383
    (let
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   384
      enm = enum
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   385
    in enm ! ((index x + index y) mod length enm))"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   386
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   387
consts
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   388
  sum :: "'a::{enum, infimum} list \<Rightarrow> 'a"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   389
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   390
primrec
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   391
  "sum [] = inf"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   392
  "sum (x#xs) = add x (sum xs)"
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   393
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   394
definition "test1 = sum [None, Some True, None, Some False]"
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21319
diff changeset
   395
definition "test2 = (inf :: nat \<times> unit)"
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   396
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   397
code_gen "op <<="
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   398
code_gen "op <<"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   399
code_gen inf
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   400
code_gen between
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   401
code_gen index
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   402
code_gen test1
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20436
diff changeset
   403
code_gen test2
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   404
21125
9b7d35ca1eef adapted to new serializer syntax
haftmann
parents: 21080
diff changeset
   405
code_gen (SML *)
21080
7d73aa966207 added Haskell
haftmann
parents: 20597
diff changeset
   406
code_gen (Haskell -)
20436
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   407
0af8655ab0bb added yet another code generator example
haftmann
parents:
diff changeset
   408
end