src/HOL/MicroJava/J/Conform.ML
author nipkow
Thu, 11 Nov 1999 12:23:45 +0100
changeset 8011 d14c4e9e9c8e
child 8032 1eaae1a2f8ff
permissions -rw-r--r--
*** empty log message ***
nipkow@8011
     1
(*  Title:      HOL/MicroJava/J/Conform.ML
nipkow@8011
     2
    ID:         $Id$
nipkow@8011
     3
    Author:     David von Oheimb
nipkow@8011
     4
    Copyright   1999 Technische Universitaet Muenchen
nipkow@8011
     5
*)
nipkow@8011
     6
nipkow@8011
     7
section "hext";
nipkow@8011
     8
nipkow@8011
     9
val hextI = prove_goalw thy [hext_def] "\\<And>h. \
nipkow@8011
    10
\ \\<forall>a C fs . h  a = Some (C,fs) \\<longrightarrow>  \
nipkow@8011
    11
\     (\\<exists>fs'. h' a = Some (C,fs')) \\<Longrightarrow> h\\<le>|h'" (K [Auto_tac ]);
nipkow@8011
    12
nipkow@8011
    13
val hext_objD = prove_goalw thy [hext_def] 
nipkow@8011
    14
"\\<And>h. \\<lbrakk>h\\<le>|h'; h a = Some (C,fs) \\<rbrakk> \\<Longrightarrow> \\<exists>fs'. h' a = Some (C,fs')" 
nipkow@8011
    15
	(K [Force_tac 1]);
nipkow@8011
    16
nipkow@8011
    17
val hext_refl = prove_goal thy "h\\<le>|h" (K [
nipkow@8011
    18
	rtac hextI 1,
nipkow@8011
    19
	Fast_tac 1]);
nipkow@8011
    20
nipkow@8011
    21
val hext_new = prove_goal thy "\\<And>h. h a = None \\<Longrightarrow> h\\<le>|h(a\\<mapsto>x)" (K [
nipkow@8011
    22
	rtac hextI 1,
nipkow@8011
    23
	safe_tac HOL_cs,
nipkow@8011
    24
	 ALLGOALS (case_tac "aa = a"),
nipkow@8011
    25
	   Auto_tac]);
nipkow@8011
    26
nipkow@8011
    27
val hext_trans = prove_goal thy "\\<And>h. \\<lbrakk>h\\<le>|h'; h'\\<le>|h''\\<rbrakk> \\<Longrightarrow> h\\<le>|h''" (K [
nipkow@8011
    28
	rtac hextI 1,
nipkow@8011
    29
	safe_tac HOL_cs,
nipkow@8011
    30
	 fast_tac (HOL_cs addDs [hext_objD]) 1]);
nipkow@8011
    31
nipkow@8011
    32
Addsimps [hext_refl, hext_new];
nipkow@8011
    33
nipkow@8011
    34
val hext_upd_obj = prove_goal thy 
nipkow@8011
    35
"\\<And>h. h a = Some (C,fs) \\<Longrightarrow> h\\<le>|h(a\\<mapsto>(C,fs'))" (K [
nipkow@8011
    36
	rtac hextI 1,
nipkow@8011
    37
	safe_tac HOL_cs,
nipkow@8011
    38
	 ALLGOALS (case_tac "aa = a"),
nipkow@8011
    39
	   Auto_tac]);
nipkow@8011
    40
nipkow@8011
    41
nipkow@8011
    42
section "conf";
nipkow@8011
    43
nipkow@8011
    44
val conf_Null = prove_goalw thy [conf_def] 
nipkow@8011
    45
"G,h\\<turnstile>Null\\<Colon>\\<preceq>T = G\\<turnstile>RefT NullT\\<preceq>T" (K [Simp_tac 1]);
nipkow@8011
    46
Addsimps [conf_Null];
nipkow@8011
    47
nipkow@8011
    48
val conf_litval = prove_goalw thy [conf_def] 
nipkow@8011
    49
"typeof (\\<lambda>v. None) v = Some T \\<longrightarrow> G,h\\<turnstile>v\\<Colon>\\<preceq>T" (K [
nipkow@8011
    50
	rtac val_.induct 1,
nipkow@8011
    51
	    Auto_tac]) RS mp;
nipkow@8011
    52
nipkow@8011
    53
val conf_AddrI = prove_goalw thy [conf_def] 
nipkow@8011
    54
"\\<And>G. \\<lbrakk>h a = Some obj; G\\<turnstile>obj_ty obj\\<preceq>T\\<rbrakk> \\<Longrightarrow> G,h\\<turnstile>Addr a\\<Colon>\\<preceq>T"
nipkow@8011
    55
(K [Asm_full_simp_tac 1]);
nipkow@8011
    56
nipkow@8011
    57
val conf_obj_AddrI = prove_goalw thy [conf_def]
nipkow@8011
    58
 "\\<And>G. \\<lbrakk>h a = Some (C,fs); G\\<turnstile>Class C\\<preceq>Class D\\<rbrakk> \\<Longrightarrow> G,h\\<turnstile>Addr a\\<Colon>\\<preceq>Class D" 
nipkow@8011
    59
(K [Asm_full_simp_tac 1]);
nipkow@8011
    60
nipkow@8011
    61
Goalw [conf_def] "is_type G T \\<longrightarrow> G,h\\<turnstile>default_val T\\<Colon>\\<preceq>T";
nipkow@8011
    62
by (Simp_tac 1);
nipkow@8011
    63
by (res_inst_tac [("y","T")] ty.exhaust 1);
nipkow@8011
    64
by  (etac ssubst 1);
nipkow@8011
    65
by  (res_inst_tac [("y","prim_ty")] prim_ty.exhaust 1);
nipkow@8011
    66
by    (auto_tac (claset(), simpset() addsimps [widen.null]));
nipkow@8011
    67
qed_spec_mp "defval_conf";
nipkow@8011
    68
nipkow@8011
    69
val conf_upd_obj = prove_goalw thy [conf_def] 
nipkow@8011
    70
"h a = Some (C,fs) \\<longrightarrow> (G,h(a\\<mapsto>(C,fs'))\\<turnstile>x\\<Colon>\\<preceq>T) = (G,h\\<turnstile>x\\<Colon>\\<preceq>T)" (fn _ => [
nipkow@8011
    71
	rtac impI 1,
nipkow@8011
    72
	rtac val_.induct 1,
nipkow@8011
    73
	 ALLGOALS Simp_tac,
nipkow@8011
    74
	case_tac "loc = a" 1,
nipkow@8011
    75
	 ALLGOALS Asm_simp_tac]) RS mp;
nipkow@8011
    76
nipkow@8011
    77
val conf_widen = prove_goalw thy [conf_def] 
nipkow@8011
    78
"\\<And>G. wf_prog wtm G \\<Longrightarrow> G,h\\<turnstile>x\\<Colon>\\<preceq>T \\<longrightarrow> G\\<turnstile>T\\<preceq>T' \\<longrightarrow> G,h\\<turnstile>x\\<Colon>\\<preceq>T'" (K [
nipkow@8011
    79
	rtac val_.induct 1,
nipkow@8011
    80
	    ALLGOALS Simp_tac,
nipkow@8011
    81
	    ALLGOALS (fast_tac (HOL_cs addIs [widen_trans]))]) RS mp RS mp;
nipkow@8011
    82
nipkow@8011
    83
val conf_hext' = prove_goalw thy [conf_def] 
nipkow@8011
    84
	"\\<And>h. h\\<le>|h' \\<Longrightarrow> (\\<forall>v T. G,h\\<turnstile>v\\<Colon>\\<preceq>T \\<longrightarrow> G,h'\\<turnstile>v\\<Colon>\\<preceq>T)" (K [
nipkow@8011
    85
	REPEAT (rtac allI 1),
nipkow@8011
    86
	rtac val_.induct 1,
nipkow@8011
    87
	 ALLGOALS Simp_tac,
nipkow@8011
    88
	safe_tac (HOL_cs addSDs [option_map_SomeD]),
nipkow@8011
    89
	rewtac option_map_def,
nipkow@8011
    90
	  dtac hext_objD 1,
nipkow@8011
    91
	   Auto_tac]);
nipkow@8011
    92
val conf_hext = conf_hext' RS spec RS spec RS mp;
nipkow@8011
    93
nipkow@8011
    94
val new_locD = prove_goalw thy [conf_def] 
nipkow@8011
    95
	"\\<lbrakk>h a = None; G,h\\<turnstile>Addr t\\<Colon>\\<preceq>T\\<rbrakk> \\<Longrightarrow> t\\<noteq>a" (fn prems => [
nipkow@8011
    96
	cut_facts_tac prems 1,
nipkow@8011
    97
	Full_simp_tac 1,
nipkow@8011
    98
	safe_tac HOL_cs,
nipkow@8011
    99
	Asm_full_simp_tac 1]);
nipkow@8011
   100
nipkow@8011
   101
val conf_RefTD = prove_goalw thy [conf_def] "G,h\\<turnstile>a'\\<Colon>\\<preceq>RefT T \\<longrightarrow> a' = Null |  \
nipkow@8011
   102
\ (\\<exists>a obj T'. a' = Addr a \\<and>  h a = Some obj \\<and>  obj_ty obj = T' \\<and>  G\\<turnstile>T'\\<preceq>RefT T)" (K [
nipkow@8011
   103
	induct_tac "a'" 1,
nipkow@8011
   104
	    Auto_tac,
nipkow@8011
   105
	    REPEAT (etac widen_PrimT_RefT 1)]) RS mp;
