Example.thy

Back to the index of Bali_ASCII2
(*  Title:      isabelle/Bali/Example.thy
    ID:         $Id: Example.thy,v 1.2 1998/04/08 15:26:59 oheimb Exp $
    Author:     David von Oheimb
    Copyright   1997 Technische Universitaet Muenchen

The following Bali example program includes:
 class declarations with inheritance, hiding of fields, and overriding of
  methods (with refined result type), 
 instance creation, local assignment, sequential composition,
 try & catch, method call with dynamic binding, literal values,
 expression statement, local access, type cast, field assignment (in part), skip

class Base {
  boolean vee;
  Base foo(Base x) {return x;}
}

class Ext extends Base{
  int vee;
  Ext foo(Base x) {((Ext)x).vee=1; return null;}
}


class Example {
  public static void main (String args[]) {
    Base e;
    e=new Ext();
    try {e.foo(null); }
    catch (NullPointerException x) {}
  }
}
*)

Example = Eval + 

datatype tnam_ = Base_ | Ext_
datatype enam_ = vee_  | x_ | e_

consts

  tnam_ :: "tnam_ => tnam"
  enam_ :: "enam_ => enam"

rules (* tnam_ and enam_ are intended to be isomorphic to tnam and enam *)

  inj_tnam_  "(tnam_ x = tnam_ y) = (x = y)"
  inj_enam_  "(enam_ x = enam_ y) = (x = y)"

  surj_tnam_ "? m. n = tnam_ m"
  surj_enam_ "? m. n = enam_ m"






syntax

  Base,  Ext	:: tname
  vee, x, e	:: ename

translations

  "Base" == "TName (tnam_ Base_)"
  "Ext"	 == "TName (tnam_ Ext_)"
  "vee"  == "EName (enam_ vee_)"
  "x"	 == "EName (enam_ x_)"
  "e"	 == "EName (enam_ e_)"


consts

  system_classes :: cdecl list
  tprg		 :: prog
  BaseC, ExtC    :: cdecl
  test		 :: stmt
  foo	         :: mname
  a,b		 :: loc

defs

  BaseC_def     "BaseC == (Base, (Some Object, [], 
				[(vee, PrimT Boolean)], 
				[((foo,Class Base),(x,Class Base),
				  ([],Skip,LAcc x))]))"
  ExtC_def	"ExtC  == (Ext,  (Some Base  , [], 
				[(vee, PrimT IntDefer)], 
				[((foo,Class Base),(x,Class Ext),
				  ([],Expr(Cast (Class Ext) (LAcc x).{ClassT 
				      Ext}vee:=Lit (Intg ($#1))),Lit Null))]))"

  system_classes_def "system_classes == [ObjectC, SXcptC Throwable,
		SXcptC NullPointer, SXcptC OutOfMemory, SXcptC ClassCast,
		SXcptC NegArrSize , SXcptC IndOutBound, SXcptC ArrStore]"

  tprg_def "tprg == ([],system_classes@[BaseC,ExtC])"

  test_def "test == Expr(e:=NewC Ext);; 
		   Try Expr(LAcc e..foo{Class Base}(Lit Null))
		   Catch(SXcpt NullPointer x) (Throw (LAcc x))"












syntax

  NP		:: xname
  "classes"	:: cdecl list
  obj1, obj2	:: obj
  s0,s1,s2,s3,s4,s5,s6,s7:: state

translations

  "NP"   == "NullPointer"
  "classes" == "[ObjectC, SXcptC Throwable, 
		 SXcptC NP         , SXcptC OutOfMemory, SXcptC ClassCast, 
		 SXcptC NegArrSize , SXcptC IndOutBound, SXcptC ArrStore , 
		 BaseC, ExtC]"
  "obj1" == "Obj Ext (empty[(vee, ClassT Base)|->Bool False ]
                           [(vee, ClassT Ext )|->Intg ($# 0)])"
  "obj2" == "Obj (SXcpt NP) empty"
  "s0" == " Norm              (empty                ,empty)"
  "s1" == " Norm              (empty[a|->obj1]        ,empty[e|->Addr a])"
  "s2" == " Norm              (empty[a|->obj1]        , 
						empty[This|->Addr a][x|->Null])"
  "s3" == "(Some (SysXcpt NP), empty[a|->obj1]        , 
						empty[This|->Addr a][x|->Null])"
  "s4" == "(Some (SysXcpt NP), empty[a|->obj1]        ,empty[e|->Addr a])"
  "s5" == "(Some (XcptLoc b ), empty[a|->obj1][b|->obj2],empty[e|->Addr a])"
  "s6" == " Norm              (empty[a|->obj1][b|->obj2],empty[e|->Addr a][x|->Addr b])"
  "s7" == "(Some (XcptLoc b ), empty[a|->obj1][b|->obj2],empty[e|->Addr a][x|->Addr b])"

end