src/HOL/MicroJava/J/Conform.thy
author haftmann
Wed May 26 16:31:44 2010 +0200 (2010-05-26)
changeset 37139 e0bd5934a2fb
parent 35417 47ee18b6ae32
child 42463 f270e3e18be5
permissions -rw-r--r--
dropped legacy theorem bindings
nipkow@8011
     1
(*  Title:      HOL/MicroJava/J/Conform.thy
nipkow@8011
     2
    Author:     David von Oheimb
nipkow@8011
     3
    Copyright   1999 Technische Universitaet Muenchen
oheimb@11070
     4
*)
nipkow@8011
     5
kleing@12911
     6
header {* \isaheader{Conformity Relations for Type Soundness Proof} *}
nipkow@8011
     7
haftmann@16417
     8
theory Conform imports State WellType Exceptions begin
oheimb@9346
     9
wenzelm@24783
    10
types 'c env' = "'c prog \<times> (vname \<rightharpoonup> ty)"  -- "same as @{text env} of @{text WellType.thy}"
nipkow@8011
    11
haftmann@35416
    12
definition hext :: "aheap => aheap => bool" ("_ <=| _" [51,51] 50) where
oheimb@11372
    13
 "h<=|h' == \<forall>a C fs. h a = Some(C,fs) --> (\<exists>fs'. h' a = Some(C,fs'))"
nipkow@8011
    14
haftmann@35416
    15
definition conf :: "'c prog => aheap => val => ty => bool" 
haftmann@35416
    16
                                   ("_,_ |- _ ::<= _"  [51,51,51,51] 50) where
nipkow@30235
    17
 "G,h|-v::<=T == \<exists>T'. typeof (Option.map obj_ty o h) v = Some T' \<and> G\<turnstile>T'\<preceq>T"
nipkow@8011
    18
haftmann@35416
    19
definition lconf :: "'c prog => aheap => ('a \<rightharpoonup> val) => ('a \<rightharpoonup> ty) => bool"
haftmann@35416
    20
                                   ("_,_ |- _ [::<=] _" [51,51,51,51] 50) where
oheimb@11372
    21
 "G,h|-vs[::<=]Ts == \<forall>n T. Ts n = Some T --> (\<exists>v. vs n = Some v \<and> G,h|-v::<=T)"
nipkow@8011
    22
haftmann@35416
    23
definition oconf :: "'c prog => aheap => obj => bool" ("_,_ |- _ [ok]" [51,51,51] 50) where
oheimb@11372
    24
 "G,h|-obj [ok] == G,h|-snd obj[::<=]map_of (fields (G,fst obj))"
nipkow@8011
    25
haftmann@35416
    26
definition hconf :: "'c prog => aheap => bool" ("_ |-h _ [ok]" [51,51] 50) where
oheimb@11372
    27
 "G|-h h [ok]    == \<forall>a obj. h a = Some obj --> G,h|-obj [ok]"
streckem@13672
    28
 
haftmann@35416
    29
definition xconf :: "aheap \<Rightarrow> val option \<Rightarrow> bool" where
streckem@13672
    30
  "xconf hp vo  == preallocated hp \<and> (\<forall> v. (vo = Some v) \<longrightarrow> (\<exists> xc. v = (Addr (XcptRef xc))))"
nipkow@8011
    31
haftmann@35416
    32
definition conforms :: "xstate => java_mb env' => bool" ("_ ::<= _" [51,51] 50) where
streckem@13672
    33
 "s::<=E == prg E|-h heap (store s) [ok] \<and> 
streckem@13672
    34
            prg E,heap (store s)|-locals (store s)[::<=]localT E \<and> 
streckem@13672
    35
            xconf (heap (store s)) (abrupt s)"
nipkow@8011
    36
kleing@10061
    37
wenzelm@35355
    38
notation (xsymbols)
wenzelm@35355
    39
  hext  ("_ \<le>| _" [51,51] 50) and
wenzelm@35355
    40
  conf  ("_,_ \<turnstile> _ ::\<preceq> _" [51,51,51,51] 50) and
wenzelm@35355
    41
  lconf  ("_,_ \<turnstile> _ [::\<preceq>] _" [51,51,51,51] 50) and
wenzelm@35355
    42
  oconf  ("_,_ \<turnstile> _ \<surd>" [51,51,51] 50) and