nipkow@8011
   106
nipkow@8011
   107
val conf_NullTD = prove_goal thy "\\<And>G. G,h\\<turnstile>a'\\<Colon>\\<preceq>RefT NullT \\<Longrightarrow> a' = Null" (K [
nipkow@8011
   108
	dtac conf_RefTD 1,
nipkow@8011
   109
	Step_tac 1,
nipkow@8011
   110
	 Auto_tac,
nipkow@8011
   111
	 etac widen_Class_NullT 1]);
nipkow@8011
   112
nipkow@8011
   113
val non_npD = prove_goal thy "\\<And>G. \\<lbrakk>a' \\<noteq> Null; G,h\\<turnstile>a'\\<Colon>\\<preceq>RefT t\\<rbrakk> \\<Longrightarrow> \
nipkow@8011
   114
\ \\<exists>a C fs. a' = Addr a \\<and>  h a = Some (C,fs) \\<and>  G\\<turnstile>Class C\\<preceq>RefT t" (K [
nipkow@8011
   115
	dtac conf_RefTD 1,
nipkow@8011
   116
	Step_tac 1,
nipkow@8011
   117
	 Auto_tac]);
nipkow@8011
   118
nipkow@8011
   119
val non_np_objD = prove_goal thy "\\<And>G. \\<lbrakk>a' \\<noteq> Null; G,h\\<turnstile>a'\\<Colon>\\<preceq>Class C; C \\<noteq> Object\\<rbrakk> \\<Longrightarrow> \
nipkow@8011
   120
