src/HOL/MicroJava/J/JListExample.thy
author wenzelm
Sat, 28 May 2016 17:34:28 +0200
changeset 63176 878bd5922f3b
parent 61361 8b5f00202e1a
child 68451 c34aa23a1fb6
permissions -rw-r--r--
clarified axiomatization: proper variables (!);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12951
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents: 12911
diff changeset
     1
(*  Title:      HOL/MicroJava/J/JListExample.thy
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     2
    Author:     Stefan Berghofer
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     3
*)
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     4
61361
8b5f00202e1a isabelle update_cartouches;
wenzelm
parents: 58886
diff changeset
     5
section \<open>Example for generating executable code from Java semantics\<close>
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     6
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
     7
theory JListExample
32356
e11cd88e6ade temporary adjustment to dubious state of eta expansion in recfun_codegen
haftmann
parents: 28524
diff changeset
     8
imports Eval
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
     9
begin
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    10
46512
4f9f61f9b535 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46506
diff changeset
    11
declare [[syntax_ambiguity_warning = false]]
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    12
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    13
consts
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    14
  list_nam :: cnam
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    15
  append_name :: mname
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    16
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    17
axiomatization val_nam next_nam l_nam l1_nam l2_nam l3_nam l4_nam :: vnam
63176
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    18
where distinct_fields: "val_nam \<noteq> next_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    19
  and distinct_vars1: "l_nam \<noteq> l1_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    20
  and distinct_vars2: "l_nam \<noteq> l2_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    21
  and distinct_vars3: "l_nam \<noteq> l3_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    22
  and distinct_vars4: "l_nam \<noteq> l4_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    23
  and distinct_vars5: "l1_nam \<noteq> l2_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    24
  and distinct_vars6: "l1_nam \<noteq> l3_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    25
  and distinct_vars7: "l1_nam \<noteq> l4_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    26
  and distinct_vars8: "l2_nam \<noteq> l3_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    27
  and distinct_vars9: "l2_nam \<noteq> l4_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    28
  and distinct_vars10: "l3_nam \<noteq> l4_nam"
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    29
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    30
lemmas distinct_vars =
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    31
  distinct_vars1
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    32
  distinct_vars2
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    33
  distinct_vars3
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    34
  distinct_vars4
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    35
  distinct_vars5
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    36
  distinct_vars6
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    37
  distinct_vars7
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    38
  distinct_vars8
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    39
  distinct_vars9
878bd5922f3b clarified axiomatization: proper variables (!);
wenzelm
parents: 61361
diff changeset
    40
  distinct_vars10
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    41
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    42
definition list_name :: cname where
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    43
  "list_name = Cname list_nam"
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    44
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    45
definition val_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    46
  "val_name == VName val_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    47
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    48
definition next_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    49
  "next_name == VName next_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    50
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    51
definition l_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    52
  "l_name == VName l_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    53
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    54
definition l1_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    55
  "l1_name == VName l1_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    56
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    57
definition l2_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    58
  "l2_name == VName l2_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    59
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    60
definition l3_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    61
  "l3_name == VName l3_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    62
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    63
definition l4_name :: vname where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    64
  "l4_name == VName l4_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    65
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    66
definition list_class :: "java_mb class" where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    67
  "list_class ==
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    68
    (Object,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    69
     [(val_name, PrimT Integer), (next_name, RefT (ClassT list_name))],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    70
     [((append_name, [RefT (ClassT list_name)]), PrimT Void,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    71
      ([l_name], [],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    72
       If(BinOp Eq ({list_name}(LAcc This)..next_name) (Lit Null))
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    73
         Expr ({list_name}(LAcc This)..next_name:=LAcc l_name)
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    74
       Else
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    75
         Expr ({list_name}({list_name}(LAcc This)..next_name)..
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    76
           append_name({[RefT (ClassT list_name)]}[LAcc l_name])), 
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    77
       Lit Unit))])"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    78
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32356
diff changeset
    79
definition example_prg :: "java_mb prog" where
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    80
  "example_prg == [ObjectC, (list_name, list_class)]"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    81
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    82
code_datatype list_nam
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    83
lemma equal_cnam_code [code]:
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    84
  "HOL.equal list_nam list_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    85
  by(simp add: equal_cnam_def)
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    86
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    87
code_datatype append_name
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    88
lemma equal_mname_code [code]:
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    89
  "HOL.equal append_name append_name \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    90
  by(simp add: equal_mname_def)
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    91
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    92
code_datatype val_nam next_nam l_nam l1_nam l2_nam l3_nam l4_nam 
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    93
lemma equal_vnam_code [code]: 
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    94
  "HOL.equal val_nam val_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    95
  "HOL.equal next_nam next_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    96
  "HOL.equal l_nam l_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    97
  "HOL.equal l1_nam l1_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    98
  "HOL.equal l2_nam l2_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
    99
  "HOL.equal l3_nam l3_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   100
  "HOL.equal l4_nam l4_nam \<longleftrightarrow> True"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   101
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   102
  "HOL.equal val_nam next_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   103
  "HOL.equal next_nam val_nam \<longleftrightarrow> False"
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   104
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   105
  "HOL.equal l_nam l1_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   106
  "HOL.equal l_nam l2_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   107
  "HOL.equal l_nam l3_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   108
  "HOL.equal l_nam l4_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   109
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   110
  "HOL.equal l1_nam l_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   111
  "HOL.equal l1_nam l2_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   112
  "HOL.equal l1_nam l3_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   113
  "HOL.equal l1_nam l4_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   114
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   115
  "HOL.equal l2_nam l_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   116
  "HOL.equal l2_nam l1_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   117
  "HOL.equal l2_nam l3_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   118
  "HOL.equal l2_nam l4_nam \<longleftrightarrow> False"
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   119
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   120
  "HOL.equal l3_nam l_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   121
  "HOL.equal l3_nam l1_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   122
  "HOL.equal l3_nam l2_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   123
  "HOL.equal l3_nam l4_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   124
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   125
  "HOL.equal l4_nam l_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   126
  "HOL.equal l4_nam l1_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   127
  "HOL.equal l4_nam l2_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   128
  "HOL.equal l4_nam l3_nam \<longleftrightarrow> False"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   129
  by(simp_all add: distinct_fields distinct_fields[symmetric] distinct_vars distinct_vars[symmetric] equal_vnam_def)
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   130
45827
66c68453455c modernized specifications;
wenzelm
parents: 45231
diff changeset
   131
