src/HOL/MicroJava/BV/Correct.ML
author nipkow
Wed, 01 Dec 1999 18:22:28 +0100
changeset 8045 816f566c414f
parent 8032 1eaae1a2f8ff
child 8048 b7f7e18eb584
permissions -rw-r--r--
Fixed a problem with returning from the last frame.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/BV/Correct.ML
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     2
    ID:         $Id$
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     3
    Author:     Cornelia Pusch
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     4
    Copyright   1999 Technische Universitaet Muenchen
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     5
*)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     6
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     7
(** sup_heap **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     8
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     9
Goalw [hext_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    10
 "hp x = None \\<longrightarrow> hp \\<le>| (hp((newref hp) \\<mapsto> obj))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    11
by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    12
by (Clarify_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    13
bd newref_None 1;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    14
back();
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    15
by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    16
qed_spec_mp "sup_heap_newref";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    17
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    18
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    19
Goalw [hext_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    20
"hp a = Some (cn,od') \\<longrightarrow> hp \\<le>| (hp(a \\<mapsto> (cn,od)))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    21
by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    22
qed_spec_mp "sup_heap_update_value";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    23
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    24
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    25
(** approx_val **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    26
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    27
Goalw [approx_val_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    28
"approx_val G hp x None";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    29
by (Asm_full_simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    30
qed_spec_mp "approx_val_None";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    31
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    32
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    33
Goalw [approx_val_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    34
"approx_val G hp Null (Some(RefT x))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    35
by(Simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    36
by (fast_tac (claset() addIs widen.intrs) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    37
qed_spec_mp "approx_val_Null";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    38
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    39
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    40
Goal
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    41
"\\<lbrakk> wf_prog wt G \\<rbrakk> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    42
\\\<Longrightarrow> approx_val G hp v (Some T) \\<longrightarrow> G\\<turnstile> T\\<preceq>T' \\<longrightarrow> approx_val G hp v (Some T')";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    43
by (exhaust_tac "T" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    44
 by (Asm_simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    45
by (fast_tac (claset() addIs [conf_widen] addss (simpset()addsimps[approx_val_def])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    46
qed_spec_mp "approx_val_imp_approx_val_assConvertible";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    47
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    48
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    49
Goal
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    50
"approx_val G hp val at \\<longrightarrow> hp \\<le>| hp' \\<longrightarrow> approx_val G hp' val at";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    51
by (asm_full_simp_tac (simpset() setloop (split_tac [option.split]) 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    52
	addsimps [approx_val_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    53
by(blast_tac (claset() addIs [conf_hext]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    54
qed_spec_mp "approx_val_imp_approx_val_sup_heap";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    55
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    56
Goal
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    57
"\\<lbrakk> hp a = Some obj' ; G,hp\\<turnstile> v\\<Colon>\\<preceq>T ; obj_ty obj = obj_ty obj' \\<rbrakk> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    58
\\\<Longrightarrow>G,(hp(a\\<mapsto>obj))\\<turnstile> v\\<Colon>\\<preceq>T";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    59
by (exhaust_tac "v" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    60
by (auto_tac (claset() , simpset() addsimps [obj_ty_def,conf_def] addsplits [option.split]));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    61
qed_spec_mp "approx_val_imp_approx_val_heap_update";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    62
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    63
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    64
Goal
8023
3e5ddca613dd re-shaped and re-ordered conversion relations
oheimb
parents: 8011
diff changeset
    65
"wf_prog wt G \\<Longrightarrow> approx_val G h val us \\<longrightarrow> G \\<turnstile> us <=o us' \\<longrightarrow> approx_val G h val us'";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    66
by (asm_simp_tac (simpset() addsimps [sup_PTS_eq,approx_val_def] addsplits [option.split,val_.split,ty.split]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    67
by(blast_tac (claset() addIs [conf_widen]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    68
qed_spec_mp "approx_val_imp_approx_val_sup";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    69
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    70
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    71
Goal 
8023
3e5ddca613dd re-shaped and re-ordered conversion relations
oheimb
parents: 8011
diff changeset
    72
"\\<lbrakk> wf_prog wt G; approx_loc G hp loc LT; idx < length LT ; val = loc ! idx ; G \\<turnstile> LT ! idx <=o at\\<rbrakk> \
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    73
\\\<Longrightarrow> approx_val G hp val at";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    74
by (fast_tac (claset() addIs [approx_val_imp_approx_val_sup] addss (simpset() addsimps 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    75
	[split_def,approx_loc_def,all_set_conv_all_nth])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    76
qed "approx_loc_imp_approx_val_sup";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    77
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    78
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    79
(** approx_loc **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    80
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    81
Goal 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    82
"approx_loc G hp (s#xs) (l#ls) = \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    83
\   ((length xs = length ls) \\<and> (approx_val G hp s l) \\<and> (approx_loc G hp xs ls))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    84
by (fast_tac (claset() addss (simpset() addsimps [approx_loc_def])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    85
qed "approx_loc_Cons";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    86
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    87
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    88
Goalw [approx_stk_def,approx_loc_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    89
"\\<lbrakk> wf_prog wt G \\<rbrakk> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    90
\\\<Longrightarrow> (\\<forall>tt'\\<in>set (zip tys_n ts). tt' \\<in> widen G) \\<longrightarrow> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    91
\     length tys_n = length ts \\<longrightarrow> approx_stk G hp s tys_n \\<longrightarrow> approx_loc G hp s (map Some ts)";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    92
by (force_tac (claset() addIs [approx_val_imp_approx_val_assConvertible], simpset() 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    93
	addsimps [all_set_conv_all_nth,split_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    94
qed_spec_mp "assConv_approx_stk_imp_approx_loc";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    95
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    96
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    97
Goalw [approx_loc_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    98
"\\<forall> lvars. approx_loc G hp lvars lt \\<longrightarrow>  hp \\<le>| hp' \\<longrightarrow> approx_loc G hp' lvars lt";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    99
by (exhaust_tac "lt" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   100
 by (Asm_simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   101
by (force_tac (claset() addIs [approx_val_imp_approx_val_sup_heap],
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   102
	       simpset() addsimps [neq_Nil_conv]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   103
qed_spec_mp "approx_loc_imp_approx_loc_sup_heap";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   104
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   105
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   106
Goalw [sup_loc_def,approx_loc_def]
8023
3e5ddca613dd re-shaped and re-ordered conversion relations
oheimb
parents: 8011
diff changeset
   107
"wf_prog wt G \\<Longrightarrow> approx_loc G hp lvars lt \\<longrightarrow> G \\<turnstile> lt <=l lt' \\<longrightarrow> approx_loc G hp lvars lt'";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   108
by (auto_tac (claset() , simpset() addsimps [all_set_conv_all_nth,split_def]));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   109
by (auto_tac (claset() addEs [approx_val_imp_approx_val_sup] , simpset()));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   110
qed_spec_mp "approx_loc_imp_approx_loc_sup";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   111
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   112
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   113
Goalw  [approx_loc_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   114
"\\<forall>loc idx x X. (approx_loc G hp loc LT) \\<longrightarrow> (approx_val G hp x X) \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   115
\ \\<longrightarrow> (approx_loc G hp (loc[idx:=x]) (LT[idx:=X]))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   116
by (fast_tac (claset() addDs [set_update_subset RS subsetD]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   117
              addss (simpset() addsimps [zip_update])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   118
qed_spec_mp "approx_loc_imp_approx_loc_subst";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   119
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   120
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   121
Goal 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   122
"\\<forall>L1 l2 L2. length l1=length L1 \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   123
\ \\<longrightarrow> approx_loc G hp (l1@l2) (L1@L2) = (approx_loc G hp l1 L1 \\<and> approx_loc G hp l2 L2)";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   124
by (induct_tac "l1" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   125
 by (fast_tac (claset() addDs [] addss (simpset() addsimps [approx_loc_def])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   126
br allI 1;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   127
by (exhaust_tac "L1" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   128
 by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   129
by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   130
by (Clarify_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   131
by (asm_full_simp_tac (simpset() addsimps [approx_loc_Cons]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   132
by (case_tac "length l2 = length L2" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   133
 by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   134
by (asm_full_simp_tac (simpset() addsimps [approx_loc_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   135
qed_spec_mp "approx_loc_append";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   136
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   137
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   138
(** approx_stk **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   139
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   140
Goalw [approx_stk_def,approx_loc_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   141
"approx_stk G hp (rev s) (rev t) = approx_stk G hp s t";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   142
by (fast_tac (claset() addss (simpset() addsimps [zip_rev,rev_map RS sym])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   143
qed_spec_mp "approx_stk_rev_lem";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   144
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   145
Goal 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   146
"approx_stk G hp (rev s) t = approx_stk G hp s (rev t)";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   147
by (fast_tac (claset() addIs [approx_stk_rev_lem RS subst] addss (simpset()))  1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   148
qed_spec_mp "approx_stk_rev";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   149
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   150
Goalw [approx_stk_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   151
"\\<forall> lvars. approx_stk G hp lvars lt \\<longrightarrow> hp \\<le>| hp' \\<longrightarrow> approx_stk G hp' lvars lt";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   152
by (fast_tac (claset() addIs [approx_loc_imp_approx_loc_sup_heap])  1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   153
qed_spec_mp "approx_stk_imp_approx_stk_sup_heap";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   154
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   155
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   156
Goalw [approx_stk_def]
8023
3e5ddca613dd re-shaped and re-ordered conversion relations
oheimb
parents: 8011
diff changeset
   157
"wf_prog wt G \\<Longrightarrow> approx_stk G hp lvars st \\<longrightarrow> G \\<turnstile> (map Some st) <=l (map Some st') \\<longrightarrow> approx_stk G hp lvars st'";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   158
by (fast_tac (claset() addIs [approx_loc_imp_approx_loc_sup])  1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   159
qed_spec_mp "approx_stk_imp_approx_stk_sup";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   160
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   161
Goalw [approx_stk_def,approx_loc_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   162
"approx_stk G hp [] []";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   163
by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   164
qed "approx_stk_Nil";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   165
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   166
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   167
Goalw [approx_stk_def,approx_loc_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   168
"approx_stk G hp (x # stk) (S#ST) = (approx_stk G hp stk ST \\<and> approx_val G hp x (Some S))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   169
by (fast_tac (claset() addss (simpset())) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   170
qed "approx_stk_Cons";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   171
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   172
Goal 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   173
"\\<lbrakk> approx_stk G hp stk (S#ST') \\<rbrakk> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   174
\ \\<Longrightarrow> \\<exists>s stk'. stk = s#stk' \\<and> approx_stk G hp stk' ST' \\<and> approx_val G hp s (Some S)";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   175
by (exhaust_tac "stk" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   176
 by (fast_tac (claset() addss (simpset() addsimps [approx_stk_def,approx_loc_def])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   177
by (fast_tac (claset() addss (simpset() addsimps [approx_stk_Cons])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   178
qed "approx_stk_Cons_lemma";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   179
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   180
Goal 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   181
"\\<forall>ST' stk. approx_stk G hp stk (S@ST')   \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   182
\ \\<longrightarrow> (\\<exists>s stk'. stk = s@stk' \\<and> length s = length S \\<and> length stk' = length ST' \\<and> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   183
\             approx_stk G hp s S \\<and> approx_stk G hp stk' ST')";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   184
by (induct_tac "S" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   185
 by (fast_tac (claset() addDs [] addss (simpset() addsimps [approx_stk_def,approx_loc_def])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   186
by (Clarify_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   187
by (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   188
bd approx_stk_Cons_lemma 1;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   189
by (Clarify_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   190
by (eres_inst_tac [("x","ST'")] allE 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   191
by (eres_inst_tac [("x","stk'")] allE 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   192
by (Clarify_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   193
by (res_inst_tac [("x","s#sa")] exI 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   194
by (res_inst_tac [("x","stk'a")] exI 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   195
by (asm_full_simp_tac (simpset() addsimps [approx_stk_Cons]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   196
qed_spec_mp "approx_stk_append_lemma";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   197
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   198
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   199
(** oconf **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   200
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   201
Goalw [oconf_def,lconf_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   202
"\\<lbrakk> is_class G C; wf_prog wt G \\<rbrakk> \\<Longrightarrow> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   203
\G,h\\<turnstile> (C, map_of (map (\\<lambda>(f,fT).(f,default_val fT)) (fields(G,C))))\\<surd>";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   204
by (asm_full_simp_tac (simpset() addsimps [map_of_map]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   205
by (force_tac (claset() addIs [defval_conf]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   206
                        addDs [map_of_SomeD,is_type_fields],simpset()) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   207
qed "correct_init_obj";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   208
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   209
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   210
Goalw [oconf_def,lconf_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   211
"\\<lbrakk> map_of (fields (G, oT)) FD = Some T ; G,hp\\<turnstile>v\\<Colon>\\<preceq>T ; \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   212
\   G,hp\\<turnstile>(oT,fs)\\<surd> \\<rbrakk>  \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   213
\\\<Longrightarrow> G,hp\\<turnstile>(oT, fs(FD\\<mapsto>v))\\<surd>";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   214
by (asm_full_simp_tac (simpset() addsplits [ty.split]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   215
qed_spec_mp "oconf_imp_oconf_field_update";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   216
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   217
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   218
Goalw [oconf_def,lconf_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   219
"hp x = None \\<longrightarrow> G,hp\\<turnstile>obj\\<surd>  \\<longrightarrow>  G,hp\\<turnstile>obj'\\<surd> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   220
\  \\<longrightarrow> G,(hp(newref hp\\<mapsto>obj'))\\<turnstile>obj\\<surd>";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   221
by (Asm_full_simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   222
by (fast_tac (claset() addIs [conf_hext,sup_heap_newref]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   223
qed_spec_mp "oconf_imp_oconf_heap_newref";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   224
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   225
Goalw [oconf_def,lconf_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   226
"hp a = Some obj'  \\<longrightarrow> obj_ty obj' = obj_ty obj'' \\<longrightarrow> G,hp\\<turnstile>obj\\<surd> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   227
\  \\<longrightarrow> G,hp(a\\<mapsto>obj'')\\<turnstile>obj\\<surd>";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   228
by (Asm_full_simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   229
by (fast_tac (claset() addIs [approx_val_imp_approx_val_heap_update] addss (simpset())) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   230
qed_spec_mp "oconf_imp_oconf_heap_update";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   231
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   232
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   233
(** hconf **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   234
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   235
8032
1eaae1a2f8ff Minor mods.
nipkow
parents: 8023
diff changeset
   236
Goal "hp x = None \\<longrightarrow> G\\<turnstile>h hp\\<surd> \\<longrightarrow> G,hp\\<turnstile>obj\\<surd> \\<longrightarrow> G\\<turnstile>h hp(newref hp\\<mapsto>obj)\\<surd>";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   237
by (asm_full_simp_tac (simpset() addsplits [split_split] 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   238
				 addsimps [hconf_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   239
 by (fast_tac (claset()addIs[oconf_imp_oconf_heap_newref] addss (simpset())) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   240
qed_spec_mp "hconf_imp_hconf_newref";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   241
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   242
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   243
Goal "map_of (fields (G, oT)) (F, D) = Some T \\<and> hp oloc = Some(oT,fs) \\<and> \
8032
1eaae1a2f8ff Minor mods.
nipkow
parents: 8023
diff changeset
   244
\ G,hp\\<turnstile>v\\<Colon>\\<preceq>T \\<and> G\\<turnstile>h hp\\<surd> \\<longrightarrow> G\\<turnstile>h hp(oloc \\<mapsto> (oT, fs((F,D)\\<mapsto>v)))\\<surd>";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   245
by (asm_full_simp_tac (simpset() addsimps [hconf_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   246
by (fast_tac (claset() addIs 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   247
        [oconf_imp_oconf_heap_update, oconf_imp_oconf_field_update]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   248
        addss (simpset() addsimps [obj_ty_def])) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   249
qed_spec_mp "hconf_imp_hconf_field_update";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   250
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   251
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   252
(** correct_frames **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   253
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   254
Delsimps [fun_upd_apply]; 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   255
Goal
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8032
diff changeset
   256
"\\<forall>rT C sig. correct_frames G hp phi rT sig frs \\<longrightarrow> \
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   257
\    hp a = Some (cn,od) \\<longrightarrow> map_of (fields (G, cn)) fl = Some fd \\<longrightarrow> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   258
\    G,hp\\<turnstile>v\\<Colon>\\<preceq>fd \
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8032
diff changeset
   259
\ \\<longrightarrow> correct_frames G (hp(a \\<mapsto> (cn, od(fl\\<mapsto>v)))) phi rT sig frs";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   260
by (induct_tac "frs" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   261
 by (Asm_full_simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   262
by (asm_full_simp_tac (simpset() addsimps [split_def,correct_frame_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   263
by (fast_tac (claset() addIs [approx_stk_imp_approx_stk_sup_heap,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   264
				approx_loc_imp_approx_loc_sup_heap,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   265
				sup_heap_update_value] addss (simpset())) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   266
qed_spec_mp "correct_frames_imp_correct_frames_field_update";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   267
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   268
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   269
Goal
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8032
diff changeset
   270
"\\<forall>rT C sig. hp x = None \\<longrightarrow> correct_frames G hp phi rT sig frs \\<and> \
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   271
\    oconf G hp obj \
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8032
diff changeset
   272
\ \\<longrightarrow> correct_frames G (hp(newref hp \\<mapsto> obj)) phi rT sig frs";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   273
by (induct_tac "frs" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   274
by  (asm_full_simp_tac (simpset() addsimps []) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   275
by (asm_full_simp_tac (simpset() addsimps [split_def,correct_frame_def]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   276
by (fast_tac (claset() addIs [approx_stk_imp_approx_stk_sup_heap,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   277
				approx_loc_imp_approx_loc_sup_heap,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   278
				hconf_imp_hconf_newref,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   279
				sup_heap_newref] addss (simpset())) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   280
qed_spec_mp "correct_frames_imp_correct_frames_newref";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   281