\ (\\<exists>a C' fs. a' = Addr a \\<and>  h a = Some (C',fs) \\<and>  G\\<turnstile>Class C'\\<preceq>Class C)" 
nipkow@8011
   121
	(K[fast_tac (HOL_cs addDs [non_npD]) 1]);
nipkow@8011
   122
nipkow@8011
   123
Goal "a' \\<noteq> Null \\<longrightarrow> wf_prog wtm G \\<longrightarrow> G,h\\<turnstile>a'\\<Colon>\\<preceq>RefT t \\<longrightarrow>\
nipkow@8011
   124
\ (\\<forall>C. t = ClassT C \\<longrightarrow> C \\<noteq> Object) \\<longrightarrow> \
nipkow@8011
   125
\ (\\<exists>a C fs. a' = Addr a \\<and>  h a = Some (C,fs) \\<and>  G\\<turnstile>Class C\\<preceq>RefT t)";
nipkow@8011
   126
by (rtac impI 1);
nipkow@8011
   127
by (rtac impI 1);
nipkow@8011
   128
by (res_inst_tac [("y","t")] ref_ty.exhaust 1);
nipkow@8011
   129
by    (safe_tac HOL_cs);
nipkow@8011
   130
by   (dtac conf_NullTD 1);
nipkow@8011
   131
by   (contr_tac 1);
nipkow@8011
   132
by  (etac non_np_objD 1);
nipkow@8011
   133
by   (atac 1);
nipkow@8011
   134
by  (Fast_tac 1);
nipkow@8011
   135
qed_spec_mp "non_np_objD'";
nipkow@8011
   136
nipkow@8011
   137
Goal "wf_prog wtm G \\<Longrightarrow> \\<forall>Ts Ts'. list_all2 (conf G h) vs Ts \\<longrightarrow> list_all2 (\\<lambda>T T'. G\\<turnstile>T\\<preceq>T') Ts Ts' \\<longrightarrow>  list_all2 (conf G h) vs Ts'";
nipkow@8011
   138
by( induct_tac "vs" 1);
nipkow@8011
   139
by(  ALLGOALS Clarsimp_tac);
nipkow@8011
   140
by(  ALLGOALS (forward_tac [list_all2_lengthD RS sym]));
nipkow@8011
   141
by(  ALLGOALS (full_simp_tac (simpset()addsimps[length_Suc_conv])));
nipkow@8011
   142
by(  Safe_tac);
nipkow@8011
   143
by(  rotate_tac ~1 1);
nipkow@8011
   144
by(  ALLGOALS (forward_tac [list_all2_lengthD RS sym]));
nipkow@8011
   145
by(  ALLGOALS (full_simp_tac (simpset()addsimps[length_Suc_conv])));
nipkow@8011
   146
by(  ALLGOALS Clarify_tac);
nipkow@8011
   147
by( fast_tac (claset() addEs [conf_widen]) 1);
nipkow@8011
   148
qed_spec_mp "conf_list_gext_widen";
nipkow@8011
   149
nipkow@8011
   150
nipkow@8011
   151
section "lconf";
nipkow@8011
   152
nipkow@8011
   153
val lconfD = prove_goalw thy [lconf_def] 
nipkow@8011
   154
   "\\<And>X. \\<lbrakk> G,h\\<turnstile>vs[\\<Colon>\\<preceq>]Ts; Ts n = Some T \\<rbrakk> \\<Longrightarrow> G,h\\<turnstile>(the (vs n))\\<Colon>\\<preceq>T"
nipkow@8011
   155
 (K [Force_tac 1]);
nipkow@8011
   156
nipkow@8011
   157
val lconf_hext = prove_goalw thy [lconf_def] 
nipkow@8011
   158
	"\\<And>X. \\<lbrakk> G,h\\<turnstile>l[\\<Colon>\\<preceq>]L; h\\<le>|h' \\<rbrakk> \\<Longrightarrow> G,h'\\<turnstile>l[\\<Colon>\\<preceq>]L" (K [
nipkow@8011
   159
		fast_tac (claset() addEs [conf_hext]) 1]);
nipkow@8011
   160
AddEs [lconf_hext];
nipkow@8011
   161
nipkow@8011
   162
Goalw [lconf_def] "\\<And>X. \\<lbrakk> G,h\\<turnstile>l[\\<Colon>\\<preceq>]lT; \
nipkow@8011
   163
\ G,h\\<turnstile>v\\<Colon>\\<preceq>T; lT va = Some T \\<rbrakk> \\<Longrightarrow> G,h\\<turnstile>l(va\\<mapsto>v)[\\<Colon>\\<preceq>]lT";
nipkow@8011
   164
by( Clarify_tac 1);
nipkow@8011
   165
by( case_tac "n = va" 1);
nipkow@8011
   166
 by Auto_tac;
nipkow@8011
   167
qed "lconf_upd";
nipkow@8011
   168
nipkow@8011
   169
Goal "\\<forall>x. P x \\<longrightarrow> R (dv x) x \\<Longrightarrow> (\\<forall>x. map_of fs f = Some x \\<longrightarrow> P x) \\<longrightarrow> \
nipkow@8011
   170
\ (\\<forall>T. map_of fs f = Some T \\<longrightarrow> \
nipkow@8011
   171
\ (\\<exists>v. map_of (map (\\<lambda>(f,ft). (f, dv ft)) fs) f = Some v \\<and>  R v T))";
nipkow@8011
   172
by( induct_tac "fs" 1);
nipkow@8011
   173
by Auto_tac;
nipkow@8011
   174
qed_spec_mp "lconf_init_vars_lemma";
nipkow@8011
   175
nipkow@8011
   176
Goalw [lconf_def, init_vars_def] 
nipkow@8011
   177
"\\<forall>n. \\<forall>T. map_of fs n = Some T \\<longrightarrow> is_type G T \\<Longrightarrow> G,h\\<turnstile>init_vars fs[\\<Colon>\\<preceq>]map_of fs";
nipkow@8011
   178
by Auto_tac;
nipkow@8011
   179
by( rtac lconf_init_vars_lemma 1);
nipkow@8011
   180
by(   atac 3);
nipkow@8011
   181
by(  strip_tac 1);
nipkow@8011
   182
by(  etac defval_conf 1);
nipkow@8011
   183
by Auto_tac;
nipkow@8011
   184
qed "lconf_init_vars";
nipkow@8011
   185
AddSIs [lconf_init_vars];
nipkow@8011
   186
nipkow@8011
   187
val lconf_ext = prove_goalw thy [lconf_def] 
nipkow@8011
   188
"\\<And>X. \\<lbrakk>G,s\\<turnstile>l[\\<Colon>\\<preceq>]L; G,s\\<turnstile>v\\<Colon>\\<preceq>T\\<rbrakk> \\<Longrightarrow> G,s\\<turnstile>l(vn\\<mapsto>v)[\\<Colon>\\<preceq>]L(vn\\<mapsto>T)" 
nipkow@8011
   189
	(K [Auto_tac]);
nipkow@8011
   190
nipkow@8011
   191
Goalw [lconf_def] "G,h\\<turnstile>l[\\<Colon>\\<preceq>]L \\<Longrightarrow> \\<forall>vs Ts. nodups vns \\<longrightarrow> length Ts = length vns \\<longrightarrow> list_all2 (\\<lambda>v T. G,h\\<turnstile>v\\<Colon>\\<preceq>T) vs Ts \\<longrightarrow> G,h\\<turnstile>l(vns[\\<mapsto>]vs)[\\<Colon>\\<preceq>]L(vns[\\<mapsto>]Ts)";
nipkow@8011
   192
by( induct_tac "vns" 1);
nipkow@8011
   193
by(  ALLGOALS Clarsimp_tac);
nipkow@8011
   194
by( forward_tac [list_all2_lengthD] 1);
nipkow@8011
   195
by( auto_tac (claset(), simpset() addsimps [length_Suc_conv]));
nipkow@8011
   196
qed_spec_mp "lconf_ext_list";
nipkow@8011
   197
nipkow@8011
   198
nipkow@8011
   199
section "oconf";
nipkow@8011
   200
nipkow@8011
   201
val oconf_hext = prove_goalw thy [oconf_def] 
nipkow@8011
   202
"\\<And>X. G,h\\<turnstile>obj\\<surd> \\<Longrightarrow> h\\<le>|h' \\<Longrightarrow> G,h'\\<turnstile>obj\\<surd>" (K [Fast_tac 1]);
nipkow@8011
   203
nipkow@8011
   204
val oconf_obj = prove_goalw thy [oconf_def,lconf_def] "G,h\\<turnstile>(C,fs)\\<surd> = \
nipkow@8011
   205
\ (\\<forall>T f. map_of(fields (G,C)) f = Some T \\<longrightarrow> (\\<exists>v. fs f = Some v \\<and>  G,h\\<turnstile>v\\<Colon>\\<preceq>T))"(K [
nipkow@8011
   206
	Auto_tac]);
