Types.thy

Back to the index of BV_ASCII
Types = WellForm + Exec +

datatype 
 prim = Integer 

datatype 
  Rt	= NT		
	| IT cname
	| CT cname
	| AT tys 
and
 tys	= PTS prim	
	| RTS (Rt list)

constdefs
 get_RTS :: "tys => Rt list"
 "get_RTS x == @rs. x = RTS rs"

types
 refs = Rt list

datatype
 tyOrVoid	= Void
		| TY tys
datatype
 any		= Unusable
		| US tys

syntax
 Prim :: "prim => any"	
 Refs :: "(Rt list) => any"	
translations
 "Prim p" == "US (PTS p)"
 "Prim" == "US o PTS"
 "Refs r" == "US (RTS r)"
 "Refs" == "US o RTS"

constdefs
 sup_any :: "[any,any] => bool" ("_ >= _")
 "a >= a' ==
    case a of
      Unusable => True
    | US ts    =>  case a' of 
		     Unusable => False
		   | US ts' => case ts of
	         		 PTS pr => ts=ts'
	       		       | RTS rs => ? rs'. ts' = RTS rs' &  set rs'  <=  set rs" 

consts
 fd2tys :: "[bytecode,field_desc] => tys"
primrec
 "fd2tys CFS I       = PTS Integer"
 "fd2tys CFS (L cn)  = RTS [if is_interface (CFS !! cn) then IT cn else CT cn]"		
 "fd2tys CFS (A fd)  = RTS [AT (fd2tys CFS fd)]"


syntax
 fd2any :: "[bytecode,field_desc] => any"
translations
"fd2any CFS fd" == "US (fd2tys CFS fd)"
"fd2any CFS" == "US o (fd2tys CFS)"

consts
 rd2tyOrVoid :: "[bytecode,return_desc] => tyOrVoid"
primrec
 "rd2tyOrVoid CFS (FT fd) = TY (fd2tys CFS fd)"
 "rd2tyOrVoid CFS V       = Void"

end




Theorems proved in Types.ML:

nth_zip
i < length l ==> (k ! i, l ! i) = zip k l ! i

length_zip
length (zip k l) = length l

map_eq_Cons
(map f xs = y # ys) = (? x xs'. xs = x # xs' & f x = y & map f xs' = ys)

prim_eq_Integer
x = Integer

sup_PTS_eq
X >= Prim Integer = (X = Unusable | X = Prim Integer)

sup_RTS_eq
X >= Refs rs' = (X = Unusable | (? rs. X = Refs rs & set rs' <= set rs))

fd2ty_PT
fd2tys CFS fd = PTS pt ==> fd = I

PT_imp_default_val_0
fd2tys CFS fd = PTS pt ==> default_val fd = Intg #0

RT_imp_default_val_Null
fd2tys CFS fd = RTS rt ==> default_val fd = Null

rd2tyOrVoid_Void
(rd2tyOrVoid CFS rd = Void) = (rd = V)

rd2tyOrVoid_TY
(rd2tyOrVoid CFS rd = TY tys) = (? fd. rd = FT fd & tys = fd2tys CFS fd)

get_RTS_RTS
get_RTS (RTS rt) = rt