wenzelm@35355
    43
  hconf  ("_ \<turnstile>h _ \<surd>" [51,51] 50) and
wenzelm@35355
    44
  conforms  ("_ ::\<preceq> _" [51,51] 50)
kleing@10061
    45
oheimb@11026
    46
oheimb@11026
    47
section "hext"
oheimb@11026
    48
oheimb@11026
    49
lemma hextI: 
oheimb@11026
    50
" \<forall>a C fs . h  a = Some (C,fs) -->   
oheimb@11026
    51
      (\<exists>fs'. h' a = Some (C,fs')) ==> h\<le>|h'"
oheimb@11026
    52
apply (unfold hext_def)
oheimb@11026
    53
apply auto
oheimb@11026
    54
done
oheimb@11026
    55
oheimb@11026
    56
lemma hext_objD: "[|h\<le>|h'; h a = Some (C,fs) |] ==> \<exists>fs'. h' a = Some (C,fs')"
oheimb@11026
    57
apply (unfold hext_def)
oheimb@11026
    58
apply (force)
oheimb@11026
    59
done
oheimb@11026
    60
oheimb@11026
    61
lemma hext_refl [simp]: "h\<le>|h"
oheimb@11026
    62
apply (rule hextI)
oheimb@11026
    63
apply (fast)
oheimb@11026
    64
done
oheimb@11026
    65
oheimb@11026
    66
lemma hext_new [simp]: "h a = None ==> h\<le>|h(a\<mapsto>x)"
oheimb@11026
    67
apply (rule hextI)
oheimb@11026
    68
apply auto
oheimb@11026
    69
done
oheimb@11026
    70
oheimb@11026
    71
lemma hext_trans: "[|h\<le>|h'; h'\<le>|h''|] ==> h\<le>|h''"
oheimb@11026
    72
apply (rule hextI)
oheimb@11026
    73
apply (fast dest: hext_objD)
oheimb@11026
    74
done
oheimb@11026
    75
oheimb@11026
    76
lemma hext_upd_obj: "h a = Some (C,fs) ==> h\<le>|h(a\<mapsto>(C,fs'))"
oheimb@11026
    77
apply (rule hextI)
oheimb@11026
    78
apply auto
oheimb@11026
    79
done
oheimb@11026
    80
oheimb@11026
    81
oheimb@11026
    82
section "conf"
oheimb@11026
    83
oheimb@11026
    84
lemma conf_Null [simp]: "G,h\<turnstile>Null::\<preceq>T = G\<turnstile>RefT NullT\<preceq>T"
oheimb@11026
    85
apply (unfold conf_def)
oheimb@11026
    86
apply (simp (no_asm))
oheimb@11026
    87
done
oheimb@11026
    88
oheimb@11026
    89
lemma conf_litval [rule_format (no_asm), simp]: 
oheimb@11026
    90
  "typeof (\<lambda>v. None) v = Some T --> G,h\<turnstile>v::\<preceq>T"
oheimb@11026
    91
apply (unfold conf_def)
oheimb@11026
    92
apply (rule val.induct)
oheimb@11026
    93
apply auto
oheimb@11026
    94
done
oheimb@11026
    95
oheimb@11026
    96
lemma conf_AddrI: "[|h a = Some obj; G\<turnstile>obj_ty obj\<preceq>T|] ==> G,h\<turnstile>Addr a::\<preceq>T"
oheimb@11026
    97
apply (unfold conf_def)
oheimb@11026
    98
apply (simp)
oheimb@11026
    99
done
oheimb@11026
   100
oheimb@11026
   101
lemma conf_obj_AddrI: "[|h a = Some (C,fs); G\<turnstile>C\<preceq>C D|] ==> G,h\<turnstile>Addr a::\<preceq> Class D"
oheimb@11026
   102
apply (unfold conf_def)
oheimb@11026
   103
apply (simp)
oheimb@11026
   104
done
oheimb@11026
   105
kleing@12517
   106
lemma defval_conf [rule_format (no_asm)]: 
kleing@12517
   107
  "is_type G T --> G,h\<turnstile>default_val T::\<preceq>T"
oheimb@11026
   108
apply (unfold conf_def)
ballarin@14174
   109
apply (rule_tac y = "T" in ty.exhaust)
oheimb@11026
   110
apply  (erule ssubst)
ballarin@14174
   111
apply  (rule_tac y = "prim_ty" in prim_ty.exhaust)
oheimb@11026
   112
apply    (auto simp add: widen.null)
oheimb@11026
   113
done
oheimb@11026
   114
oheimb@11026
   115
lemma conf_upd_obj: 
oheimb@11026
   116
"h a = Some (C,fs) ==> (G,h(a\<mapsto>(C,fs'))\<turnstile>x::\<preceq>T) = (G,h\<turnstile>x::\<preceq>T)"
oheimb@11026
   117
apply (unfold conf_def)
oheimb@11026
   118
apply (rule val.induct)
oheimb@11026
   119
apply auto
oheimb@11026
   120
done
oheimb@11026
   121
kleing@12517
   122
lemma conf_widen [rule_format (no_asm)]: 
kleing@12517
   123
  "wf_prog wf_mb G ==> G,h\<turnstile>x::\<preceq>T --> G\<turnstile>T\<preceq>T' --> G,h\<turnstile>x::\<preceq>T'"
oheimb@11026
   124
apply (unfold conf_def)
oheimb@11026
   125
apply (rule val.induct)
oheimb@11026
   126
apply (auto intro: widen_trans)
oheimb@11026
   127
done
oheimb@11026
   128
oheimb@11026
   129
lemma conf_hext [rule_format (no_asm)]: "h\<le>|h' ==> G,h\<turnstile>v::\<preceq>T --> G,h'\<turnstile>v::\<preceq>T"
oheimb@11026
   130
apply (unfold conf_def)
oheimb@11026
   131
apply (rule val.induct)
oheimb@11026
   132
apply (auto dest: hext_objD)
oheimb@11026
   133
done
oheimb@11026
   134
oheimb@11026
   135
lemma new_locD: "[|h a = None; G,h\<turnstile>Addr t::\<preceq>T|] ==> t\<noteq>a"
oheimb@11026
   136
apply (unfold conf_def)
oheimb@11026
   137
apply auto
oheimb@11026
   138
done
oheimb@11026
   139
oheimb@11026
   140
lemma conf_RefTD [rule_format (no_asm)]: 
oheimb@11026
   141
 "G,h\<turnstile>a'::\<preceq>RefT T --> a' = Null |   
oheimb@11026
   142
  (\<exists>a obj T'. a' = Addr a \<and>  h a = Some obj \<and>  obj_ty obj = T' \<and>  G\<turnstile>T'\<preceq>RefT T)"
oheimb@11026
   143
apply (unfold conf_def)
oheimb@11026
   144
apply(induct_tac "a'")
oheimb@11026
   145
apply(auto)
oheimb@11026
   146
done
oheimb@11026
   147
oheimb@11026
   148
lemma conf_NullTD: "G,h\<turnstile>a'::\<preceq>RefT NullT ==> a' = Null"
oheimb@11026
   149
apply (drule conf_RefTD)
oheimb@11026
   150
apply auto
oheimb@11026
   151
done
oheimb@11026
   152
oheimb@11026
   153
lemma non_npD: "[|a' \<noteq> Null; G,h\<turnstile>a'::\<preceq>RefT t|] ==>  
oheimb@11026
   154
  \<exists>a C fs. a' = Addr a \<and>  h a = Some (C,fs) \<and>  G\<turnstile>Class C\<preceq>RefT t"
oheimb@11026
   155
apply (drule conf_RefTD)
oheimb@11026
   156
apply auto
oheimb@11026
   157
done
oheimb@11026
   158
kleing@12951
   159
lemma non_np_objD: "!!G. [|a' \<noteq> Null; G,h\<turnstile>a'::\<preceq> Class C|] ==>  
oheimb@11026
   160
  (\<exists>a C' fs. a' = Addr a \<and>  h a = Some (C',fs) \<and>  G\<turnstile>C'\<preceq>C C)"
oheimb@11026
   161
apply (fast dest: non_npD)
oheimb@11026
   162
done
oheimb@11026
   163
kleing@12517
   164
lemma non_np_objD' [rule_format (no_asm)]: 
kleing@12517
   165
  "a' \<noteq> Null ==> wf_prog wf_mb G ==> G,h\<turnstile>a'::\<preceq>RefT t --> 
oheimb@11026
   166
  (\<exists>a C fs. a' = Addr a \<and>  h a = Some (C,fs) \<and>  G\<turnstile>Class C\<preceq>RefT t)"
ballarin@14174
   167
apply(rule_tac y = "t" in ref_ty.exhaust)
oheimb@11026
   168
 apply (fast dest: conf_NullTD)
oheimb@11026
   169
apply (fast dest: non_np_objD)
oheimb@11026
   170
done
oheimb@11026
   171
kleing@12517
   172
lemma conf_list_gext_widen [rule_format (no_asm)]: 
kleing@12517
   173
  "wf_prog wf_mb G ==> \<forall>Ts Ts'. list_all2 (conf G h) vs Ts --> 
kleing@12517
   174
  list_all2 (\<lambda>T T'. G\<turnstile>T\<preceq>T') Ts Ts' -->  list_all2 (conf G h) vs Ts'"
oheimb@11026
   175
apply(induct_tac "vs")
oheimb@11026
   176
 apply(clarsimp)
oheimb@11026
   177
apply(clarsimp)
oheimb@11026
   178
apply(frule list_all2_lengthD [THEN sym])
oheimb@11026
   179
apply(simp (no_asm_use) add: length_Suc_conv)
oheimb@11026
   180
apply(safe)
oheimb@11026
   181
apply(frule list_all2_lengthD [THEN sym])
oheimb@11026
   182
apply(simp (no_asm_use) add: length_Suc_conv)
oheimb@11026
   183
apply(clarify)
oheimb@11026
   184
apply(fast elim: conf_widen)
oheimb@11026
   185
done
oheimb@11026
   186
oheimb@11026
   187
oheimb@11026
   188
section "lconf"
oheimb@11026
   189
oheimb@11026
   190
lemma lconfD: "[| G,h\<turnstile>vs[::\<preceq>]Ts; Ts n = Some T |] ==> G,h\<turnstile>(the (vs n))::\<preceq>T"
oheimb@11026
   191
apply (unfold lconf_def)
oheimb@11026
   192
apply (force)
oheimb@11026
   193
done
oheimb@11026
   194
oheimb@11026
   195
lemma lconf_hext [elim]: "[| G,h\<turnstile>l[::\<preceq>]L; h\<le>|h' |] ==> G,h'\<turnstile>l[::\<preceq>]L"
oheimb@11026
   196
apply (unfold lconf_def)
oheimb@11026
   197
apply  (fast elim: conf_hext)
oheimb@11026
   198
done
oheimb@11026
   199
oheimb@11026
   200
lemma lconf_upd: "!!X. [| G,h\<turnstile>l[::\<preceq>]lT;  
oheimb@11026
   201
  G,h\<turnstile>v::\<preceq>T; lT va = Some T |] ==> G,h\<turnstile>l(va\<mapsto>v)[::\<preceq>]lT"
oheimb@11026
   202
apply (unfold lconf_def)
oheimb@11026
   203
apply auto
oheimb@11026
   204
done
oheimb@11026
   205
kleing@12517
   206
lemma lconf_init_vars_lemma [rule_format (no_asm)]: 
kleing@12517
   207
  "\<forall>x. P x --> R (dv x) x ==> (\<forall>x. map_of fs f = Some x --> P x) -->  
oheimb@11026
   208
  (\<forall>T. map_of fs f = Some T -->  
oheimb@11026
   209
  (\<exists>v. map_of (map (\<lambda>(f,ft). (f, dv ft)) fs) f = Some v \<and>  R v T))"
oheimb@11026
   210
apply( induct_tac "fs")
oheimb@11026
   211
apply auto
oheimb@11026
   212
done
oheimb@11026
   213
oheimb@11026
   214
lemma lconf_init_vars [intro!]: 
oheimb@11026
   215
"\<forall>n. \<forall>T. map_of fs n = Some T --> is_type G T ==> G,h\<turnstile>init_vars fs[::\<preceq>]map_of fs"
oheimb@11026
   216
apply (unfold lconf_def init_vars_def)
oheimb@11026
   217
apply auto
oheimb@11026
   218
apply( rule lconf_init_vars_lemma)
oheimb@11026
   219
apply(   erule_tac [3] asm_rl)
oheimb@11026
   220
apply(  intro strip)
oheimb@11026
   221
apply(  erule defval_conf)
oheimb@11026
   222
apply auto
oheimb@11026
   223
done
oheimb@11026
   224
oheimb@11026
   225
lemma lconf_ext: "[|G,s\<turnstile>l[::\<preceq>]L; G,s\<turnstile>v::\<preceq>T|] ==> G,s\<turnstile>l(vn\<mapsto>v)[::\<preceq>]L(vn\<mapsto>T)"
oheimb@11026
   226
apply (unfold lconf_def)
oheimb@11026
   227
apply auto
oheimb@11026
   228
done
oheimb@11026
   229
kleing@12517
   230
lemma lconf_ext_list [rule_format (no_asm)]: 
nipkow@12888
   231
  "G,h\<turnstile>l[::\<preceq>]L ==> \<forall>vs Ts. distinct vns --> length Ts = length vns --> 
kleing@12517
   232
  list_all2 (\<lambda>v T. G,h\<turnstile>v::\<preceq>T) vs Ts --> G,h\<turnstile>l(vns[\<mapsto>]vs)[::\<preceq>]L(vns[\<mapsto>]Ts)"
oheimb@11026
   233
apply (unfold lconf_def)
oheimb@11026
   234
apply( induct_tac "vns")
oheimb@11026
   235
apply(  clarsimp)
oheimb@11026
   236
apply( clarsimp)
oheimb@11026
   237
apply( frule list_all2_lengthD)
oheimb@11026
   238
apply( auto simp add: length_Suc_conv)
oheimb@11026
   239
done
oheimb@11026
   240
streckem@13672
   241
lemma lconf_restr: "\<lbrakk>lT vn = None; G, h \<turnstile> l [::\<preceq>] lT(vn\<mapsto>T)\<rbrakk> \<Longrightarrow> G, h \<turnstile> l [::\<preceq>] lT"
streckem@13672
   242
apply (unfold lconf_def)
streckem@13672
   243
apply (intro strip)
streckem@13672
   244
apply (case_tac "n = vn")
streckem@13672
   245
apply auto
streckem@13672
   246
done
oheimb@11026
   247
oheimb@11026
   248
section "oconf"
oheimb@11026
   249
oheimb@11026
   250
lemma oconf_hext: "G,h\<turnstile>obj\<surd> ==> h\<le>|h' ==> G,h'\<turnstile>obj\<surd>"
oheimb@11026
   251
apply (unfold oconf_def)
oheimb@11026
   252
apply (fast)
oheimb@11026
   253
done
oheimb@11026
   254
oheimb@11026
   255
lemma oconf_obj: "G,h\<turnstile>(C,fs)\<surd> =  
oheimb@11026
   256
  (\<forall>T f. map_of(fields (G,C)) f = Some T --> (\<exists>v. fs f = Some v \<and>  G,h\<turnstile>v::\<preceq>T))"
oheimb@11026
   257
apply (unfold oconf_def lconf_def)
oheimb@11026
   258
apply auto
oheimb@11026
   259
done
oheimb@11026
   260
oheimb@11026
   261
lemmas oconf_objD = oconf_obj [THEN iffD1, THEN spec, THEN spec, THEN mp]
oheimb@11026
   262
oheimb@11026
   263
oheimb@11026
   264
section "hconf"
oheimb@11026
   265
oheimb@11026
   266
lemma hconfD: "[|G\<turnstile>h h\<surd>; h a = Some obj|] ==> G,h\<turnstile>obj\<surd>"
oheimb@11026
   267
apply (unfold hconf_def)
oheimb@11026
   268
apply (fast)
oheimb@11026
   269
done
oheimb@11026
   270
oheimb@11026
   271
lemma hconfI: "\<forall>a obj. h a=Some obj --> G,h\<turnstile>obj\<surd> ==> G\<turnstile>h h\<surd>"
oheimb@11026
   272
apply (unfold hconf_def)
oheimb@11026
   273
apply (fast)
oheimb@11026
   274
done
oheimb@11026
   275
oheimb@11026
   276
streckem@13672
   277
section "xconf"
streckem@13672
   278
streckem@13672
   279
lemma xconf_raise_if: "xconf h x \<Longrightarrow> xconf h (raise_if b xcn x)"
streckem@13672
   280
by (simp add: xconf_def raise_if_def)
streckem@13672
   281
streckem@13672
   282
streckem@13672
   283
oheimb@11026
   284
section "conforms"
oheimb@11026
   285
streckem@13672
   286
lemma conforms_heapD: "(x, (h, l))::\<preceq>(G, lT) ==> G\<turnstile>h h\<surd>"
oheimb@11026
   287
apply (unfold conforms_def)
oheimb@11026
   288
apply (simp)
oheimb@11026
   289
done
oheimb@11026
   290
streckem@13672
   291
lemma conforms_localD: "(x, (h, l))::\<preceq>(G, lT) ==> G,h\<turnstile>l[::\<preceq>]lT"
streckem@13672
   292
apply (unfold conforms_def)
streckem@13672
   293
apply (simp)
streckem@13672
   294
done
streckem@13672
   295
streckem@13672
   296
lemma conforms_xcptD: "(x, (h, l))::\<preceq>(G, lT) ==> xconf h x"
oheimb@11026
   297
apply (unfold conforms_def)
oheimb@11026
   298
apply (simp)
oheimb@11026
   299
done
oheimb@11026
   300
streckem@13672
   301
lemma conformsI: "[|G\<turnstile>h h\<surd>; G,h\<turnstile>l[::\<preceq>]lT; xconf h x|] ==> (x, (h, l))::\<preceq>(G, lT)"
oheimb@11026
   302
apply (unfold conforms_def)
oheimb@11026
   303
apply auto
oheimb@11026
   304
done
oheimb@11026
   305
streckem@13672
   306
lemma conforms_restr: "\<lbrakk>lT vn = None; s ::\<preceq> (G, lT(vn\<mapsto>T)) \<rbrakk> \<Longrightarrow> s ::\<preceq> (G, lT)"
streckem@13672
   307
by (simp add: conforms_def, fast intro: lconf_restr)
streckem@13672
   308
streckem@13672
   309
lemma conforms_xcpt_change: "\<lbrakk> (x, (h,l))::\<preceq> (G, lT); xconf h x \<longrightarrow> xconf h x' \<rbrakk> \<Longrightarrow> (x', (h,l))::\<preceq> (G, lT)"
streckem@13672
   310
by (simp add: conforms_def)
streckem@13672
   311
streckem@13672
   312
streckem@13672
   313
lemma preallocated_hext: "\<lbrakk> preallocated h; h\<le>|h'\<rbrakk> \<Longrightarrow> preallocated h'"
streckem@13672
   314
by (simp add: preallocated_def hext_def)
streckem@13672
   315
streckem@13672
   316
lemma xconf_hext: "\<lbrakk> xconf h vo; h\<le>|h'\<rbrakk> \<Longrightarrow> xconf h' vo"
streckem@13672
   317
by (simp add: xconf_def preallocated_def hext_def)
streckem@13672
   318
streckem@13672
   319
lemma conforms_hext: "[|(x,(h,l))::\<preceq>(G,lT); h\<le>|h'; G\<turnstile>h h'\<surd> |] 
streckem@13672
   320
  ==> (x,(h',l))::\<preceq>(G,lT)"
streckem@13672
   321
by( fast dest: conforms_localD conforms_xcptD elim!: conformsI xconf_hext)
streckem@13672
   322
oheimb@11026
   323
kleing@12517
   324
lemma conforms_upd_obj: 
streckem@13672
   325
  "[|(x,(h,l))::\<preceq>(G, lT); G,h(a\<mapsto>obj)\<turnstile>obj\<surd>; h\<le>|h(a\<mapsto>obj)|] 
streckem@13672
   326
  ==> (x,(h(a\<mapsto>obj),l))::\<preceq>(G, lT)"
kleing@12517
   327
apply(rule conforms_hext)
kleing@12517
   328
apply  auto
kleing@12517
   329
apply(rule hconfI)
kleing@12517
   330
apply(drule conforms_heapD)
haftmann@37139
   331
apply(tactic {* auto_tac (HOL_cs addEs [@{thm oconf_hext}] 
haftmann@37139
   332
                addDs [@{thm hconfD}], @{simpset} delsimps [@{thm split_paired_All}]) *})
oheimb@11026
   333
done
oheimb@11026
   334
oheimb@11026
   335
lemma conforms_upd_local: 
streckem@13672
   336
"[|(x,(h, l))::\<preceq>(G, lT); G,h\<turnstile>v::\<preceq>T; lT va = Some T|] 
streckem@13672
   337
  ==> (x,(h, l(va\<mapsto>v)))::\<preceq>(G, lT)"
oheimb@11026
   338
apply (unfold conforms_def)
oheimb@11026
   339
apply( auto elim: lconf_upd)
oheimb@11026
   340
done
oheimb@11026
   341
nipkow@8011
   342
end