nipkow@8011
   207
nipkow@8011
   208
val oconf_objD = oconf_obj RS iffD1 RS spec RS spec RS mp;
nipkow@8011
   209
nipkow@8011
   210
nipkow@8011
   211
section "hconf";
nipkow@8011
   212
nipkow@8011
   213
Goalw [hconf_def] "\\<lbrakk>G,h\\<turnstile>\\<surd>; h a = Some obj\\<rbrakk> \\<Longrightarrow> G,h\\<turnstile>obj\\<surd>";
nipkow@8011
   214
by (Fast_tac 1);
nipkow@8011
   215
qed "hconfD";
nipkow@8011
   216
nipkow@8011
   217
Goalw [hconf_def] "\\<forall>a obj. h a=Some obj \\<longrightarrow> G,h\\<turnstile>obj\\<surd> \\<Longrightarrow> G,h\\<turnstile>\\<surd>";
nipkow@8011
   218
by (Fast_tac 1);
nipkow@8011
   219
qed "hconfI";
nipkow@8011
   220
nipkow@8011
   221
nipkow@8011
   222
section "conforms";
nipkow@8011
   223
nipkow@8011
   224
val conforms_heapD = prove_goalw thy [conforms_def]
nipkow@8011
   225
	"(h, l)\\<Colon>\\<preceq>(G, lT) \\<Longrightarrow> G,h\\<turnstile>\\<surd>"
