src/HOL/Bali/Example.thy
changeset 37956 ee939247b2fb
parent 36319 8feb2c4bef1a
child 39198 f967a16dfcdd
equal deleted inserted replaced
37955:f87d1105e181 37956:ee939247b2fb
    68 (** unfortunately cannot simply instantiate tnam **)
    68 (** unfortunately cannot simply instantiate tnam **)
    69 datatype tnam'  = HasFoo' | Base' | Ext' | Main'
    69 datatype tnam'  = HasFoo' | Base' | Ext' | Main'
    70 datatype vnam'  = arr' | vee' | z' | e'
    70 datatype vnam'  = arr' | vee' | z' | e'
    71 datatype label' = lab1'
    71 datatype label' = lab1'
    72 
    72 
    73 consts
    73 axiomatization
    74 
    74   tnam' :: "tnam'  \<Rightarrow> tnam" and
    75   tnam' :: "tnam'  \<Rightarrow> tnam"
    75   vnam' :: "vnam'  \<Rightarrow> vname" and
    76   vnam' :: "vnam'  \<Rightarrow> vname"
       
    77   label':: "label' \<Rightarrow> label"
    76   label':: "label' \<Rightarrow> label"
    78 axioms  (** tnam', vnam' and label are intended to be isomorphic 
    77 where
       
    78   (** tnam', vnam' and label are intended to be isomorphic 
    79             to tnam, vname and label **)
    79             to tnam, vname and label **)
    80 
    80 
    81   inj_tnam'  [simp]: "(tnam'  x = tnam'  y) = (x = y)"
    81   inj_tnam'  [simp]: "\<And>x y. (tnam'  x = tnam'  y) = (x = y)" and
    82   inj_vnam'  [simp]: "(vnam'  x = vnam'  y) = (x = y)"
    82   inj_vnam'  [simp]: "\<And>x y. (vnam'  x = vnam'  y) = (x = y)" and
    83   inj_label' [simp]: "(label' x = label' y) = (x = y)"
    83   inj_label' [simp]: "\<And>x y. (label' x = label' y) = (x = y)" and
    84   
    84     
    85   
    85   surj_tnam':  "\<And>n. \<exists>m. n = tnam'  m" and
    86   surj_tnam':  "\<exists>m. n = tnam'  m"
    86   surj_vnam':  "\<And>n. \<exists>m. n = vnam'  m" and
    87   surj_vnam':  "\<exists>m. n = vnam'  m"
    87   surj_label':" \<And>n. \<exists>m. n = label' m"
    88   surj_label':" \<exists>m. n = label' m"
       
    89 
    88 
    90 abbreviation
    89 abbreviation
    91   HasFoo :: qtname where
    90   HasFoo :: qtname where
    92   "HasFoo == \<lparr>pid=java_lang,tid=TName (tnam' HasFoo')\<rparr>"
    91   "HasFoo == \<lparr>pid=java_lang,tid=TName (tnam' HasFoo')\<rparr>"
    93 
    92 
   147 defs
   146 defs
   148 
   147 
   149   Object_mdecls_def: "Object_mdecls \<equiv> []"
   148   Object_mdecls_def: "Object_mdecls \<equiv> []"
   150   SXcpt_mdecls_def:  "SXcpt_mdecls  \<equiv> []"
   149   SXcpt_mdecls_def:  "SXcpt_mdecls  \<equiv> []"
   151 
   150 
   152 consts
   151 axiomatization  
       
   152   foo    :: mname
       
   153 
       
   154 definition
       
   155   foo_sig :: sig
       
   156   where "foo_sig = \<lparr>name=foo,parTs=[Class Base]\<rparr>"
   153   
   157   
   154   foo    :: mname
   158 definition
   155 
   159   foo_mhead :: mhead
   156 definition foo_sig :: sig
   160   where "foo_mhead = \<lparr>access=Public,static=False,pars=[z],resT=Class Base\<rparr>"
   157  where "foo_sig   \<equiv> \<lparr>name=foo,parTs=[Class Base]\<rparr>"
   161 
   158   
   162 definition
   159 definition foo_mhead :: mhead
   163   Base_foo :: mdecl
   160  where "foo_mhead \<equiv> \<lparr>access=Public,static=False,pars=[z],resT=Class Base\<rparr>"
   164   where "Base_foo = (foo_sig, \<lparr>access=Public,static=False,pars=[z],resT=Class Base,
   161 
       
   162 definition Base_foo :: mdecl
       
   163  where "Base_foo \<equiv> (foo_sig, \<lparr>access=Public,static=False,pars=[z],resT=Class Base,
       
   164                         mbody=\<lparr>lcls=[],stmt=Return (!!z)\<rparr>\<rparr>)"
   165                         mbody=\<lparr>lcls=[],stmt=Return (!!z)\<rparr>\<rparr>)"
   165 
   166 
   166 definition Ext_foo :: mdecl
   167 definition Ext_foo :: mdecl
   167  where "Ext_foo  \<equiv> (foo_sig, 
   168   where "Ext_foo = (foo_sig, 
   168               \<lparr>access=Public,static=False,pars=[z],resT=Class Ext,
   169               \<lparr>access=Public,static=False,pars=[z],resT=Class Ext,
   169                mbody=\<lparr>lcls=[]
   170                mbody=\<lparr>lcls=[]
   170                      ,stmt=Expr({Ext,Ext,False}Cast (Class Ext) (!!z)..vee := 
   171                      ,stmt=Expr({Ext,Ext,False}Cast (Class Ext) (!!z)..vee := 
   171                                                              Lit (Intg 1)) ;;
   172                                                              Lit (Intg 1)) ;;
   172                                 Return (Lit Null)\<rparr>
   173                                 Return (Lit Null)\<rparr>
   173               \<rparr>)"
   174               \<rparr>)"
   174 
   175 
   175 definition arr_viewed_from :: "qtname \<Rightarrow> qtname \<Rightarrow> var" where
   176 definition
   176 "arr_viewed_from accC C \<equiv> {accC,Base,True}StatRef (ClassT C)..arr"
   177   arr_viewed_from :: "qtname \<Rightarrow> qtname \<Rightarrow> var"
   177 
   178   where "arr_viewed_from accC C = {accC,Base,True}StatRef (ClassT C)..arr"
   178 definition BaseCl :: "class" where
   179 
   179 "BaseCl \<equiv> \<lparr>access=Public,
   180 definition
       
   181   BaseCl :: "class" where
       
   182   "BaseCl = \<lparr>access=Public,
   180            cfields=[(arr, \<lparr>access=Public,static=True ,type=PrimT Boolean.[]\<rparr>),
   183            cfields=[(arr, \<lparr>access=Public,static=True ,type=PrimT Boolean.[]\<rparr>),
   181                     (vee, \<lparr>access=Public,static=False,type=Iface HasFoo    \<rparr>)],
   184                     (vee, \<lparr>access=Public,static=False,type=Iface HasFoo    \<rparr>)],
   182            methods=[Base_foo],
   185            methods=[Base_foo],
   183            init=Expr(arr_viewed_from Base Base 
   186            init=Expr(arr_viewed_from Base Base 
   184                      :=New (PrimT Boolean)[Lit (Intg 2)]),
   187                      :=New (PrimT Boolean)[Lit (Intg 2)]),
   185            super=Object,
   188            super=Object,
   186            superIfs=[HasFoo]\<rparr>"
   189            superIfs=[HasFoo]\<rparr>"
   187   
   190   
   188 definition ExtCl  :: "class" where
   191 definition
   189 "ExtCl  \<equiv> \<lparr>access=Public,
   192   ExtCl  :: "class" where
       
   193   "ExtCl = \<lparr>access=Public,
   190            cfields=[(vee, \<lparr>access=Public,static=False,type= PrimT Integer\<rparr>)], 
   194            cfields=[(vee, \<lparr>access=Public,static=False,type= PrimT Integer\<rparr>)], 
   191            methods=[Ext_foo],
   195            methods=[Ext_foo],
   192            init=Skip,
   196            init=Skip,
   193            super=Base,
   197            super=Base,
   194            superIfs=[]\<rparr>"
   198            superIfs=[]\<rparr>"
   195 
   199 
   196 definition MainCl :: "class" where
   200 definition
   197 "MainCl \<equiv> \<lparr>access=Public,
   201   MainCl :: "class" where
       
   202   "MainCl = \<lparr>access=Public,
   198            cfields=[], 
   203            cfields=[], 
   199            methods=[], 
   204            methods=[], 
   200            init=Skip,
   205            init=Skip,
   201            super=Object,
   206            super=Object,
   202            superIfs=[]\<rparr>"
   207            superIfs=[]\<rparr>"
   203 (* The "main" method is modeled seperately (see tprg) *)
   208 (* The "main" method is modeled seperately (see tprg) *)
   204 
   209 
   205 definition HasFooInt :: iface
   210 definition
   206  where "HasFooInt \<equiv> \<lparr>access=Public,imethods=[(foo_sig, foo_mhead)],isuperIfs=[]\<rparr>"
   211   HasFooInt :: iface
   207 
   212   where "HasFooInt = \<lparr>access=Public,imethods=[(foo_sig, foo_mhead)],isuperIfs=[]\<rparr>"
   208 definition Ifaces ::"idecl list"
   213 
   209  where "Ifaces \<equiv> [(HasFoo,HasFooInt)]"
   214 definition
   210 
   215   Ifaces ::"idecl list"
   211 definition "Classes" ::"cdecl list"
   216   where "Ifaces = [(HasFoo,HasFooInt)]"
   212  where "Classes \<equiv> [(Base,BaseCl),(Ext,ExtCl),(Main,MainCl)]@standard_classes"
   217 
       
   218 definition
       
   219   "Classes" ::"cdecl list"
       
   220   where "Classes = [(Base,BaseCl),(Ext,ExtCl),(Main,MainCl)]@standard_classes"
   213 
   221 
   214 lemmas table_classes_defs = 
   222 lemmas table_classes_defs = 
   215      Classes_def standard_classes_def ObjectC_def SXcptC_def
   223      Classes_def standard_classes_def ObjectC_def SXcptC_def
   216 
   224 
   217 lemma table_ifaces [simp]: "table_of Ifaces = empty(HasFoo\<mapsto>HasFooInt)"
   225 lemma table_ifaces [simp]: "table_of Ifaces = empty(HasFoo\<mapsto>HasFooInt)"
   262 
   270 
   263 abbreviation
   271 abbreviation
   264   tprg :: prog where
   272   tprg :: prog where
   265   "tprg == \<lparr>ifaces=Ifaces,classes=Classes\<rparr>"
   273   "tprg == \<lparr>ifaces=Ifaces,classes=Classes\<rparr>"
   266 
   274 
   267 definition test :: "(ty)list \<Rightarrow> stmt" where
   275 definition
   268  "test pTs \<equiv> e:==NewC Ext;; 
   276   test :: "(ty)list \<Rightarrow> stmt" where
       
   277   "test pTs = (e:==NewC Ext;; 
   269            \<spacespace> Try Expr({Main,ClassT Base,IntVir}!!e\<cdot>foo({pTs}[Lit Null]))
   278            \<spacespace> Try Expr({Main,ClassT Base,IntVir}!!e\<cdot>foo({pTs}[Lit Null]))
   270            \<spacespace> Catch((SXcpt NullPointer) z)
   279            \<spacespace> Catch((SXcpt NullPointer) z)
   271            (lab1\<bullet> While(Acc 
   280            (lab1\<bullet> While(Acc 
   272                         (Acc (arr_viewed_from Main Ext).[Lit (Intg 2)])) Skip)"
   281                         (Acc (arr_viewed_from Main Ext).[Lit (Intg 2)])) Skip))"
   273 
   282 
   274 
   283 
   275 section "well-structuredness"
   284 section "well-structuredness"
   276 
   285 
   277 lemma not_Object_subcls_any [elim!]: "(Object, C) \<in> (subcls1 tprg)^+ \<Longrightarrow> R"
   286 lemma not_Object_subcls_any [elim!]: "(Object, C) \<in> (subcls1 tprg)^+ \<Longrightarrow> R"
  1183         (simplify (@{simpset} delsimps @{thms Skip_eq}
  1192         (simplify (@{simpset} delsimps @{thms Skip_eq}
  1184                              addsimps @{thms lvar_def}) o 
  1193                              addsimps @{thms lvar_def}) o 
  1185          rewrite_rule [@{thm assign_def}, @{thm Let_def}]) @{thms eval.intros}) *}
  1194          rewrite_rule [@{thm assign_def}, @{thm Let_def}]) @{thms eval.intros}) *}
  1186 lemmas eval_Is = eval_Init eval_StatRef AbruptIs eval_intros
  1195 lemmas eval_Is = eval_Init eval_StatRef AbruptIs eval_intros
  1187 
  1196 
  1188 consts
  1197 axiomatization
  1189   a :: loc
  1198   a :: loc and
  1190   b :: loc
  1199   b :: loc and
  1191   c :: loc
  1200   c :: loc
  1192 
  1201 
  1193 abbreviation "one == Suc 0"
  1202 abbreviation "one == Suc 0"
  1194 abbreviation "two == Suc one"
  1203 abbreviation "two == Suc one"
  1195 abbreviation "three == Suc two"
  1204 abbreviation "three == Suc two"