src/HOL/MicroJava/J/Example.thy
changeset 12951 a9fdcb71d252
parent 12911 704713ca07ea
child 14045 a34d89ce6097
equal deleted inserted replaced
12950:3aadb133632d 12951:a9fdcb71d252
     4     Copyright   1999 Technische Universitaet Muenchen
     4     Copyright   1999 Technische Universitaet Muenchen
     5 *)
     5 *)
     6 
     6 
     7 header {* \isaheader{Example MicroJava Program} *}
     7 header {* \isaheader{Example MicroJava Program} *}
     8 
     8 
     9 theory Example = Eval:
     9 theory Example = SystemClasses + Eval:
    10 
    10 
    11 text {* 
    11 text {* 
    12 The following example MicroJava program includes:
    12 The following example MicroJava program includes:
    13  class declarations with inheritance, hiding of fields, and overriding of
    13  class declarations with inheritance, hiding of fields, and overriding of
    14   methods (with refined result type), 
    14   methods (with refined result type), 
    70   "e"  == "VName (vnam_ e_)"
    70   "e"  == "VName (vnam_ e_)"
    71 
    71 
    72 axioms
    72 axioms
    73   Base_not_Object: "Base \<noteq> Object"
    73   Base_not_Object: "Base \<noteq> Object"
    74   Ext_not_Object:  "Ext  \<noteq> Object"
    74   Ext_not_Object:  "Ext  \<noteq> Object"
    75   e_not_This:      "e \<noteq> This"
    75   Base_not_Xcpt:   "Base \<noteq> Xcpt z"
       
    76   Ext_not_Xcpt:    "Ext  \<noteq> Xcpt z"
       
    77   e_not_This:      "e \<noteq> This"  
    76 
    78 
    77 declare Base_not_Object [simp] Ext_not_Object [simp]
    79 declare Base_not_Object [simp] Ext_not_Object [simp]
       
    80 declare Base_not_Xcpt [simp] Ext_not_Xcpt [simp]
    78 declare e_not_This [simp]
    81 declare e_not_This [simp]
    79 declare Base_not_Object [THEN not_sym, simp]
    82 declare Base_not_Object [symmetric, simp]
    80 declare Ext_not_Object  [THEN not_sym, simp]
    83 declare Ext_not_Object  [symmetric, simp]
       
    84 declare Base_not_Xcpt [symmetric, simp]
       
    85 declare Ext_not_Xcpt  [symmetric, simp]
    81 
    86 
    82 consts
    87 consts
    83   foo_Base::  java_mb
    88   foo_Base::  java_mb
    84   foo_Ext ::  java_mb
    89   foo_Ext ::  java_mb
    85   BaseC   :: "java_mb cdecl"
    90   BaseC   :: "java_mb cdecl"
   117   s3  :: state
   122   s3  :: state
   118   s4  :: state
   123   s4  :: state
   119 
   124 
   120 translations
   125 translations
   121   "NP"   == "NullPointer"
   126   "NP"   == "NullPointer"
   122   "tprg" == "[ObjectC, BaseC, ExtC]"
   127   "tprg" == "[ObjectC, BaseC, ExtC, ClassCastC, NullPointerC, OutOfMemoryC]"
   123   "obj1"    <= "(Ext, empty((vee, Base)\<mapsto>Bool False)
   128   "obj1"    <= "(Ext, empty((vee, Base)\<mapsto>Bool False)
   124          ((vee, Ext )\<mapsto>Intg 0))"
   129          ((vee, Ext )\<mapsto>Intg 0))"
   125   "s0" == " Norm    (empty, empty)"
   130   "s0" == " Norm    (empty, empty)"
   126   "s1" == " Norm    (empty(a\<mapsto>obj1),empty(e\<mapsto>Addr a))"
   131   "s1" == " Norm    (empty(a\<mapsto>obj1),empty(e\<mapsto>Addr a))"
   127   "s2" == " Norm    (empty(a\<mapsto>obj1),empty(x\<mapsto>Null)(This\<mapsto>Addr a))"
   132   "s2" == " Norm    (empty(a\<mapsto>obj1),empty(x\<mapsto>Null)(This\<mapsto>Addr a))"
   140 lemma class_tprg_Object [simp]: "class tprg Object = Some (arbitrary, [], [])"
   145 lemma class_tprg_Object [simp]: "class tprg Object = Some (arbitrary, [], [])"
   141 apply (unfold ObjectC_def class_def)
   146 apply (unfold ObjectC_def class_def)
   142 apply (simp (no_asm))
   147 apply (simp (no_asm))
   143 done
   148 done
   144 
   149 
       
   150 lemma class_tprg_NP [simp]: "class tprg (Xcpt NP) = Some (Object, [], [])"
       
   151 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def)
       
   152 apply (simp (no_asm))
       
   153 done
       
   154 
       
   155 lemma class_tprg_OM [simp]: "class tprg (Xcpt OutOfMemory) = Some (Object, [], [])"
       
   156 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def)
       
   157 apply (simp (no_asm))
       
   158 done
       
   159 
       
   160 lemma class_tprg_CC [simp]: "class tprg (Xcpt ClassCast) = Some (Object, [], [])"
       
   161 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def)
       
   162 apply (simp (no_asm))
       
   163 done
       
   164 
   145 lemma class_tprg_Base [simp]: 
   165 lemma class_tprg_Base [simp]: 
   146 "class tprg Base = Some (Object,  
   166 "class tprg Base = Some (Object,  
   147     [(vee, PrimT Boolean)],  
   167     [(vee, PrimT Boolean)],  
   148           [((foo, [Class Base]), Class Base, foo_Base)])"
   168           [((foo, [Class Base]), Class Base, foo_Base)])"
   149 apply (unfold ObjectC_def BaseC_def ExtC_def class_def)
   169 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def)
   150 apply (simp (no_asm))
   170 apply (simp (no_asm))
   151 done
   171 done
   152 
   172 
   153 lemma class_tprg_Ext [simp]: 
   173 lemma class_tprg_Ext [simp]: 
   154 "class tprg Ext = Some (Base,  
   174 "class tprg Ext = Some (Base,  
   172 lemma not_Base_subcls_Ext [elim!]: "(Base, Ext) \<in> (subcls1 tprg)^+ ==> R"
   192 lemma not_Base_subcls_Ext [elim!]: "(Base, Ext) \<in> (subcls1 tprg)^+ ==> R"
   173 apply (auto dest!: tranclD subcls1D)
   193 apply (auto dest!: tranclD subcls1D)
   174 done
   194 done
   175 
   195 
   176 lemma class_tprgD: 
   196 lemma class_tprgD: 
   177 "class tprg C = Some z ==> C=Object \<or> C=Base \<or> C=Ext"
   197 "class tprg C = Some z ==> C=Object \<or> C=Base \<or> C=Ext \<or> C=Xcpt NP \<or> C=Xcpt ClassCast \<or> C=Xcpt OutOfMemory"
   178 apply (unfold ObjectC_def BaseC_def ExtC_def class_def)
   198 apply (unfold ObjectC_def ClassCastC_def NullPointerC_def OutOfMemoryC_def BaseC_def ExtC_def class_def)
   179 apply (auto split add: split_if_asm simp add: map_of_Cons)
   199 apply (auto split add: split_if_asm simp add: map_of_Cons)
   180 done
   200 done
   181 
   201 
   182 lemma not_class_subcls_class [elim!]: "(C,C) \<in> (subcls1 tprg)^+ ==> R"
   202 lemma not_class_subcls_class [elim!]: "(C,C) \<in> (subcls1 tprg)^+ ==> R"
   183 apply (auto dest!: tranclD subcls1D)
   203 apply (auto dest!: tranclD subcls1D)
   186 apply (drule rtranclD)
   206 apply (drule rtranclD)
   187 apply auto
   207 apply auto
   188 done
   208 done
   189 
   209 
   190 lemma unique_classes: "unique tprg"
   210 lemma unique_classes: "unique tprg"
   191 apply (simp (no_asm) add: ObjectC_def BaseC_def ExtC_def)
   211 apply (simp (no_asm) add: ObjectC_def BaseC_def ExtC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def)
   192 done
   212 done
   193 
   213 
   194 lemmas subcls_direct = subcls1I [THEN r_into_rtrancl]
   214 lemmas subcls_direct = subcls1I [THEN r_into_rtrancl]
   195 
   215 
   196 lemma Ext_subcls_Base [simp]: "tprg\<turnstile>Ext\<preceq>C Base"
   216 lemma Ext_subcls_Base [simp]: "tprg\<turnstile>Ext\<preceq>C Base"
   276 "wf_cdecl wf_java_mdecl tprg ObjectC"
   296 "wf_cdecl wf_java_mdecl tprg ObjectC"
   277 apply (unfold wf_cdecl_def wf_fdecl_def ObjectC_def)
   297 apply (unfold wf_cdecl_def wf_fdecl_def ObjectC_def)
   278 apply (simp (no_asm))
   298 apply (simp (no_asm))
   279 done
   299 done
   280 
   300 
       
   301 lemma wf_NP:
       
   302 "wf_cdecl wf_java_mdecl tprg NullPointerC"
       
   303 apply (unfold wf_cdecl_def wf_fdecl_def NullPointerC_def)
       
   304 apply (simp add: class_def)
       
   305 apply (fold NullPointerC_def class_def)
       
   306 apply auto
       
   307 done
       
   308 
       
   309 lemma wf_OM:
       
   310 "wf_cdecl wf_java_mdecl tprg OutOfMemoryC"
       
   311 apply (unfold wf_cdecl_def wf_fdecl_def OutOfMemoryC_def)
       
   312 apply (simp add: class_def)
       
   313 apply (fold OutOfMemoryC_def class_def)
       
   314 apply auto
       
   315 done
       
   316 
       
   317 lemma wf_CC:
       
   318 "wf_cdecl wf_java_mdecl tprg ClassCastC"
       
   319 apply (unfold wf_cdecl_def wf_fdecl_def ClassCastC_def)
       
   320 apply (simp add: class_def)
       
   321 apply (fold ClassCastC_def class_def)
       
   322 apply auto
       
   323 done
       
   324 
   281 lemma wf_BaseC: 
   325 lemma wf_BaseC: 
   282 "wf_cdecl wf_java_mdecl tprg BaseC"
   326 "wf_cdecl wf_java_mdecl tprg BaseC"
   283 apply (unfold wf_cdecl_def wf_fdecl_def BaseC_def)
   327 apply (unfold wf_cdecl_def wf_fdecl_def BaseC_def)
   284 apply (simp (no_asm))
   328 apply (simp (no_asm))
   285 apply (fold BaseC_def)
   329 apply (fold BaseC_def)
   296 apply auto
   340 apply auto
   297 apply (drule rtranclD)
   341 apply (drule rtranclD)
   298 apply auto
   342 apply auto
   299 done
   343 done
   300 
   344 
       
   345 lemma [simp]: "fst ObjectC = Object" by (simp add: ObjectC_def)
       
   346 
   301 lemma wf_tprg: 
   347 lemma wf_tprg: 
   302 "wf_prog wf_java_mdecl tprg"
   348 "wf_prog wf_java_mdecl tprg"
   303 apply (unfold wf_prog_def Let_def)
   349 apply (unfold wf_prog_def Let_def)
   304 apply(simp add: wf_ObjectC wf_BaseC wf_ExtC unique_classes)
   350 apply (simp add: wf_ObjectC wf_BaseC wf_ExtC wf_NP wf_OM wf_CC unique_classes)
       
   351 apply (rule wf_syscls)
       
   352 apply (simp add: SystemClasses_def)
   305 done
   353 done
   306 
   354 
   307 lemma appl_methds_foo_Base: 
   355 lemma appl_methds_foo_Base: 
   308 "appl_methds tprg Base (foo, [NT]) =  
   356 "appl_methds tprg Base (foo, [NT]) =  
   309   {((Class Base, Class Base), [Class Base])}"
   357   {((Class Base, Class Base), [Class Base])}"