| 8011 |      1 | (*  Title:      HOL/MicroJava/J/State.ML
 | 
|  |      2 |     ID:         $Id$
 | 
|  |      3 |     Author:     David von Oheimb
 | 
|  |      4 |     Copyright   1999 Technische Universitaet Muenchen
 | 
|  |      5 | *)
 | 
|  |      6 | 
 | 
|  |      7 | val the_Addr_Addr = prove_goalw thy [the_Addr_def] 
 | 
|  |      8 | 	"the_Addr (Addr a) = a" (K [Auto_tac]);
 | 
|  |      9 | 
 | 
|  |     10 | Addsimps [the_Addr_Addr];
 | 
|  |     11 | 
 | 
|  |     12 | val obj_ty_def2 = prove_goalw thy [obj_ty_def] "obj_ty (C,fs) = Class C" 
 | 
|  |     13 | 	(K [Simp_tac 1]);
 | 
|  |     14 | 
 | 
|  |     15 | Addsimps [obj_ty_def2];
 | 
|  |     16 | 
 | 
|  |     17 | val new_AddrD = prove_goalw thy [new_Addr_def] 
 | 
|  |     18 | "\\<And>X. (a,x) = new_Addr h \\<Longrightarrow> h a = None \\<and>  x = None |  x = Some OutOfMemory" (K[
 | 
|  |     19 | 	asm_full_simp_tac (simpset() addsimps [Pair_fst_snd_eq,select_split]) 1,
 | 
|  |     20 | 	rtac selectI 1,
 | 
|  |     21 | 	rtac disjI2 1,
 | 
|  |     22 | 	res_inst_tac [("r","snd (a,Some OutOfMemory)")] trans 1,
 | 
|  |     23 | 	 Auto_tac ]);
 | 
|  |     24 | 
 | 
|  |     25 | val raise_if_True = prove_goalw thy [raise_if_def] 
 | 
|  |     26 | 	"raise_if True x y \\<noteq> None"
 | 
|  |     27 | (K [split_tac [expand_if] 1,Auto_tac]);
 | 
|  |     28 | 
 | 
|  |     29 | val raise_if_False = prove_goalw thy [raise_if_def] 
 | 
|  |     30 | 	"raise_if False x y = y"
 | 
|  |     31 | (K [Auto_tac]);
 | 
|  |     32 | 
 | 
|  |     33 | val raise_if_Some = prove_goalw thy [raise_if_def] 
 | 
|  |     34 | 	"raise_if c x (Some y) \\<noteq> None" (K [Auto_tac]);
 | 
|  |     35 | 
 | 
|  |     36 | val raise_if_Some2 = prove_goalw thy [raise_if_def] 
 | 
|  |     37 | "raise_if c z (if x = None then Some y else x) \\<noteq> None" (K[
 | 
|  |     38 | 	induct_tac "x" 1,
 | 
|  |     39 | 	Auto_tac]);
 | 
|  |     40 | val if_None_eq = prove_goal thy 
 | 
|  |     41 | "(if x = None then None else x) = x" (K[
 | 
|  |     42 | 	induct_tac "x" 1,
 | 
|  |     43 | 	Auto_tac]);
 | 
|  |     44 | 
 | 
|  |     45 | Addsimps [raise_if_True,raise_if_False,raise_if_Some,raise_if_Some2,if_None_eq];
 | 
|  |     46 | 
 | 
|  |     47 | val raise_if_SomeD = prove_goalw thy [raise_if_def] 
 | 
|  |     48 | 	"raise_if c x y = Some z \\<longrightarrow> c \\<and>  Some z = Some x |  y = Some z" 
 | 
|  |     49 | (K [split_tac [expand_if] 1,Auto_tac]) RS mp;
 | 
|  |     50 | 
 | 
|  |     51 | val raise_if_NoneD = prove_goalw thy [raise_if_def] 
 | 
|  |     52 | 	"raise_if c x y = None \\<longrightarrow> \\<not> c \\<and>  y = None"
 | 
|  |     53 | (K [split_tac [expand_if] 1,Auto_tac]) RS mp;
 | 
|  |     54 | 
 | 
|  |     55 | 
 | 
|  |     56 | val np_NoneD = (prove_goalw thy [np_def, raise_if_def] 
 | 
|  |     57 | 	"np a' x' = None \\<longrightarrow> x' = None \\<and>  a' \\<noteq> Null" (fn _ => [
 | 
|  |     58 | 	split_tac [expand_if] 1,
 | 
|  |     59 | 	Auto_tac ])) RS mp;
 | 
|  |     60 | val np_None = (prove_goalw thy [np_def, raise_if_def] 
 | 
|  |     61 | 	"a' \\<noteq> Null \\<longrightarrow> np a' x' = x'" (fn _ => [
 | 
|  |     62 | 	split_tac [expand_if] 1,
 | 
|  |     63 | 	Auto_tac ])) RS mp;
 | 
|  |     64 | val np_Some = prove_goalw thy [np_def, raise_if_def] "np a' (Some xc) = Some xc"
 | 
|  |     65 | 	(fn _ => [Auto_tac ]);
 | 
|  |     66 | val np_Null = prove_goalw thy [np_def, raise_if_def] 
 | 
|  |     67 | 	"np Null None = Some NullPointer" (fn _ => [
 | 
|  |     68 | 	Auto_tac ]);
 | 
|  |     69 | val np_Addr = prove_goalw thy [np_def, raise_if_def] "np (Addr a) None = None" 
 | 
|  |     70 | 	(fn _ => [Auto_tac ]);
 | 
|  |     71 | Addsimps[np_None, np_Some,np_Null,np_Addr];
 | 
|  |     72 | 
 | 
|  |     73 | 
 | 
|  |     74 | 
 | 
|  |     75 | 
 | 
|  |     76 | 
 | 
|  |     77 | 
 |