axiomatization where
66c68453455c modernized specifications;
wenzelm
parents: 45231
diff changeset
   132
  nat_to_loc'_inject: "nat_to_loc' l = nat_to_loc' l' \<longleftrightarrow> l = l'"
66c68453455c modernized specifications;
wenzelm
parents: 45231
diff changeset
   133
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   134
lemma equal_loc'_code [code]:
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   135
  "HOL.equal (nat_to_loc' l) (nat_to_loc' l') \<longleftrightarrow> l = l'"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   136
  by(simp add: equal_loc'_def nat_to_loc'_inject)
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   137
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   138
definition undefined_cname :: cname 
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   139
  where [code del]: "undefined_cname = undefined"
45231
d85a2fdc586c replacing code_inline by code_unfold, removing obsolete code_unfold, code_inline del now that the ancient code generator is removed
bulwahn
parents: 44037
diff changeset
   140
declare undefined_cname_def[symmetric, code_unfold]
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   141
code_datatype Object Xcpt Cname undefined_cname
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   142
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   143
definition undefined_val :: val
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   144
  where [code del]: "undefined_val = undefined"
45231
d85a2fdc586c replacing code_inline by code_unfold, removing obsolete code_unfold, code_inline del now that the ancient code generator is removed
bulwahn
parents: 44037
diff changeset
   145
declare undefined_val_def[symmetric, code_unfold]
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   146
code_datatype Unit Null Bool Intg Addr undefined_val
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   147
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   148
definition E where 
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   149
  "E = Expr (l1_name::=NewC list_name);;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   150
       Expr ({list_name}(LAcc l1_name)..val_name:=Lit (Intg 1));;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   151
       Expr (l2_name::=NewC list_name);;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   152
       Expr ({list_name}(LAcc l2_name)..val_name:=Lit (Intg 2));;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   153
       Expr (l3_name::=NewC list_name);;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   154
       Expr ({list_name}(LAcc l3_name)..val_name:=Lit (Intg 3));;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   155
       Expr (l4_name::=NewC list_name);;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   156
       Expr ({list_name}(LAcc l4_name)..val_name:=Lit (Intg 4));;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   157
       Expr ({list_name}(LAcc l1_name)..
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   158
         append_name({[RefT (ClassT list_name)]}[LAcc l2_name]));;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   159
       Expr ({list_name}(LAcc l1_name)..
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   160
         append_name({[RefT (ClassT list_name)]}[LAcc l3_name]));;
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   161
       Expr ({list_name}(LAcc l1_name)..
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   162
         append_name({[RefT (ClassT list_name)]}[LAcc l4_name]))"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   163
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   164
definition test where
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   165
  "test = Predicate.Pred (\<lambda>s. example_prg\<turnstile>Norm (empty, empty) -E-> s)"
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   166
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   167
lemma test_code [code]:
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   168
  "test = exec_i_i_i_o example_prg (Norm (empty, empty)) E"
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   169
by(auto intro: exec_i_i_i_oI intro!: pred_eqI elim: exec_i_i_i_oE simp add: test_def)
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   170
61361
8b5f00202e1a isabelle update_cartouches;
wenzelm
parents: 58886
diff changeset
   171
ML_val \<open>
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   172
  val SOME ((_, (heap, locs)), _) = Predicate.yield @{code test};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   173
  locs @{code l1_name};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   174
  locs @{code l2_name};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   175
  locs @{code l3_name};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   176
  locs @{code l4_name};
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   177
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   178
  fun list_fields n = 
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   179
    @{code snd} (@{code the} (heap (@{code Loc} (@{code "nat_to_loc'"} n))));
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   180
  fun val_field n =
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   181
    list_fields n (@{code val_name}, @{code "list_name"});
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   182
  fun next_field n =
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   183
    list_fields n (@{code next_name}, @{code "list_name"});
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   184
  val Suc = @{code Suc};
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   185
44037
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   186
  val_field @{code "0 :: nat"};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   187
  next_field @{code "0 :: nat"};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   188
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   189
  val_field @{code "1 :: nat"};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   190
  next_field @{code "1 :: nat"};
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   191
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   192
  val_field (Suc (Suc @{code "0 :: nat"}));
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   193
  next_field (Suc (Suc @{code "0 :: nat"}));
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   194
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   195
  val_field (Suc (Suc (Suc @{code "0 :: nat"})));
25011c3a5c3d replace old SML code generator by new code generator in MicroJava/J
Andreas Lochbihler
parents: 39126
diff changeset
   196
  next_field (Suc (Suc (Suc @{code "0 :: nat"})));
61361
8b5f00202e1a isabelle update_cartouches;
wenzelm
parents: 58886
diff changeset
   197
\<close>
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   198
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   199
end