src/HOL/Bali/AxSound.thy
author berghofe
Mon, 30 Sep 2002 16:14:02 +0200
changeset 13601 fd3e3d6b37b2
parent 13384 a34e38154413
child 13688 a0b16d42d489
permissions -rw-r--r--
Adapted to new simplifier.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12857
a4386cc9b1c3 tuned header;
wenzelm
parents: 12854
diff changeset
     1
(*  Title:      HOL/Bali/AxSound.thy
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     2
    ID:         $Id$
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     3
    Author:     David von Oheimb
12859
wenzelm
parents: 12857
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     5
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     6
header {* Soundness proof for Axiomatic semantics of Java expressions and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     7
          statements
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     8
       *}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     9
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    10
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    11
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    12
theory AxSound = AxSem:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    13
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    14
section "validity"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    15
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    16
consts
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    17
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    18
 triple_valid2:: "prog \<Rightarrow> nat \<Rightarrow>        'a triple  \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    19
                                                (   "_\<Turnstile>_\<Colon>_"[61,0, 58] 57)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    20
    ax_valids2:: "prog \<Rightarrow> 'a triples \<Rightarrow> 'a triples \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    21
                                                ("_,_|\<Turnstile>\<Colon>_" [61,58,58] 57)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    22
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    23
defs  triple_valid2_def: "G\<Turnstile>n\<Colon>t \<equiv> case t of {P} t\<succ> {Q} \<Rightarrow>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    24
 \<forall>Y s Z. P Y s Z \<longrightarrow> (\<forall>L. s\<Colon>\<preceq>(G,L) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    25
 \<longrightarrow> (\<forall>T C. (normal s \<longrightarrow> \<lparr>prg=G,cls=C,lcl=L\<rparr>\<turnstile>t\<Colon>T) \<longrightarrow>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    26
 (\<forall>Y' s'. G\<turnstile>s \<midarrow>t\<succ>\<midarrow>n\<rightarrow> (Y',s') \<longrightarrow> Q Y' s' Z \<and> s'\<Colon>\<preceq>(G,L))))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    27
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    28
defs  ax_valids2_def:    "G,A|\<Turnstile>\<Colon>ts \<equiv>  \<forall>n. (\<forall>t\<in>A. G\<Turnstile>n\<Colon>t) \<longrightarrow> (\<forall>t\<in>ts. G\<Turnstile>n\<Colon>t)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    29
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    30
lemma triple_valid2_def2: "G\<Turnstile>n\<Colon>{P} t\<succ> {Q} =  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    31
 (\<forall>Y s Z. P Y s Z \<longrightarrow> (\<forall>Y' s'. G\<turnstile>s \<midarrow>t\<succ>\<midarrow>n\<rightarrow> (Y',s')\<longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    32
  (\<forall>L. s\<Colon>\<preceq>(G,L) \<longrightarrow> (\<forall>T C. (normal s \<longrightarrow> \<lparr>prg=G,cls=C,lcl=L\<rparr>\<turnstile>t\<Colon>T) \<longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    33
  Q Y' s' Z \<and> s'\<Colon>\<preceq>(G,L)))))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    34
apply (unfold triple_valid2_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    35
apply (simp (no_asm) add: split_paired_All)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    36
apply blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    37
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    38
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    39
lemma triple_valid2_eq [rule_format (no_asm)]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    40
  "wf_prog G ==> triple_valid2 G = triple_valid G"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    41
apply (rule ext)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    42
apply (rule ext)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    43
apply (rule triple.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    44
apply (simp (no_asm) add: triple_valid_def2 triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    45
apply (rule iffI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    46
apply  fast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    47
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    48
apply (tactic "smp_tac 3 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    49
apply (case_tac "normal s")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    50
apply  clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    51
apply  (blast dest: evaln_eval eval_type_sound [THEN conjunct1])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    52
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    53
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    54
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    55
lemma ax_valids2_eq: "wf_prog G \<Longrightarrow> G,A|\<Turnstile>\<Colon>ts = G,A|\<Turnstile>ts"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    56
apply (unfold ax_valids_def ax_valids2_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    57
apply (force simp add: triple_valid2_eq)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    58
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    59
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    60
lemma triple_valid2_Suc [rule_format (no_asm)]: "G\<Turnstile>Suc n\<Colon>t \<longrightarrow> G\<Turnstile>n\<Colon>t"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    61
apply (induct_tac "t")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    62
apply (subst triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    63
apply (subst triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    64
apply (fast intro: evaln_nonstrict_Suc)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    65
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    66
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    67
lemma Methd_triple_valid2_0: "G\<Turnstile>0\<Colon>{Normal P} Methd C sig-\<succ> {Q}"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    68
apply (clarsimp elim!: evaln_elim_cases simp add: triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    69
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    70
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    71
lemma Methd_triple_valid2_SucI: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    72
"\<lbrakk>G\<Turnstile>n\<Colon>{Normal P} body G C sig-\<succ>{Q}\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    73
  \<Longrightarrow> G\<Turnstile>Suc n\<Colon>{Normal P} Methd C sig-\<succ> {Q}"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    74
apply (simp (no_asm_use) add: triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    75
apply (intro strip, tactic "smp_tac 3 1", clarify)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    76
apply (erule wt_elim_cases, erule evaln_elim_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    77
apply (unfold body_def Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    78
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    79
apply blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    80
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    81
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    82
lemma triples_valid2_Suc: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    83
 "Ball ts (triple_valid2 G (Suc n)) \<Longrightarrow> Ball ts (triple_valid2 G n)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    84
apply (fast intro: triple_valid2_Suc)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    85
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    86
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    87
lemma "G|\<Turnstile>n:insert t A = (G\<Turnstile>n:t \<and> G|\<Turnstile>n:A)";
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    88
oops
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    89
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    90
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    91
section "soundness"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    92
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    93
lemma Methd_sound: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    94
"\<lbrakk>G,A\<union>  {{P} Methd-\<succ> {Q} | ms}|\<Turnstile>\<Colon>{{P} body G-\<succ> {Q} | ms}\<rbrakk> \<Longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    95
  G,A|\<Turnstile>\<Colon>{{P} Methd-\<succ> {Q} | ms}"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    96
apply (unfold ax_valids2_def mtriples_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    97
apply (rule allI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    98
apply (induct_tac "n")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    99
apply  (clarify, tactic {* pair_tac "x" 1 *}, simp (no_asm))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   100
apply  (fast intro: Methd_triple_valid2_0)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   101
apply (clarify, tactic {* pair_tac "xa" 1 *}, simp (no_asm))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   102
apply (drule triples_valid2_Suc)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   103
apply (erule (1) notE impE)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   104
apply (drule_tac x = na in spec)
13601
fd3e3d6b37b2 Adapted to new simplifier.
berghofe
parents: 13384
diff changeset
   105
apply (rule Methd_triple_valid2_SucI)
fd3e3d6b37b2 Adapted to new simplifier.
berghofe
parents: 13384
diff changeset
   106
apply (simp (no_asm_use) add: ball_Un)
fd3e3d6b37b2 Adapted to new simplifier.
berghofe
parents: 13384
diff changeset
   107
apply auto
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   108
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   109
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   110
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   111
lemma valids2_inductI: "\<forall>s t n Y' s'. G\<turnstile>s\<midarrow>t\<succ>\<midarrow>n\<rightarrow> (Y',s') \<longrightarrow> t = c \<longrightarrow>    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   112
  Ball A (triple_valid2 G n) \<longrightarrow> (\<forall>Y Z. P Y s Z \<longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   113
  (\<forall>L. s\<Colon>\<preceq>(G,L) \<longrightarrow> (\<forall>T C. (normal s \<longrightarrow> \<lparr>prg=G,cls=C,lcl=L\<rparr>\<turnstile>t\<Colon>T) \<longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   114
  Q Y' s' Z \<and> s'\<Colon>\<preceq>(G, L)))) \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   115
  G,A|\<Turnstile>\<Colon>{ {P} c\<succ> {Q}}"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   116
apply (simp (no_asm) add: ax_valids2_def triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   117
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   118
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   119
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   120
ML_setup {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   121
Delsimprocs [evaln_expr_proc,evaln_var_proc,evaln_exprs_proc,evaln_stmt_proc]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   122
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   123
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   124
lemma Loop_sound: "\<lbrakk>G,A|\<Turnstile>\<Colon>{ {P} e-\<succ> {P'}};  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   125
       G,A|\<Turnstile>\<Colon>{ {Normal (P'\<leftarrow>=True)} .c. {abupd (absorb (Cont l)) .; P}}\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   126
       G,A|\<Turnstile>\<Colon>{ {P} .l\<bullet> While(e) c. {(P'\<leftarrow>=False)\<down>=\<diamondsuit>}}"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   127
apply (rule valids2_inductI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   128
apply ((rule allI)+, rule impI, tactic {* pair_tac "s" 1*}, tactic {* pair_tac "s'" 1*})
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   129
apply (erule evaln.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   130
apply  simp_all (* takes half a minute *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   131
apply  clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   132
apply  (erule_tac V = "G,A|\<Turnstile>\<Colon>{ {?P'} .c. {?P}}" in thin_rl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   133
apply  (simp_all (no_asm_use) add: ax_valids2_def triple_valid2_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   134
apply  (tactic "smp_tac 1 1", tactic "smp_tac 3 1", force)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   135
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   136
apply (rule wt_elim_cases, assumption)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   137
apply (tactic "smp_tac 1 1", tactic "smp_tac 1 1", tactic "smp_tac 3 1", 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   138
       tactic "smp_tac 2 1", tactic "smp_tac 1 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   139
apply (erule impE,simp (no_asm),blast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   140
apply (simp add: imp_conjL split_tupled_all split_paired_All)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   141
apply (case_tac "the_Bool b")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   142
apply  clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   143
apply  (case_tac "a")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   144
apply (simp_all)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   145
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   146
apply  (erule_tac V = "c = l\<bullet> While(e) c \<longrightarrow> ?P" in thin_rl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   147
apply (blast intro: conforms_absorb)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   148
apply blast+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   149
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   150
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   151
declare subst_Bool_def2 [simp del]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   152
lemma all_empty: "(!x. P) = P"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   153
by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   154
lemma sound_valid2_lemma: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   155
"\<lbrakk>\<forall>v n. Ball A (triple_valid2 G n) \<longrightarrow> P v n; Ball A (triple_valid2 G n)\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   156
 \<Longrightarrow>P v n"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   157
by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   158
ML {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   159
val fullsimptac = full_simp_tac(simpset() delsimps [thm "all_empty"]);
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   160
val sound_prepare_tac = EVERY'[REPEAT o thin_tac "?x \<in> ax_derivs G",
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   161
 full_simp_tac (simpset()addsimps[thm "ax_valids2_def",thm "triple_valid2_def2",
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   162
                                  thm "imp_conjL"] delsimps[thm "all_empty"]),
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   163
 Clarify_tac];
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   164
val sound_elim_tac = EVERY'[eresolve_tac (thms "evaln_elim_cases"), 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   165
        TRY o eresolve_tac (thms "wt_elim_cases"), fullsimptac, Clarify_tac];
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   166
val sound_valid2_tac = REPEAT o FIRST'[smp_tac 1, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   167
                  datac (thm "sound_valid2_lemma") 1];
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   168
val sound_forw_hyp_tac = 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   169
 EVERY'[smp_tac 3 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   170
          ORELSE' EVERY'[dtac spec,dtac spec, dtac spec,etac impE, Fast_tac] 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   171
          ORELSE' EVERY'[dtac spec,dtac spec,etac impE, Fast_tac],
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   172
        fullsimptac, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   173
        smp_tac 2,TRY o smp_tac 1,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   174
        TRY o EVERY'[etac impE, TRY o rtac impI, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   175
        atac ORELSE' (EVERY' [REPEAT o rtac exI,Blast_tac]),
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   176
        fullsimptac, Clarify_tac, TRY o smp_tac 1]]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   177
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   178
(* ### rtac conjI,rtac HOL.refl *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   179
lemma Call_sound: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   180
"\<lbrakk>wf_prog G; G,A|\<Turnstile>\<Colon>{ {Normal P} e-\<succ> {Q}}; \<forall>a. G,A|\<Turnstile>\<Colon>{ {Q\<leftarrow>Val a} ps\<doteq>\<succ> {R a}};
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   181
  \<forall>a vs invC declC l. G,A|\<Turnstile>\<Colon>{ {(R a\<leftarrow>Vals vs \<and>.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   182
   (\<lambda>s. declC = invocation_declclass 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   183
                    G mode (store s) a statT \<lparr>name=mn,parTs=pTs\<rparr> \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   184
         invC = invocation_class mode (store s) a statT \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   185
            l = locals (store s)) ;.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   186
   init_lvars G declC \<lparr>name=mn,parTs=pTs\<rparr> mode a vs) \<and>.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   187
   (\<lambda>s. normal s \<longrightarrow> G\<turnstile>mode\<rightarrow>invC\<preceq>statT)}  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   188
   Methd declC \<lparr>name=mn,parTs=pTs\<rparr>-\<succ> {set_lvars l .; S}}\<rbrakk> \<Longrightarrow>  
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   189
  G,A|\<Turnstile>\<Colon>{ {Normal P} {accC,statT,mode}e\<cdot>mn({pTs}ps)-\<succ> {S}}"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   190
apply (tactic "EVERY'[sound_prepare_tac, sound_elim_tac, sound_valid2_tac] 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   191
apply (rename_tac x1 s1 x2 s2 ab bb v vs m pTsa statDeclC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   192
apply (tactic "smp_tac 6 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   193
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   194
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   195
apply (drule max_spec2mheads)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   196
apply (drule (3) evaln_eval, drule (3) eval_ts)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   197
apply (drule (3) evaln_eval, frule (3) evals_ts)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   198
apply (drule spec,erule impE,rule exI, blast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   199
(* apply (drule spec,drule spec,drule spec,erule impE,rule exI,blast) *)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   200
apply (case_tac "if is_static m then x2 else (np a') x2")
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   201
defer 1
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   202
apply  (rename_tac x, subgoal_tac "(Some x, s2)\<Colon>\<preceq>(G, L)" (* used two times *))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   203
prefer 2 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   204
apply   (force split add: split_if_asm)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   205
apply  (simp del: if_raise_if_None)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   206
apply  (tactic "smp_tac 2 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   207
apply (simp only: init_lvars_def2 invmode_Static_eq)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   208
apply (clarsimp simp del: resTy_mthd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   209
apply  (drule spec,erule swap,erule conforms_set_locals [OF _ lconf_empty])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   210
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   211
apply (drule Null_staticD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   212
apply (drule eval_gext', drule (1) conf_gext, frule (3) DynT_propI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   213
apply (erule impE) apply blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   214
apply (subgoal_tac 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   215
 "G\<turnstile>invmode (mhd (statDeclC,m)) e
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   216
     \<rightarrow>invocation_class (invmode m e) s2 a' statT\<preceq>statT")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   217
defer   apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   218
apply (drule (3) DynT_mheadsD,simp,simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   219
apply (clarify, drule wf_mdeclD1, clarify)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   220
apply (frule ty_expr_is_type) apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   221
apply (subgoal_tac "invmode (mhd (statDeclC,m)) e = IntVir \<longrightarrow> a' \<noteq> Null")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   222
defer   apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   223
apply (frule (2) wt_MethdI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   224
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   225
apply (drule (2) conforms_init_lvars)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   226
apply   (simp) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   227
apply   (assumption)+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   228
apply   simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   229
apply   (assumption)+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   230
apply   (rule impI) apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   231
apply   simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   232
apply   simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   233
apply   (rule Ball_weaken)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   234
apply     assumption
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   235
apply     (force simp add: is_acc_type_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   236
apply (tactic "smp_tac 2 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   237
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   238
apply (tactic "smp_tac 1 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   239
apply (erule_tac V = "?P \<longrightarrow> ?Q" in thin_rl) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   240
apply (erule impE)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   241
apply   (rule exI)+ 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   242
apply   (subgoal_tac "is_static dm = (static m)") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   243
prefer 2  apply (simp add: member_is_static_simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   244
apply   (simp only: )
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   245
apply   (simp only: sig.simps)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   246
apply (force dest!: evaln_eval eval_gext' elim: conforms_return 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   247
             del: impCE simp add: init_lvars_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   248
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   249
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   250
corollary evaln_type_sound:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   251
  assumes evaln: "G\<turnstile>s0 \<midarrow>t\<succ>\<midarrow>n\<rightarrow> (v,s1)" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   252
             wt: "\<lparr>prg=G,cls=accC,lcl=L\<rparr>\<turnstile>t\<Colon>T" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   253
        conf_s0: "s0\<Colon>\<preceq>(G,L)" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   254
             wf: "wf_prog G"                         
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   255
  shows "s1\<Colon>\<preceq>(G,L) \<and>  (normal s1 \<longrightarrow> G,L,store s1\<turnstile>t\<succ>v\<Colon>\<preceq>T) \<and> 
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   256
         (error_free s0 = error_free s1)"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   257
proof -
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   258
  from evaln wt conf_s0 wf
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   259
  show ?thesis
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   260
    by (blast dest: evaln_eval eval_type_sound)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   261
qed
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   262
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   263
lemma Init_sound: "\<lbrakk>wf_prog G; the (class G C) = c;  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   264
      G,A|\<Turnstile>\<Colon>{ {Normal ((P \<and>. Not \<circ> initd C) ;. supd (init_class_obj G C))}  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   265
             .(if C = Object then Skip else Init (super c)). {Q}};  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   266
  \<forall>l. G,A|\<Turnstile>\<Colon>{ {Q \<and>. (\<lambda>s. l = locals (store s)) ;. set_lvars empty}  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   267
            .init c. {set_lvars l .; R}}\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   268
      G,A|\<Turnstile>\<Colon>{ {Normal (P \<and>. Not \<circ> initd C)} .Init C. {R}}"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   269
apply (tactic "EVERY'[sound_prepare_tac, sound_elim_tac,sound_valid2_tac] 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   270
apply (tactic {* instantiate_tac [("l24","\<lambda> n Y Z sa Y' s' L y a b aa ba ab bb. locals b")]*})
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   271
apply (clarsimp simp add: split_paired_Ex)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   272
apply (drule spec, drule spec, drule spec, erule impE)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   273
apply  (erule_tac V = "All ?P" in thin_rl, fast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   274
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   275
apply (tactic "smp_tac 2 1", drule spec, erule impE, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   276
       erule (3) conforms_init_class_obj)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   277
apply (frule (1) wf_prog_cdecl)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   278
apply (erule impE, rule exI,erule_tac V = "All ?P" in thin_rl,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   279
       force dest: wf_cdecl_supD split add: split_if simp add: is_acc_class_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   280
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   281
apply (drule spec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   282
apply (drule spec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   283
apply (drule spec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   284
apply  (erule impE)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   285
apply ( fast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   286
apply (simp (no_asm_use) del: empty_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   287
apply (tactic "smp_tac 2 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   288
apply (drule spec, erule impE, erule conforms_set_locals, rule lconf_empty)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   289
apply (erule impE,rule impI,rule exI,erule wf_cdecl_wt_init)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   290
apply clarsimp
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   291
apply (erule (1) conforms_return)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   292
apply (frule wf_cdecl_wt_init)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   293
apply (subgoal_tac "(a, set_locals empty b)\<Colon>\<preceq>(G, empty)")
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   294
apply   (frule (3) evaln_eval)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   295
apply   (drule eval_gext') 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   296
apply   force
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   297
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   298
        (* refer to case Init in eval_type_sound proof, to see whats going on*)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   299
apply   (subgoal_tac "(a,b)\<Colon>\<preceq>(G, L)")
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   300
apply     (blast intro: conforms_set_locals)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   301
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   302
apply     (drule evaln_type_sound)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   303
apply       (cases "C=Object") 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   304
apply         force 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   305
apply         (force dest: wf_cdecl_supD is_acc_classD)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   306
apply     (erule (4) conforms_init_class_obj)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   307
apply     blast
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   308
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   309
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   310
lemma all_conjunct2: "\<forall>l. P' l \<and> P l \<Longrightarrow> \<forall>l. P l"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   311
by fast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   312
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   313
lemma all4_conjunct2: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   314
  "\<forall>a vs D l. (P' a vs D l \<and> P a vs D l) \<Longrightarrow> \<forall>a vs D l. P a vs D l"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   315
by fast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   316
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   317
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   318
lemmas sound_lemmas = Init_sound Loop_sound Methd_sound
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   319
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   320
lemma ax_sound2: "wf_prog G \<Longrightarrow> G,A|\<turnstile>ts \<Longrightarrow> G,A|\<Turnstile>\<Colon>ts"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   321
apply (erule ax_derivs.induct)
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   322
prefer 22 (* Call *)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   323
apply (erule (1) Call_sound) apply simp apply force apply force 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   324
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   325
apply (tactic {* TRYALL (eresolve_tac (thms "sound_lemmas") THEN_ALL_NEW 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   326
    eresolve_tac [asm_rl, thm "all_conjunct2", thm "all4_conjunct2"]) *})
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   327
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   328
apply(tactic "COND (has_fewer_prems(30+9)) (ALLGOALS sound_prepare_tac) no_tac")
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   329
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   330
               (*empty*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   331
apply        fast (* insert *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   332
apply       fast (* asm *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   333
(*apply    fast *) (* cut *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   334
apply     fast (* weaken *)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   335
apply    (tactic "smp_tac 3 1", clarify, tactic "smp_tac 1 1",
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   336
          case_tac"fst s",clarsimp,erule (3) evaln_type_sound [THEN conjunct1],
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   337
          clarsimp) (* conseq *)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   338
apply   (simp (no_asm_use) add: type_ok_def,fast)(* hazard *)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   339
apply  force (* Abrupt *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   340
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   341
prefer 28 apply (simp add: evaln_InsInitV)
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   342
prefer 28 apply (simp add: evaln_InsInitE)
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   343
prefer 28 apply (simp add: evaln_Callee)
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   344
prefer 28 apply (simp add: evaln_FinA)
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   345
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   346
(* 27 subgoals *)
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   347
apply (tactic {* sound_elim_tac 1 *})
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   348
apply (tactic {* ALLGOALS sound_elim_tac *})(* LVar, Lit, Super, Nil, Skip,Do *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   349
apply (tactic {* ALLGOALS (asm_simp_tac (noAll_simpset() 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   350
                          delsimps [thm "all_empty"])) *})    (* Done *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   351
(* for FVar *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   352
apply (frule wf_ws_prog) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   353
apply (frule ty_expr_is_type [THEN type_is_class, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   354
                              THEN accfield_declC_is_class])
13601
fd3e3d6b37b2 Adapted to new simplifier.
berghofe
parents: 13384
diff changeset
   355
apply (simp (no_asm_use), simp (no_asm_use), simp (no_asm_use))
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   356
apply (frule_tac [4] wt_init_comp_ty) (* for NewA*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   357
apply (tactic "ALLGOALS sound_valid2_tac")
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   358
apply (tactic "TRYALL sound_forw_hyp_tac") (* UnOp, Cast, Inst, Acc, Expr *)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   359
apply (tactic {* TRYALL (EVERY'[dtac spec, TRY o EVERY'[rotate_tac ~1, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   360
  dtac spec], dtac conjunct2, smp_tac 1, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   361
  TRY o dres_inst_tac [("P","P'")] (thm "subst_Bool_the_BoolI")]) *})
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   362
apply (frule_tac [15] x = x1 in conforms_NormI)  (* for Fin *)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   363
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   364
(* 15 subgoals *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   365
(* FVar *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   366
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   367
apply (clarsimp simp add: fvar_def2 Let_def split add: split_if_asm)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   368
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   369
(* AVar *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   370
(*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   371
apply (drule spec, drule spec, erule impE, fast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   372
apply (simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   373
apply (tactic "smp_tac 2 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   374
apply (tactic "smp_tac 1 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   375
apply (erule impE)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   376
apply (rule impI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   377
apply (rule exI)+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   378
apply blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   379
apply (clarsimp simp add: avar_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   380
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   381
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   382
apply (clarsimp simp add: avar_def2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   383
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   384
(* NewC *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   385
apply (clarsimp simp add: is_acc_class_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   386
apply (erule (1) halloc_conforms, simp, simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   387
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   388
(* NewA *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   389
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   390
apply (rule conjI,blast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   391
apply (erule (1) halloc_conforms, simp, simp, simp add: is_acc_type_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   392
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   393
(* BinOp *)
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   394
apply (tactic "sound_forw_hyp_tac 1")
13384
a34e38154413 Added conditional and (&&) and or (||).
schirmer
parents: 13337
diff changeset
   395
apply (case_tac "need_second_arg binop v1")
a34e38154413 Added conditional and (&&) and or (||).
schirmer
parents: 13337
diff changeset
   396
apply   fastsimp
a34e38154413 Added conditional and (&&) and or (||).
schirmer
parents: 13337
diff changeset
   397
apply   simp
13337
f75dfc606ac7 Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
schirmer
parents: 12937
diff changeset
   398
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   399
(* Ass *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   400
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   401
apply (case_tac "aa")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   402
prefer 2
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   403
apply  clarsimp
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   404
apply (drule (3) evaln_type_sound)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   405
apply (drule (3) evaln_eval)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   406
apply (frule (3) eval_type_sound)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   407
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   408
apply (frule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   409
apply (drule (2) conf_widen)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   410
apply (drule_tac "s1.0" = b in eval_gext')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   411
apply (clarsimp simp add: assign_conforms_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   412
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   413
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   414
(* Cond *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   415
apply (tactic "smp_tac 3 1") apply (tactic "smp_tac 2 1") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   416
apply (tactic "smp_tac 1 1") apply (erule impE) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   417
apply (rule impI,rule exI) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   418
apply (rule_tac x = "if the_Bool b then T1 else T2" in exI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   419
apply (force split add: split_if)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   420
apply assumption
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   421
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   422
(* Body *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   423
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   424
apply (rule conforms_absorb,assumption)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   425
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   426
(* Lab *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   427
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   428
apply (rule conforms_absorb,assumption)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   429
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   430
(* If *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   431
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   432
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   433
apply (force split add: split_if)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   434
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   435
(* Throw *)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   436
apply (drule (3) evaln_type_sound)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   437
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   438
apply (drule (3) Throw_lemma)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   439
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   440
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   441
(* Try *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   442
apply (frule (1) sxalloc_type_sound)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   443
apply (erule sxalloc_elim_cases2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   444
apply  (tactic "smp_tac 3 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   445
apply  (clarsimp split add: option.split_asm)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   446
apply (clarsimp split add: option.split_asm)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   447
apply (tactic "smp_tac 1 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   448
apply (simp only: split add: split_if_asm)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   449
prefer 2
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   450
apply  (tactic "smp_tac 3 1", erule_tac V = "All ?P" in thin_rl, clarsimp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   451
apply (drule spec, erule_tac V = "All ?P" in thin_rl, drule spec, drule spec, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   452
       erule impE, force)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   453
apply (frule (2) Try_lemma)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   454
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   455
apply (fast elim!: conforms_deallocL)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   456
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   457
(* Fin *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   458
apply (tactic "sound_forw_hyp_tac 1")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   459
apply (case_tac "x1", force)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   460
apply clarsimp
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12859
diff changeset
   461
apply (drule (3) evaln_eval, drule (4) Fin_lemma)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   462
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   463
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   464
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   465
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   466
declare subst_Bool_def2 [simp]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   467
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   468
theorem ax_sound: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   469
 "wf_prog G \<Longrightarrow> G,(A::'a triple set)|\<turnstile>(ts::'a triple set) \<Longrightarrow> G,A|\<Turnstile>ts"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   470
apply (subst ax_valids2_eq [symmetric])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   471
apply  assumption
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   472
apply (erule (1) ax_sound2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   473
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   474
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   475
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   476
end