nipkow@8011
   226
	(fn prems => [cut_facts_tac prems 1, Asm_full_simp_tac 1]);
nipkow@8011
   227
nipkow@8011
   228
val conforms_localD = prove_goalw thy [conforms_def]
nipkow@8011
   229
	 "(h, l)\\<Colon>\\<preceq>(G, lT) \\<Longrightarrow> G,h\\<turnstile>l[\\<Colon>\\<preceq>]lT" (fn prems => [
nipkow@8011
   230
	cut_facts_tac prems 1, Asm_full_simp_tac 1]);
nipkow@8011
   231
nipkow@8011
   232
val conformsI = prove_goalw thy [conforms_def] 
nipkow@8011
   233
"\\<lbrakk>G,h\\<turnstile>\\<surd>; G,h\\<turnstile>l[\\<Colon>\\<preceq>]lT\\<rbrakk> \\<Longrightarrow> (h, l)\\<Colon>\\<preceq>(G, lT)" (fn prems => [
nipkow@8011
   234
	cut_facts_tac prems 1,
nipkow@8011
   235
	Simp_tac 1,
nipkow@8011
   236
	Auto_tac]);
nipkow@8011
   237
nipkow@8011
   238
Goal "\\<lbrakk>(h,l)\\<Colon>\\<preceq>(G,lT); h\\<le>|h'; G,h'\\<turnstile>\\<surd> \\<rbrakk> \\<Longrightarrow> (h',l)\\<Colon>\\<preceq>(G,lT)";
nipkow@8011
   239
by( fast_tac (HOL_cs addDs [conforms_localD] 
nipkow@8011
   240
  addSEs [conformsI, lconf_hext]) 1);
nipkow@8011
   241
qed "conforms_hext";
nipkow@8011
   242
nipkow@8011
   243
Goal "\\<lbrakk>(h,l)\\<Colon>\\<preceq>(G, lT); G,h(a\\<mapsto>obj)\\<turnstile>obj\\<surd>; h\\<le>|h(a\\<mapsto>obj)\\<rbrakk> \\<Longrightarrow> (h(a\\<mapsto>obj),l)\\<Colon>\\<preceq>(G, lT)";
nipkow@8011
   244
by( rtac conforms_hext 1);
nipkow@8011
   245
by   Auto_tac;
nipkow@8011
   246
by( rtac hconfI 1);
nipkow@8011
   247
by( dtac conforms_heapD 1);
nipkow@8011
   248
by( (auto_tac (HOL_cs addEs [oconf_hext] addDs [hconfD],
nipkow@8011
   249
		simpset()delsimps[split_paired_All])));
nipkow@8011
   250
qed "conforms_upd_obj";
nipkow@8011
   251
nipkow@8011
   252
Goalw [conforms_def] 
nipkow@8011
   253
"\\<lbrakk>(h, l)\\<Colon>\\<preceq>(G, lT); G,h\\<turnstile>v\\<Colon>\\<preceq>T; lT va = Some T\\<rbrakk> \\<Longrightarrow> \
nipkow@8011
   254
\ (h, l(va\\<mapsto>v))\\<Colon>\\<preceq>(G, lT)";
nipkow@8011
   255
by( auto_tac (claset() addEs [lconf_upd], simpset()));
nipkow@8011
   256
qed "conforms_upd_local";