src/HOL/Bali/WellForm.thy
author schirmer
Wed, 27 Feb 2002 08:52:09 +0100
changeset 12962 a24ffe84a06a
parent 12937 0c4fd7529467
child 12963 73fb6a200e36
permissions -rw-r--r--
Cleaning up the definition of static overriding.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12857
a4386cc9b1c3 tuned header;
wenzelm
parents: 12854
diff changeset
     1
(*  Title:      HOL/Bali/WellForm.thy
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     2
    ID:         $Id$
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
     3
    Author:     David von Oheimb and Norbert Schirmer
12858
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
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     7
header {* Well-formedness of Java programs *}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     8
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
     9
theory WellForm = WellType:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    10
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    11
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    12
For static checks on expressions and statements, see WellType.thy
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    13
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    14
improvements over Java Specification 1.0 (cf. 8.4.6.3, 8.4.6.4, 9.4.1):
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    15
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    16
\item a method implementing or overwriting another method may have a result 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    17
      type that widens to the result type of the other method 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    18
      (instead of identical type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    19
\item if a method hides another method (both methods have to be static!)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    20
  there are no restrictions to the result type 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    21
  since the methods have to be static and there is no dynamic binding of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    22
  static methods
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    23
\item if an interface inherits more than one method with the same signature, the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    24
  methods need not have identical return types
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    25
\end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    26
simplifications:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    27
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    28
\item Object and standard exceptions are assumed to be declared like normal 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    29
      classes
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    30
\end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    31
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    32
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    33
section "well-formed field declarations"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
    34
text  {* well-formed field declaration (common part for classes and interfaces),
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
    35
        cf. 8.3 and (9.3) *}
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    36
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    37
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    38
  wf_fdecl :: "prog \<Rightarrow> pname \<Rightarrow> fdecl \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    39
 "wf_fdecl G P \<equiv> \<lambda>(fn,f). is_acc_type G P (type f)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    40
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    41
lemma wf_fdecl_def2: "\<And>fd. wf_fdecl G P fd = is_acc_type G P (type (snd fd))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    42
apply (unfold wf_fdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    43
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    44
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    45
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    46
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    47
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    48
section "well-formed method declarations"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    49
  (*well-formed method declaration,cf. 8.4, 8.4.1, 8.4.3, 8.4.5, 14.3.2, (9.4)*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    50
  (* cf. 14.15, 15.7.2, for scope issues cf. 8.4.1 and 14.3.2 *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    51
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    52
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    53
A method head is wellformed if:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    54
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    55
\item the signature and the method head agree in the number of parameters
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    56
\item all types of the parameters are visible
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    57
\item the result type is visible
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    58
\item the parameter names are unique
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    59
\end{itemize} 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    60
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    61
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    62
  wf_mhead :: "prog \<Rightarrow> pname \<Rightarrow> sig \<Rightarrow> mhead \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    63
 "wf_mhead G P \<equiv> \<lambda> sig mh. length (parTs sig) = length (pars mh) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    64
			    \<spacespace> ( \<forall>T\<in>set (parTs sig). is_acc_type G P T) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    65
                            is_acc_type G P (resTy mh) \<and>
12893
cbb4dc5e6478 replaced nodups by distinct;
wenzelm
parents: 12858
diff changeset
    66
			    \<spacespace> distinct (pars mh)"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    67
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    68
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    69
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    70
A method declaration is wellformed if:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    71
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    72
\item the method head is wellformed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    73
\item the names of the local variables are unique
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    74
\item the types of the local variables must be accessible
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    75
\item the local variables don't shadow the parameters
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    76
\item the class of the method is defined
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    77
\item the body statement is welltyped with respect to the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    78
      modified environment of local names, were the local variables, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    79
      the parameters the special result variable (Res) and This are assoziated
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    80
      with there types. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    81
\end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    82
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    83
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    84
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    85
  wf_mdecl :: "prog \<Rightarrow> qtname \<Rightarrow> mdecl \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    86
 "wf_mdecl G C \<equiv> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    87
      \<lambda>(sig,m).
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    88
	  wf_mhead G (pid C) sig (mhead m) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    89
          unique (lcls (mbody m)) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    90
          (\<forall>(vn,T)\<in>set (lcls (mbody m)). is_acc_type G (pid C) T) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    91
	  (\<forall>pn\<in>set (pars m). table_of (lcls (mbody m)) pn = None) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    92
          is_class G C \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    93
          \<lparr>prg=G,cls=C,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    94
           lcl=\<lambda> k. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    95
               (case k of
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    96
                  EName e 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    97
                  \<Rightarrow> (case e of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    98
                        VNam v 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
    99
                        \<Rightarrow>(table_of (lcls (mbody m))((pars m)[\<mapsto>](parTs sig))) v
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   100
                      | Res \<Rightarrow> Some (resTy m))
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
   101
	        | This \<Rightarrow> if is_static m then None else Some (Class C))
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   102
          \<rparr>\<turnstile>(stmt (mbody m))\<Colon>\<surd>"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   103
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   104
lemma wf_mheadI: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   105
"\<lbrakk>length (parTs sig) = length (pars m); \<forall>T\<in>set (parTs sig). is_acc_type G P T;
12893
cbb4dc5e6478 replaced nodups by distinct;
wenzelm
parents: 12858
diff changeset
   106
  is_acc_type G P (resTy m); distinct (pars m)\<rbrakk> \<Longrightarrow>  
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   107
  wf_mhead G P sig m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   108
apply (unfold wf_mhead_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   109
apply (simp (no_asm_simp))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   110
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   111
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   112
lemma wf_mdeclI: "\<lbrakk>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   113
  wf_mhead G (pid C) sig (mhead m); unique (lcls (mbody m));  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   114
  (\<forall>pn\<in>set (pars m). table_of (lcls (mbody m)) pn = None); 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   115
  \<forall>(vn,T)\<in>set (lcls (mbody m)). is_acc_type G (pid C) T;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   116
  is_class G C;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   117
  \<lparr>prg=G,cls=C,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   118
   lcl=\<lambda> k. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   119
       (case k of
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   120
          EName e 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   121
          \<Rightarrow> (case e of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   122
                VNam v 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   123
                \<Rightarrow> (table_of (lcls (mbody m))((pars m)[\<mapsto>](parTs sig))) v
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   124
              | Res \<Rightarrow> Some (resTy m))
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
   125
        | This \<Rightarrow> if is_static m then None else Some (Class C))
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   126
  \<rparr>\<turnstile>(stmt (mbody m))\<Colon>\<surd>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   127
  \<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   128
  wf_mdecl G C (sig,m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   129
apply (unfold wf_mdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   130
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   131
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   132
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   133
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   134
lemma wf_mdeclD1: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   135
"wf_mdecl G C (sig,m) \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   136
   wf_mhead G (pid C) sig (mhead m) \<and> unique (lcls (mbody m)) \<and>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   137
  (\<forall>pn\<in>set (pars m). table_of (lcls (mbody m)) pn = None) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   138
  (\<forall>(vn,T)\<in>set (lcls (mbody m)). is_acc_type G (pid C) T)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   139
apply (unfold wf_mdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   140
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   141
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   142
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   143
lemma wf_mdecl_bodyD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   144
"wf_mdecl G C (sig,m) \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   145
 (\<exists>T. \<lparr>prg=G,cls=C,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   146
       lcl = \<lambda> k. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   147
         (case k of
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   148
            EName e 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   149
            \<Rightarrow> (case e of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   150
                VNam v \<Rightarrow> (table_of (lcls (mbody m))((pars m)[\<mapsto>](parTs sig))) v
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   151
                | Res  \<Rightarrow> Some (resTy m))
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
   152
          | This \<Rightarrow> if is_static m then None else Some (Class C))
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   153
       \<rparr>\<turnstile>Body C (stmt (mbody m))\<Colon>-T \<and> G\<turnstile>T\<preceq>(resTy m))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   154
apply (unfold wf_mdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   155
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   156
apply (rule_tac x="(resTy m)" in exI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   157
apply (unfold wf_mhead_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   158
apply (auto simp add: wf_mhead_def is_acc_type_def intro: wt.Body )
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   159
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   160
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   161
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   162
(*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   163
lemma static_Object_methodsE [elim!]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   164
 "\<lbrakk>wf_mdecl G Object (sig, m);static m\<rbrakk> \<Longrightarrow> R"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   165
apply (unfold wf_mdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   166
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   167
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   168
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   169
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   170
lemma rT_is_acc_type: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   171
  "wf_mhead G P sig m \<Longrightarrow> is_acc_type G P (resTy m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   172
apply (unfold wf_mhead_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   173
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   174
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   175
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   176
section "well-formed interface declarations"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   177
  (* well-formed interface declaration, cf. 9.1, 9.1.2.1, 9.1.3, 9.4 *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   178
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   179
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   180
A interface declaration is wellformed if:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   181
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   182
\item the interface hierarchy is wellstructured
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   183
\item there is no class with the same name
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   184
\item the method heads are wellformed and not static and have Public access
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   185
\item the methods are uniquely named
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   186
\item all superinterfaces are accessible
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   187
\item the result type of a method overriding a method of Object widens to the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   188
      result type of the overridden method.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   189
      Shadowing static methods is forbidden.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   190
\item the result type of a method overriding a set of methods defined in the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   191
      superinterfaces widens to each of the corresponding result types
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   192
\end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   193
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   194
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   195
  wf_idecl :: "prog  \<Rightarrow> idecl \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   196
 "wf_idecl G \<equiv> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   197
    \<lambda>(I,i). 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   198
        ws_idecl G I (isuperIfs i) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   199
	\<not>is_class G I \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   200
	(\<forall>(sig,mh)\<in>set (imethods i). wf_mhead G (pid I) sig mh \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   201
                                     \<not>is_static mh \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   202
                                      accmodi mh = Public) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   203
	unique (imethods i) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   204
        (\<forall> J\<in>set (isuperIfs i). is_acc_iface G (pid I) J) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   205
        (table_of (imethods i)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   206
          hiding (methd G Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   207
          under  (\<lambda> new old. accmodi old \<noteq> Private)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   208
          entails (\<lambda>new old. G\<turnstile>resTy new\<preceq>resTy old \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   209
                             is_static new = is_static old)) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   210
        (o2s \<circ> table_of (imethods i) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   211
               hidings Un_tables((\<lambda>J.(imethds G J))`set (isuperIfs i))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   212
	       entails (\<lambda>new old. G\<turnstile>resTy new\<preceq>resTy old))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   213
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   214
lemma wf_idecl_mhead: "\<lbrakk>wf_idecl G (I,i); (sig,mh)\<in>set (imethods i)\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   215
  wf_mhead G (pid I) sig mh \<and> \<not>is_static mh \<and> accmodi mh = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   216
apply (unfold wf_idecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   217
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   218
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   219
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   220
lemma wf_idecl_hidings: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   221
"wf_idecl G (I, i) \<Longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   222
  (\<lambda>s. o2s (table_of (imethods i) s)) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   223
  hidings Un_tables ((\<lambda>J. imethds G J) ` set (isuperIfs i))  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   224
  entails \<lambda>new old. G\<turnstile>resTy new\<preceq>resTy old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   225
apply (unfold wf_idecl_def o_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   226
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   227
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   228
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   229
lemma wf_idecl_hiding:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   230
"wf_idecl G (I, i) \<Longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   231
 (table_of (imethods i)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   232
           hiding (methd G Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   233
           under  (\<lambda> new old. accmodi old \<noteq> Private)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   234
           entails (\<lambda>new old. G\<turnstile>resTy new\<preceq>resTy old \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   235
                              is_static new = is_static old))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   236
apply (unfold wf_idecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   237
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   238
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   239
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   240
lemma wf_idecl_supD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   241
"\<lbrakk>wf_idecl G (I,i); J \<in> set (isuperIfs i)\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   242
 \<Longrightarrow> is_acc_iface G (pid I) J \<and> (J, I) \<notin> (subint1 G)^+"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   243
apply (unfold wf_idecl_def ws_idecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   244
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   245
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   246
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   247
section "well-formed class declarations"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   248
  (* well-formed class declaration, cf. 8.1, 8.1.2.1, 8.1.2.2, 8.1.3, 8.1.4 and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   249
   class method declaration, cf. 8.4.3.3, 8.4.6.1, 8.4.6.2, 8.4.6.3, 8.4.6.4 *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   250
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   251
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   252
A class declaration is wellformed if:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   253
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   254
\item there is no interface with the same name
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   255
\item all superinterfaces are accessible and for all methods implementing 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   256
      an interface method the result type widens to the result type of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   257
      the interface method, the method is not static and offers at least 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   258
      as much access 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   259
      (this actually means that the method has Public access, since all 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   260
      interface methods have public access)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   261
\item all field declarations are wellformed and the field names are unique
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   262
\item all method declarations are wellformed and the method names are unique
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   263
\item the initialization statement is welltyped
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   264
\item the classhierarchy is wellstructured
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   265
\item Unless the class is Object:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   266
      \begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   267
      \item the superclass is accessible
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   268
      \item for all methods overriding another method (of a superclass )the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   269
            result type widens to the result type of the overridden method,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   270
            the access modifier of the new method provides at least as much
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   271
            access as the overwritten one.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   272
      \item for all methods hiding a method (of a superclass) the hidden 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   273
            method must be static and offer at least as much access rights.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   274
            Remark: In contrast to the Java Language Specification we don't
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   275
            restrict the result types of the method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   276
            (as in case of overriding), because there seems to be no reason,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   277
            since there is no dynamic binding of static methods.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   278
            (cf. 8.4.6.3 vs. 15.12.1).
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   279
            Stricly speaking the restrictions on the access rights aren't 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   280
            necessary to, since the static type and the access rights 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   281
            together determine which method is to be called statically. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   282
            But if a class gains more then one static method with the 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   283
            same signature due to inheritance, it is confusing when the 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   284
            method selection depends on the access rights only: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   285
            e.g.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   286
              Class C declares static public method foo().
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   287
              Class D is subclass of C and declares static method foo()
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   288
              with default package access.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   289
              D.foo() ? if this call is in the same package as D then
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   290
                        foo of class D is called, otherwise foo of class C.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   291
      \end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   292
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   293
\end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   294
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   295
(* to Table *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   296
constdefs entails:: "('a,'b) table \<Rightarrow> ('b \<Rightarrow> bool) \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   297
                                 ("_ entails _" 20)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   298
"t entails P \<equiv> \<forall>k. \<forall> x \<in> t k: P x"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   299
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   300
lemma entailsD:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   301
 "\<lbrakk>t entails P; t k = Some x\<rbrakk> \<Longrightarrow> P x"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   302
by (simp add: entails_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   303
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   304
lemma empty_entails[simp]: "empty entails P"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   305
by (simp add: entails_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   306
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   307
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   308
 wf_cdecl :: "prog \<Rightarrow> cdecl \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   309
"wf_cdecl G \<equiv> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   310
   \<lambda>(C,c).
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   311
      \<not>is_iface G C \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   312
      (\<forall>I\<in>set (superIfs c). is_acc_iface G (pid C) I \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   313
        (\<forall>s. \<forall> im \<in> imethds G I s.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   314
      	    (\<exists> cm \<in> methd  G C s: G\<turnstile>resTy cm\<preceq>resTy im \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   315
      	                             \<not> is_static cm \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   316
                                     accmodi im \<le> accmodi cm))) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   317
      (\<forall>f\<in>set (cfields c). wf_fdecl G (pid C) f) \<and> unique (cfields c) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   318
      (\<forall>m\<in>set (methods c). wf_mdecl G C m) \<and> unique (methods c) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   319
      \<lparr>prg=G,cls=C,lcl=empty\<rparr>\<turnstile>(init c)\<Colon>\<surd> \<and> ws_cdecl G C (super c) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   320
      (C \<noteq> Object \<longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   321
            (is_acc_class G (pid C) (super c) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   322
            (table_of (map (\<lambda> (s,m). (s,C,m)) (methods c)) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   323
             entails (\<lambda> new. \<forall> old sig. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   324
                       (G,sig\<turnstile>new overrides\<^sub>S old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   325
                        \<longrightarrow> (G\<turnstile>resTy new\<preceq>resTy old \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   326
                             accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   327
      	                     \<not>is_static old)) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   328
                       (G,sig\<turnstile>new hides old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   329
                         \<longrightarrow> (accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   330
      	                      is_static old)))) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   331
            ))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   332
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   333
(*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   334
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   335
 wf_cdecl :: "prog \<Rightarrow> cdecl \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   336
"wf_cdecl G \<equiv> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   337
   \<lambda>(C,c).
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   338
      \<not>is_iface G C \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   339
      (\<forall>I\<in>set (superIfs c). is_acc_iface G (pid C) I \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   340
        (\<forall>s. \<forall> im \<in> imethds G I s.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   341
      	    (\<exists> cm \<in> methd  G C s: G\<turnstile>resTy (mthd cm)\<preceq>resTy (mthd im) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   342
      	                             \<not> is_static cm \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   343
                                     accmodi im \<le> accmodi cm))) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   344
      (\<forall>f\<in>set (cfields c). wf_fdecl G (pid C) f) \<and> unique (cfields c) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   345
      (\<forall>m\<in>set (methods c). wf_mdecl G C m) \<and> unique (methods c) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   346
      \<lparr>prg=G,cls=C,lcl=empty\<rparr>\<turnstile>(init c)\<Colon>\<surd> \<and> ws_cdecl G C (super c) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   347
      (C \<noteq> Object \<longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   348
            (is_acc_class G (pid C) (super c) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   349
            (table_of (map (\<lambda> (s,m). (s,C,m)) (methods c)) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   350
              hiding methd G (super c)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   351
              under (\<lambda> new old. G\<turnstile>new overrides old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   352
              entails (\<lambda> new old. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   353
                           (G\<turnstile>resTy (mthd new)\<preceq>resTy (mthd old) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   354
                            accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   355
      	                   \<not> is_static old)))  \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   356
            (table_of (map (\<lambda> (s,m). (s,C,m)) (methods c)) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   357
              hiding methd G (super c)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   358
              under (\<lambda> new old. G\<turnstile>new hides old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   359
              entails (\<lambda> new old. is_static old \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   360
                                  accmodi old \<le> accmodi new))  \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   361
            (table_of (cfields c) hiding accfield G C (super c)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   362
              entails (\<lambda> newF oldF. accmodi oldF \<le> access newF))))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   363
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   364
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   365
lemma wf_cdecl_unique: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   366
"wf_cdecl G (C,c) \<Longrightarrow> unique (cfields c) \<and> unique (methods c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   367
apply (unfold wf_cdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   368
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   369
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   370
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   371
lemma wf_cdecl_fdecl: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   372
"\<lbrakk>wf_cdecl G (C,c); f\<in>set (cfields c)\<rbrakk> \<Longrightarrow> wf_fdecl G (pid C) f"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   373
apply (unfold wf_cdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   374
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   375
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   376
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   377
lemma wf_cdecl_mdecl: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   378
"\<lbrakk>wf_cdecl G (C,c); m\<in>set (methods c)\<rbrakk> \<Longrightarrow> wf_mdecl G C m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   379
apply (unfold wf_cdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   380
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   381
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   382
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   383
lemma wf_cdecl_impD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   384
"\<lbrakk>wf_cdecl G (C,c); I\<in>set (superIfs c)\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   385
\<Longrightarrow> is_acc_iface G (pid C) I \<and>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   386
    (\<forall>s. \<forall>im \<in> imethds G I s.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   387
        (\<exists>cm \<in> methd G C s: G\<turnstile>resTy cm\<preceq>resTy im \<and> \<not>is_static cm \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   388
                                   accmodi im \<le> accmodi cm))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   389
apply (unfold wf_cdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   390
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   391
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   392
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   393
lemma wf_cdecl_supD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   394
"\<lbrakk>wf_cdecl G (C,c); C \<noteq> Object\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   395
  is_acc_class G (pid C) (super c) \<and> (super c,C) \<notin> (subcls1 G)^+ \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   396
   (table_of (map (\<lambda> (s,m). (s,C,m)) (methods c)) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   397
    entails (\<lambda> new. \<forall> old sig. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   398
                 (G,sig\<turnstile>new overrides\<^sub>S old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   399
                  \<longrightarrow> (G\<turnstile>resTy new\<preceq>resTy old \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   400
                       accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   401
                       \<not>is_static old)) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   402
                 (G,sig\<turnstile>new hides old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   403
                   \<longrightarrow> (accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   404
                        is_static old))))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   405
apply (unfold wf_cdecl_def ws_cdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   406
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   407
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   408
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   409
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   410
lemma wf_cdecl_overrides_SomeD:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   411
"\<lbrakk>wf_cdecl G (C,c); C \<noteq> Object; table_of (methods c) sig = Some newM;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   412
  G,sig\<turnstile>(C,newM) overrides\<^sub>S old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   413
\<rbrakk> \<Longrightarrow>  G\<turnstile>resTy newM\<preceq>resTy old \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   414
       accmodi old \<le> accmodi newM \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   415
       \<not> is_static old" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   416
apply (drule (1) wf_cdecl_supD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   417
apply (clarify)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   418
apply (drule entailsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   419
apply   (blast intro: table_of_map_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   420
apply (drule_tac x="old" in spec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   421
apply (auto dest: overrides_eq_sigD simp add: msig_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   422
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   423
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   424
lemma wf_cdecl_hides_SomeD:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   425
"\<lbrakk>wf_cdecl G (C,c); C \<noteq> Object; table_of (methods c) sig = Some newM;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   426
  G,sig\<turnstile>(C,newM) hides old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   427
\<rbrakk> \<Longrightarrow>  accmodi old \<le> access newM \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   428
       is_static old" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   429
apply (drule (1) wf_cdecl_supD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   430
apply (clarify)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   431
apply (drule entailsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   432
apply   (blast intro: table_of_map_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   433
apply (drule_tac x="old" in spec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   434
apply (auto dest: hides_eq_sigD simp add: msig_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   435
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   436
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   437
lemma wf_cdecl_wt_init: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   438
 "wf_cdecl G (C, c) \<Longrightarrow> \<lparr>prg=G,cls=C,lcl=empty\<rparr>\<turnstile>init c\<Colon>\<surd>"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   439
apply (unfold wf_cdecl_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   440
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   441
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   442
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   443
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   444
section "well-formed programs"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   445
  (* well-formed program, cf. 8.1, 9.1 *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   446
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   447
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   448
A program declaration is wellformed if:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   449
\begin{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   450
\item the class ObjectC of Object is defined
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   451
\item every method of has an access modifier distinct from Package. This is
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   452
      necessary since every interface automatically inherits from Object.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   453
      We must know, that every time a Object method is "overriden" by an 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   454
      interface method this is also overriden by the class implementing the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   455
      the interface (see @{text "implement_dynmethd and class_mheadsD"})
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   456
\item all standard Exceptions are defined
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   457
\item all defined interfaces are wellformed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   458
\item all defined classes are wellformed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   459
\end{itemize}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   460
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   461
constdefs
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   462
  wf_prog  :: "prog \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   463
 "wf_prog G \<equiv> let is = ifaces G; cs = classes G in
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   464
	         ObjectC \<in> set cs \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   465
                (\<forall> m\<in>set Object_mdecls. accmodi m \<noteq> Package) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   466
                (\<forall>xn. SXcptC xn \<in> set cs) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   467
		(\<forall>i\<in>set is. wf_idecl G i) \<and> unique is \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   468
		(\<forall>c\<in>set cs. wf_cdecl G c) \<and> unique cs"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   469
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   470
lemma wf_prog_idecl: "\<lbrakk>iface G I = Some i; wf_prog G\<rbrakk> \<Longrightarrow> wf_idecl G (I,i)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   471
apply (unfold wf_prog_def Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   472
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   473
apply (fast dest: map_of_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   474
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   475
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   476
lemma wf_prog_cdecl: "\<lbrakk>class G C = Some c; wf_prog G\<rbrakk> \<Longrightarrow> wf_cdecl G (C,c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   477
apply (unfold wf_prog_def Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   478
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   479
apply (fast dest: map_of_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   480
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   481
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   482
lemma wf_prog_Object_mdecls:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   483
"wf_prog G \<Longrightarrow> (\<forall> m\<in>set Object_mdecls. accmodi m \<noteq> Package)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   484
apply (unfold wf_prog_def Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   485
apply simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   486
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   487
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   488
lemma wf_prog_acc_superD:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   489
 "\<lbrakk>wf_prog G; class G C = Some c; C \<noteq> Object \<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   490
  \<Longrightarrow> is_acc_class G (pid C) (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   491
by (auto dest: wf_prog_cdecl wf_cdecl_supD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   492
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   493
lemma wf_ws_prog [elim!,simp]: "wf_prog G \<Longrightarrow> ws_prog G"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   494
apply (unfold wf_prog_def Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   495
apply (rule ws_progI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   496
apply  (simp_all (no_asm))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   497
apply  (auto simp add: is_acc_class_def is_acc_iface_def 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   498
             dest!: wf_idecl_supD wf_cdecl_supD )+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   499
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   500
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   501
lemma class_Object [simp]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   502
"wf_prog G \<Longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   503
  class G Object = Some \<lparr>access=Public,cfields=[],methods=Object_mdecls,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   504
                                  init=Skip,super=arbitrary,superIfs=[]\<rparr>"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   505
apply (unfold wf_prog_def Let_def ObjectC_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   506
apply (fast dest!: map_of_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   507
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   508
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   509
lemma methd_Object[simp]: "wf_prog G \<Longrightarrow> methd G Object =  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   510
  table_of (map (\<lambda>(s,m). (s, Object, m)) Object_mdecls)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   511
apply (subst methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   512
apply (auto simp add: Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   513
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   514
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   515
lemma wf_prog_Object_methd:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   516
"\<lbrakk>wf_prog G; methd G Object sig = Some m\<rbrakk> \<Longrightarrow> accmodi m \<noteq> Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   517
by (auto dest!: wf_prog_Object_mdecls) (auto dest!: map_of_SomeD) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   518
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   519
lemma wf_prog_Object_is_public[intro]:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   520
 "wf_prog G \<Longrightarrow> is_public G Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   521
by (auto simp add: is_public_def dest: class_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   522
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   523
lemma class_SXcpt [simp]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   524
"wf_prog G \<Longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   525
  class G (SXcpt xn) = Some \<lparr>access=Public,cfields=[],methods=SXcpt_mdecls,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   526
                                   init=Skip,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   527
                                   super=if xn = Throwable then Object 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   528
                                                           else SXcpt Throwable,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   529
                                   superIfs=[]\<rparr>"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   530
apply (unfold wf_prog_def Let_def SXcptC_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   531
apply (fast dest!: map_of_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   532
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   533
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   534
lemma wf_ObjectC [simp]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   535
	"wf_cdecl G ObjectC = (\<not>is_iface G Object \<and> Ball (set Object_mdecls)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   536
  (wf_mdecl G Object) \<and> unique Object_mdecls)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   537
apply (unfold wf_cdecl_def ws_cdecl_def ObjectC_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   538
apply (simp (no_asm))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   539
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   540
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   541
lemma Object_is_class [simp,elim!]: "wf_prog G \<Longrightarrow> is_class G Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   542
apply (simp (no_asm_simp))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   543
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   544
 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   545
lemma Object_is_acc_class [simp,elim!]: "wf_prog G \<Longrightarrow> is_acc_class G S Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   546
apply (simp (no_asm_simp) add: is_acc_class_def is_public_def
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   547
                               accessible_in_RefT_simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   548
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   549
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   550
lemma SXcpt_is_class [simp,elim!]: "wf_prog G \<Longrightarrow> is_class G (SXcpt xn)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   551
apply (simp (no_asm_simp))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   552
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   553
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   554
lemma SXcpt_is_acc_class [simp,elim!]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   555
"wf_prog G \<Longrightarrow> is_acc_class G S (SXcpt xn)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   556
apply (simp (no_asm_simp) add: is_acc_class_def is_public_def
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   557
                               accessible_in_RefT_simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   558
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   559
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   560
lemma fields_Object [simp]: "wf_prog G \<Longrightarrow> DeclConcepts.fields G Object = []"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   561
by (force intro: fields_emptyI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   562
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   563
lemma accfield_Object [simp]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   564
 "wf_prog G \<Longrightarrow> accfield G S Object = empty"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   565
apply (unfold accfield_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   566
apply (simp (no_asm_simp) add: Let_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   567
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   568
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   569
lemma fields_Throwable [simp]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   570
 "wf_prog G \<Longrightarrow> DeclConcepts.fields G (SXcpt Throwable) = []"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   571
by (force intro: fields_emptyI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   572
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   573
lemma fields_SXcpt [simp]: "wf_prog G \<Longrightarrow> DeclConcepts.fields G (SXcpt xn) = []"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   574
apply (case_tac "xn = Throwable")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   575
apply  (simp (no_asm_simp))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   576
by (force intro: fields_emptyI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   577
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   578
lemmas widen_trans = ws_widen_trans [OF _ _ wf_ws_prog, elim]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   579
lemma widen_trans2 [elim]: "\<lbrakk>G\<turnstile>U\<preceq>T; G\<turnstile>S\<preceq>U; wf_prog G\<rbrakk> \<Longrightarrow> G\<turnstile>S\<preceq>T"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   580
apply (erule (2) widen_trans)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   581
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   582
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   583
lemma Xcpt_subcls_Throwable [simp]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   584
"wf_prog G \<Longrightarrow> G\<turnstile>SXcpt xn\<preceq>\<^sub>C SXcpt Throwable"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   585
apply (rule SXcpt_subcls_Throwable_lemma)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   586
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   587
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   588
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   589
lemma unique_fields: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   590
 "\<lbrakk>is_class G C; wf_prog G\<rbrakk> \<Longrightarrow> unique (DeclConcepts.fields G C)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   591
apply (erule ws_unique_fields)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   592
apply  (erule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   593
apply (erule (1) wf_prog_cdecl [THEN wf_cdecl_unique [THEN conjunct1]])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   594
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   595
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   596
lemma fields_mono: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   597
"\<lbrakk>table_of (DeclConcepts.fields G C) fn = Some f; G\<turnstile>D\<preceq>\<^sub>C C; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   598
  is_class G D; wf_prog G\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   599
   \<Longrightarrow> table_of (DeclConcepts.fields G D) fn = Some f"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   600
apply (rule map_of_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   601
apply  (erule (1) unique_fields)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   602
apply (erule (1) map_of_SomeD [THEN fields_mono_lemma])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   603
apply (erule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   604
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   605
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   606
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   607
lemma fields_is_type [elim]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   608
"\<lbrakk>table_of (DeclConcepts.fields G C) m = Some f; wf_prog G; is_class G C\<rbrakk> \<Longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   609
      is_type G (type f)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   610
apply (frule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   611
apply (force dest: fields_declC [THEN conjunct1] 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   612
                   wf_prog_cdecl [THEN wf_cdecl_fdecl]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   613
             simp add: wf_fdecl_def2 is_acc_type_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   614
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   615
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   616
lemma imethds_wf_mhead [rule_format (no_asm)]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   617
"\<lbrakk>m \<in> imethds G I sig; wf_prog G; is_iface G I\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   618
  wf_mhead G (pid (decliface m)) sig (mthd m) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   619
  \<not> is_static m \<and> accmodi m = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   620
apply (frule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   621
apply (drule (2) imethds_declI [THEN conjunct1])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   622
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   623
apply (frule_tac I="(decliface m)" in wf_prog_idecl,assumption)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   624
apply (drule wf_idecl_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   625
apply (erule map_of_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   626
apply (cases m, simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   627
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   628
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   629
lemma methd_wf_mdecl: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   630
 "\<lbrakk>methd G C sig = Some m; wf_prog G; class G C = Some y\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   631
  G\<turnstile>C\<preceq>\<^sub>C (declclass m) \<and> is_class G (declclass m) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   632
  wf_mdecl G (declclass m) (sig,(mthd m))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   633
apply (frule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   634
apply (drule (1) methd_declC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   635
apply  fast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   636
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   637
apply (frule (1) wf_prog_cdecl, erule wf_cdecl_mdecl, erule map_of_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   638
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   639
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   640
(*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   641
This lemma doesn't hold!
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   642
lemma methd_rT_is_acc_type: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   643
"\<lbrakk>wf_prog G;methd G C C sig = Some (D,m);
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   644
    class G C = Some y\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   645
\<Longrightarrow> is_acc_type G (pid C) (resTy m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   646
The result Type is only visible in the scope of defining class D 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   647
"is_vis_type G (pid D) (resTy m)" but not necessarily in scope of class C!
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   648
(The same is true for the type of pramaters of a method)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   649
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   650
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   651
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   652
lemma methd_rT_is_type: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   653
"\<lbrakk>wf_prog G;methd G C sig = Some m;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   654
    class G C = Some y\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   655
\<Longrightarrow> is_type G (resTy m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   656
apply (drule (2) methd_wf_mdecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   657
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   658
apply (drule wf_mdeclD1)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   659
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   660
apply (drule rT_is_acc_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   661
apply (cases m, simp add: is_acc_type_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   662
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   663
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   664
lemma accmethd_rT_is_type:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   665
"\<lbrakk>wf_prog G;accmethd G S C sig = Some m;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   666
    class G C = Some y\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   667
\<Longrightarrow> is_type G (resTy m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   668
by (auto simp add: accmethd_def  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   669
         intro: methd_rT_is_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   670
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   671
lemma methd_Object_SomeD:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   672
"\<lbrakk>wf_prog G;methd G Object sig = Some m\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   673
 \<Longrightarrow> declclass m = Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   674
by (auto dest: class_Object simp add: methd_rec )
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   675
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   676
lemma wf_imethdsD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   677
 "\<lbrakk>im \<in> imethds G I sig;wf_prog G; is_iface G I\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   678
 \<Longrightarrow> \<not>is_static im \<and> accmodi im = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   679
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   680
  assume asm: "wf_prog G" "is_iface G I" "im \<in> imethds G I sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   681
  have "wf_prog G \<longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   682
         (\<forall> i im. iface G I = Some i \<longrightarrow> im \<in> imethds G I sig
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   683
                  \<longrightarrow> \<not>is_static im \<and> accmodi im = Public)" (is "?P G I")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   684
  proof (rule iface_rec.induct,intro allI impI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   685
    fix G I i im
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   686
    assume hyp: "\<forall> J i. J \<in> set (isuperIfs i) \<and> ws_prog G \<and> iface G I = Some i
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   687
                 \<longrightarrow> ?P G J"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   688
    assume wf: "wf_prog G" and if_I: "iface G I = Some i" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   689
           im: "im \<in> imethds G I sig" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   690
    show "\<not>is_static im \<and> accmodi im = Public" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   691
    proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   692
      let ?inherited = "Un_tables (imethds G ` set (isuperIfs i))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   693
      let ?new = "(o2s \<circ> table_of (map (\<lambda>(s, mh). (s, I, mh)) (imethods i)))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   694
      from if_I wf im have imethds:"im \<in> (?inherited \<oplus>\<oplus> ?new) sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   695
	by (simp add: imethds_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   696
      from wf if_I have 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   697
	wf_supI: "\<forall> J. J \<in> set (isuperIfs i) \<longrightarrow> (\<exists> j. iface G J = Some j)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   698
	by (blast dest: wf_prog_idecl wf_idecl_supD is_acc_ifaceD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   699
      from wf if_I have
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   700
	"\<forall> im \<in> set (imethods i). \<not> is_static im \<and> accmodi im = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   701
	by (auto dest!: wf_prog_idecl wf_idecl_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   702
      then have new_ok: "\<forall> im. table_of (imethods i) sig = Some im 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   703
                         \<longrightarrow>  \<not> is_static im \<and> accmodi im = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   704
	by (auto dest!: table_of_Some_in_set)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   705
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   706
	proof (cases "?new sig = {}")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   707
	  case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   708
	  from True wf wf_supI if_I imethds hyp 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   709
	  show ?thesis by (auto simp del:  split_paired_All)  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   710
	next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   711
	  case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   712
	  from False wf wf_supI if_I imethds new_ok hyp 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   713
	  show ?thesis by (auto dest: wf_idecl_hidings hidings_entailsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   714
	qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   715
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   716
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   717
  with asm show ?thesis by (auto simp del: split_paired_All)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   718
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   719
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   720
lemma wf_prog_hidesD:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   721
  assumes hides: "G \<turnstile>new hides old" and wf: "wf_prog G"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   722
  shows
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   723
   "accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   724
    is_static old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   725
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   726
  from hides 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   727
  obtain c where 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   728
    clsNew: "class G (declclass new) = Some c" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   729
    neqObj: "declclass new \<noteq> Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   730
    by (auto dest: hidesD declared_in_classD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   731
  with hides obtain newM oldM where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   732
    newM: "table_of (methods c) (msig new) = Some newM" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   733
     new: "new = (declclass new,(msig new),newM)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   734
     old: "old = (declclass old,(msig old),oldM)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   735
          "msig new = msig old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   736
    by (cases new,cases old) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   737
       (auto dest: hidesD 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   738
         simp add: cdeclaredmethd_def declared_in_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   739
  with hides 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   740
  have hides':
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   741
        "G,(msig new)\<turnstile>(declclass new,newM) hides (declclass old,oldM)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   742
    by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   743
  from clsNew wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   744
  have "wf_cdecl G (declclass new,c)" by (blast intro: wf_prog_cdecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   745
  note wf_cdecl_hides_SomeD [OF this neqObj newM hides']
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   746
  with new old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   747
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   748
    by (cases new, cases old) auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   749
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   750
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   751
text {* Compare this lemma about static  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   752
overriding @{term "G \<turnstile>new overrides\<^sub>S old"} with the definition of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   753
dynamic overriding @{term "G \<turnstile>new overrides old"}. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   754
Conforming result types and restrictions on the access modifiers of the old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   755
and the new method are not part of the predicate for static overriding. But
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   756
they are enshured in a wellfromed program.  Dynamic overriding has 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   757
no restrictions on the access modifiers but enforces confrom result types 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   758
as precondition. But with some efford we can guarantee the access modifier
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   759
restriction for dynamic overriding, too. See lemma 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   760
@{text wf_prog_dyn_override_prop}.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   761
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   762
lemma wf_prog_stat_overridesD:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   763
  assumes stat_override: "G \<turnstile>new overrides\<^sub>S old" and wf: "wf_prog G"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   764
  shows
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   765
   "G\<turnstile>resTy new\<preceq>resTy old \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   766
    accmodi old \<le> accmodi new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   767
    \<not> is_static old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   768
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   769
  from stat_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   770
  obtain c where 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   771
    clsNew: "class G (declclass new) = Some c" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   772
    neqObj: "declclass new \<noteq> Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   773
    by (auto dest: stat_overrides_commonD declared_in_classD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   774
  with stat_override obtain newM oldM where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   775
    newM: "table_of (methods c) (msig new) = Some newM" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   776
     new: "new = (declclass new,(msig new),newM)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   777
     old: "old = (declclass old,(msig old),oldM)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   778
          "msig new = msig old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   779
    by (cases new,cases old) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   780
       (auto dest: stat_overrides_commonD 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   781
         simp add: cdeclaredmethd_def declared_in_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   782
  with stat_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   783
  have stat_override':
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   784
        "G,(msig new)\<turnstile>(declclass new,newM) overrides\<^sub>S (declclass old,oldM)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   785
    by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   786
  from clsNew wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   787
  have "wf_cdecl G (declclass new,c)" by (blast intro: wf_prog_cdecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   788
  note wf_cdecl_overrides_SomeD [OF this neqObj newM stat_override']
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   789
  with new old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   790
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   791
    by (cases new, cases old) auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   792
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   793
    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   794
lemma static_to_dynamic_overriding: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   795
  assumes stat_override: "G\<turnstile>new overrides\<^sub>S old" and wf : "wf_prog G"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   796
  shows "G\<turnstile>new overrides old"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   797
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   798
  from stat_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   799
  show ?thesis (is "?Overrides new old")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   800
  proof (induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   801
    case (Direct new old superNew)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   802
    then have stat_override:"G\<turnstile>new overrides\<^sub>S old" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   803
      by (rule stat_overridesR.Direct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   804
    from stat_override wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   805
    have resTy_widen: "G\<turnstile>resTy new\<preceq>resTy old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   806
      not_static_old: "\<not> is_static old" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   807
      by (auto dest: wf_prog_stat_overridesD)  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   808
    have not_private_new: "accmodi new \<noteq> Private"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   809
    proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   810
      from stat_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   811
      have "accmodi old \<noteq> Private"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   812
	by (rule no_Private_stat_override)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   813
      moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   814
      from stat_override wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   815
      have "accmodi old \<le> accmodi new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   816
	by (auto dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   817
      ultimately
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   818
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   819
	by (auto dest: acc_modi_bottom)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   820
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   821
    with Direct resTy_widen not_static_old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   822
    show "?Overrides new old" 
12962
a24ffe84a06a Cleaning up the definition of static overriding.
schirmer
parents: 12937
diff changeset
   823
      by (auto intro: overridesR.Direct stat_override_declclasses_relation) 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   824
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   825
    case (Indirect inter new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   826
    then show "?Overrides new old" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   827
      by (blast intro: overridesR.Indirect) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   828
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   829
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   830
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   831
lemma non_Package_instance_method_inheritance:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   832
  assumes old_inheritable: "G\<turnstile>Method old inheritable_in (pid C)" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   833
              accmodi_old: "accmodi old \<noteq> Package" and 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   834
          instance_method: "\<not> is_static old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   835
                   subcls: "G\<turnstile>C \<prec>\<^sub>C declclass old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   836
             old_declared: "G\<turnstile>Method old declared_in (declclass old)" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   837
                       wf: "wf_prog G"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   838
  shows "G\<turnstile>Method old member_of C \<or>
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   839
   (\<exists> new. G\<turnstile> new overrides\<^sub>S old \<and> G\<turnstile>Method new member_of C)"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   840
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   841
  from wf have ws: "ws_prog G" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   842
  from old_declared have iscls_declC_old: "is_class G (declclass old)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   843
    by (auto simp add: declared_in_def cdeclaredmethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   844
  from subcls have  iscls_C: "is_class G C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   845
    by (blast dest:  subcls_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   846
  from iscls_C ws old_inheritable subcls 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   847
  show ?thesis (is "?P C old")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   848
  proof (induct rule: ws_class_induct')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   849
    case Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   850
    assume "G\<turnstile>Object\<prec>\<^sub>C declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   851
    then show "?P Object old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   852
      by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   853
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   854
    case (Subcls C c)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   855
    assume cls_C: "class G C = Some c" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   856
       neq_C_Obj: "C \<noteq> Object" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   857
             hyp: "\<lbrakk>G \<turnstile>Method old inheritable_in pid (super c); 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   858
                   G\<turnstile>super c\<prec>\<^sub>C declclass old\<rbrakk> \<Longrightarrow> ?P (super c) old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   859
     inheritable: "G \<turnstile>Method old inheritable_in pid C" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   860
         subclsC: "G\<turnstile>C\<prec>\<^sub>C declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   861
    from cls_C neq_C_Obj  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   862
    have super: "G\<turnstile>C \<prec>\<^sub>C\<^sub>1 super c" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   863
      by (rule subcls1I)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   864
    from wf cls_C neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   865
    have accessible_super: "G\<turnstile>(Class (super c)) accessible_in (pid C)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   866
      by (auto dest: wf_prog_cdecl wf_cdecl_supD is_acc_classD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   867
    {
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   868
      fix old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   869
      assume    member_super: "G\<turnstile>Method old member_of (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   870
      assume     inheritable: "G \<turnstile>Method old inheritable_in pid C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   871
      assume instance_method: "\<not> is_static old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   872
      from member_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   873
      have old_declared: "G\<turnstile>Method old declared_in (declclass old)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   874
       by (cases old) (auto dest: member_of_declC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   875
      have "?P C old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   876
      proof (cases "G\<turnstile>mid (msig old) undeclared_in C")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   877
	case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   878
	with inheritable super accessible_super member_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   879
	have "G\<turnstile>Method old member_of C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   880
	  by (cases old) (auto intro: members.Inherited)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   881
	then show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   882
	  by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   883
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   884
	case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   885
	then obtain new_member where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   886
	     "G\<turnstile>new_member declared_in C" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   887
             "mid (msig old) = memberid new_member"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   888
          by (auto dest: not_undeclared_declared)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   889
	then obtain new where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   890
	          new: "G\<turnstile>Method new declared_in C" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   891
               eq_sig: "msig old = msig new" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   892
	    declC_new: "declclass new = C" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   893
	  by (cases new_member) auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   894
	then have member_new: "G\<turnstile>Method new member_of C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   895
	  by (cases new) (auto intro: members.Immediate)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   896
	from declC_new super member_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   897
	have subcls_new_old: "G\<turnstile>declclass new \<prec>\<^sub>C declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   898
	  by (auto dest!: member_of_subclseq_declC
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   899
	            dest: r_into_trancl intro: trancl_rtrancl_trancl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   900
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   901
	proof (cases "is_static new")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   902
	  case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   903
	  with eq_sig declC_new new old_declared inheritable
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   904
	       super member_super subcls_new_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   905
	  have "G\<turnstile>new overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   906
	    by (auto intro!: stat_overridesR.Direct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   907
	  with member_new show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   908
	    by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   909
	next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   910
	  case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   911
	  with eq_sig declC_new subcls_new_old new old_declared inheritable
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   912
	  have "G\<turnstile>new hides old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   913
	    by (auto intro: hidesI)    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   914
	  with wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   915
	  have "is_static old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   916
	    by (blast dest: wf_prog_hidesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   917
	  with instance_method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   918
	  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   919
	    by (contradiction)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   920
	qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   921
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   922
    } note hyp_member_super = this
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   923
    from subclsC cls_C 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   924
    have "G\<turnstile>(super c)\<preceq>\<^sub>C declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   925
      by (rule subcls_superD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   926
    then
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   927
    show "?P C old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   928
    proof (cases rule: subclseq_cases) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   929
      case Eq
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   930
      assume "super c = declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   931
      with old_declared 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   932
      have "G\<turnstile>Method old member_of (super c)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   933
	by (cases old) (auto intro: members.Immediate)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   934
      with inheritable instance_method 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   935
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   936
	by (blast dest: hyp_member_super)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   937
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   938
      case Subcls
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   939
      assume "G\<turnstile>super c\<prec>\<^sub>C declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   940
      moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   941
      from inheritable accmodi_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   942
      have "G \<turnstile>Method old inheritable_in pid (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   943
	by (cases "accmodi old") (auto simp add: inheritable_in_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   944
      ultimately
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   945
      have "?P (super c) old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   946
	by (blast dest: hyp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   947
      then show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   948
      proof
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   949
	assume "G \<turnstile>Method old member_of super c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   950
	with inheritable instance_method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   951
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   952
	  by (blast dest: hyp_member_super)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   953
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   954
	assume "\<exists>new. G \<turnstile> new overrides\<^sub>S old \<and> G \<turnstile>Method new member_of super c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   955
	then obtain super_new where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   956
	  super_new_override:  "G \<turnstile> super_new overrides\<^sub>S old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   957
            super_new_member:  "G \<turnstile>Method super_new member_of super c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   958
	  by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   959
	from super_new_override wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   960
	have "accmodi old \<le> accmodi super_new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   961
	  by (auto dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   962
	with inheritable accmodi_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   963
	have "G \<turnstile>Method super_new inheritable_in pid C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   964
	  by (auto simp add: inheritable_in_def 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   965
	              split: acc_modi.splits
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   966
                       dest: acc_modi_le_Dests)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   967
	moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   968
	from super_new_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   969
	have "\<not> is_static super_new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   970
	  by (auto dest: stat_overrides_commonD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   971
	moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   972
	note super_new_member
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   973
	ultimately have "?P C super_new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   974
	  by (auto dest: hyp_member_super)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   975
	then show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   976
	proof 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   977
	  assume "G \<turnstile>Method super_new member_of C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   978
	  with super_new_override
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   979
	  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   980
	    by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   981
	next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   982
	  assume "\<exists>new. G \<turnstile> new overrides\<^sub>S super_new \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   983
                  G \<turnstile>Method new member_of C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   984
	  with super_new_override show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   985
	    by (blast intro: stat_overridesR.Indirect) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   986
	qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   987
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   988
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   989
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   990
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   991
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   992
lemma non_Package_instance_method_inheritance_cases [consumes 6,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
   993
         case_names Inheritance Overriding]:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   994
  assumes old_inheritable: "G\<turnstile>Method old inheritable_in (pid C)" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   995
              accmodi_old: "accmodi old \<noteq> Package" and 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   996
          instance_method: "\<not> is_static old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   997
                   subcls: "G\<turnstile>C \<prec>\<^sub>C declclass old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   998
             old_declared: "G\<turnstile>Method old declared_in (declclass old)" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
   999
                       wf: "wf_prog G" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1000
              inheritance: "G\<turnstile>Method old member_of C \<Longrightarrow> P" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1001
               overriding: "\<And> new.
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1002
                           \<lbrakk>G\<turnstile> new overrides\<^sub>S old;G\<turnstile>Method new member_of C\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1003
                           \<Longrightarrow> P"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1004
  shows P
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1005
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1006
  from old_inheritable accmodi_old instance_method subcls old_declared wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1007
       inheritance overriding
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1008
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1009
    by (auto dest: non_Package_instance_method_inheritance)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1010
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1011
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1012
lemma dynamic_to_static_overriding:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1013
  assumes dyn_override: "G\<turnstile> new overrides old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1014
           accmodi_old: "accmodi old \<noteq> Package" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1015
                    wf: "wf_prog G"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1016
  shows "G\<turnstile> new overrides\<^sub>S old"  
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1017
proof - 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1018
  from dyn_override accmodi_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1019
  show ?thesis (is "?Overrides new old")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1020
  proof (induct rule: overridesR.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1021
    case (Direct new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1022
    assume   new_declared: "G\<turnstile>Method new declared_in declclass new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1023
    assume eq_sig_new_old: "msig new = msig old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1024
    assume subcls_new_old: "G\<turnstile>declclass new \<prec>\<^sub>C declclass old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1025
    assume "G \<turnstile>Method old inheritable_in pid (declclass new)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1026
           "accmodi old \<noteq> Package" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1027
           "\<not> is_static old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1028
           "G\<turnstile>declclass new\<prec>\<^sub>C declclass old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1029
           "G\<turnstile>Method old declared_in declclass old" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1030
    from this wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1031
    show "?Overrides new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1032
    proof (cases rule: non_Package_instance_method_inheritance_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1033
      case Inheritance
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1034
      assume "G \<turnstile>Method old member_of declclass new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1035
      then have "G\<turnstile>mid (msig old) undeclared_in declclass new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1036
      proof cases
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1037
	case Immediate 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1038
	with subcls_new_old wf show ?thesis 	
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1039
	  by (auto dest: subcls_irrefl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1040
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1041
	case Inherited
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1042
	then show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1043
	  by (cases old) auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1044
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1045
      with eq_sig_new_old new_declared
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1046
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1047
	by (cases old,cases new) (auto dest!: declared_not_undeclared)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1048
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1049
      case (Overriding new') 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1050
      assume stat_override_new': "G \<turnstile> new' overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1051
      then have "msig new' = msig old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1052
	by (auto dest: stat_overrides_commonD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1053
      with eq_sig_new_old have eq_sig_new_new': "msig new=msig new'"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1054
	by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1055
      assume "G \<turnstile>Method new' member_of declclass new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1056
      then show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1057
      proof (cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1058
	case Immediate
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1059
	then have declC_new: "declclass new' = declclass new" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1060
	  by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1061
	from Immediate 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1062
	have "G\<turnstile>Method new' declared_in declclass new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1063
	  by (cases new') auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1064
	with new_declared eq_sig_new_new' declC_new 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1065
	have "new=new'"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1066
	  by (cases new, cases new') (auto dest: unique_declared_in) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1067
	with stat_override_new'
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1068
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1069
	  by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1070
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1071
	case Inherited
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1072
	then have "G\<turnstile>mid (msig new') undeclared_in declclass new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1073
	  by (cases new') (auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1074
	with eq_sig_new_new' new_declared
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1075
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1076
	  by (cases new,cases new') (auto dest!: declared_not_undeclared)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1077
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1078
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1079
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1080
    case (Indirect inter new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1081
    assume accmodi_old: "accmodi old \<noteq> Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1082
    assume "accmodi old \<noteq> Package \<Longrightarrow> G \<turnstile> inter overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1083
    with accmodi_old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1084
    have stat_override_inter_old: "G \<turnstile> inter overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1085
      by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1086
    moreover 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1087
    assume hyp_inter: "accmodi inter \<noteq> Package \<Longrightarrow> G \<turnstile> new overrides\<^sub>S inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1088
    moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1089
    have "accmodi inter \<noteq> Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1090
    proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1091
      from stat_override_inter_old wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1092
      have "accmodi old \<le> accmodi inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1093
	by (auto dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1094
      with stat_override_inter_old accmodi_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1095
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1096
	by (auto dest!: no_Private_stat_override
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1097
                 split: acc_modi.splits 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1098
	         dest: acc_modi_le_Dests)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1099
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1100
    ultimately show "?Overrides new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1101
      by (blast intro: stat_overridesR.Indirect)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1102
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1103
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1104
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1105
lemma wf_prog_dyn_override_prop:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1106
  assumes dyn_override: "G \<turnstile> new overrides old" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1107
                    wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1108
  shows "accmodi old \<le> accmodi new"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1109
proof (cases "accmodi old = Package")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1110
  case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1111
  note old_Package = this
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1112
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1113
  proof (cases "accmodi old \<le> accmodi new")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1114
    case True then show ?thesis .
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1115
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1116
    case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1117
    with old_Package 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1118
    have "accmodi new = Private"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1119
      by (cases "accmodi new") (auto simp add: le_acc_def less_acc_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1120
    with dyn_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1121
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1122
      by (auto dest: overrides_commonD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1123
  qed    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1124
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1125
  case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1126
  with dyn_override wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1127
  have "G \<turnstile> new overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1128
    by (blast intro: dynamic_to_static_overriding)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1129
  with wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1130
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1131
   by (blast dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1132
qed 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1133
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1134
lemma overrides_Package_old: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1135
  assumes dyn_override: "G \<turnstile> new overrides old" and 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1136
           accmodi_new: "accmodi new = Package" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1137
                    wf: "wf_prog G "
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1138
  shows "accmodi old = Package"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1139
proof (cases "accmodi old")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1140
  case Private
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1141
  with dyn_override show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1142
    by (simp add: no_Private_override)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1143
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1144
  case Package
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1145
  then show ?thesis .
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1146
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1147
  case Protected
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1148
  with dyn_override wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1149
  have "G \<turnstile> new overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1150
    by (auto intro: dynamic_to_static_overriding)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1151
  with wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1152
  have "accmodi old \<le> accmodi new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1153
    by (auto dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1154
  with Protected accmodi_new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1155
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1156
    by (simp add: less_acc_def le_acc_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1157
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1158
  case Public
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1159
  with dyn_override wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1160
  have "G \<turnstile> new overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1161
    by (auto intro: dynamic_to_static_overriding)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1162
  with wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1163
  have "accmodi old \<le> accmodi new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1164
    by (auto dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1165
  with Public accmodi_new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1166
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1167
    by (simp add: less_acc_def le_acc_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1168
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1169
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1170
lemma dyn_override_Package:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1171
  assumes dyn_override: "G \<turnstile> new overrides old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1172
           accmodi_old: "accmodi old = Package" and 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1173
           accmodi_new: "accmodi new = Package" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1174
                    wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1175
  shows "pid (declclass old) = pid (declclass new)"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1176
proof - 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1177
  from dyn_override accmodi_old accmodi_new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1178
  show ?thesis (is "?EqPid old new")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1179
  proof (induct rule: overridesR.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1180
    case (Direct new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1181
    assume "accmodi old = Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1182
           "G \<turnstile>Method old inheritable_in pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1183
    then show "pid (declclass old) =  pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1184
      by (auto simp add: inheritable_in_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1185
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1186
    case (Indirect inter new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1187
    assume accmodi_old: "accmodi old = Package" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1188
           accmodi_new: "accmodi new = Package" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1189
    assume "G \<turnstile> new overrides inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1190
    with accmodi_new wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1191
    have "accmodi inter = Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1192
      by  (auto intro: overrides_Package_old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1193
    with Indirect
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1194
    show "pid (declclass old) =  pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1195
      by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1196
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1197
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1198
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1199
lemma dyn_override_Package_escape:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1200
  assumes dyn_override: "G \<turnstile> new overrides old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1201
           accmodi_old: "accmodi old = Package" and 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1202
          outside_pack: "pid (declclass old) \<noteq> pid (declclass new)" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1203
                    wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1204
  shows "\<exists> inter. G \<turnstile> new overrides inter \<and> G \<turnstile> inter overrides old \<and>
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1205
             pid (declclass old) = pid (declclass inter) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1206
             Protected \<le> accmodi inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1207
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1208
  from dyn_override accmodi_old outside_pack
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1209
  show ?thesis (is "?P new old")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1210
  proof (induct rule: overridesR.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1211
    case (Direct new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1212
    assume accmodi_old: "accmodi old = Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1213
    assume outside_pack: "pid (declclass old) \<noteq> pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1214
    assume "G \<turnstile>Method old inheritable_in pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1215
    with accmodi_old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1216
    have "pid (declclass old) = pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1217
      by (simp add: inheritable_in_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1218
    with outside_pack 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1219
    show "?P new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1220
      by (contradiction)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1221
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1222
    case (Indirect inter new old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1223
    assume accmodi_old: "accmodi old = Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1224
    assume outside_pack: "pid (declclass old) \<noteq> pid (declclass new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1225
    assume override_new_inter: "G \<turnstile> new overrides inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1226
    assume override_inter_old: "G \<turnstile> inter overrides old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1227
    assume hyp_new_inter: "\<lbrakk>accmodi inter = Package; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1228
                           pid (declclass inter) \<noteq> pid (declclass new)\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1229
                           \<Longrightarrow> ?P new inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1230
    assume hyp_inter_old: "\<lbrakk>accmodi old = Package; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1231
                           pid (declclass old) \<noteq> pid (declclass inter)\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1232
                           \<Longrightarrow> ?P inter old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1233
    show "?P new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1234
    proof (cases "pid (declclass old) = pid (declclass inter)")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1235
      case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1236
      note same_pack_old_inter = this
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1237
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1238
      proof (cases "pid (declclass inter) = pid (declclass new)")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1239
	case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1240
	with same_pack_old_inter outside_pack
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1241
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1242
	  by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1243
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1244
	case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1245
	note diff_pack_inter_new = this
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1246
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1247
	proof (cases "accmodi inter = Package")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1248
	  case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1249
	  with diff_pack_inter_new hyp_new_inter  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1250
	  obtain newinter where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1251
	    over_new_newinter: "G \<turnstile> new overrides newinter" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1252
            over_newinter_inter: "G \<turnstile> newinter overrides inter" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1253
            eq_pid: "pid (declclass inter) = pid (declclass newinter)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1254
            accmodi_newinter: "Protected \<le> accmodi newinter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1255
	    by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1256
	  from over_newinter_inter override_inter_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1257
	  have "G\<turnstile>newinter overrides old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1258
	    by (rule overridesR.Indirect)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1259
	  moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1260
	  from eq_pid same_pack_old_inter 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1261
	  have "pid (declclass old) = pid (declclass newinter)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1262
	    by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1263
	  moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1264
	  note over_new_newinter accmodi_newinter
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1265
	  ultimately show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1266
	    by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1267
	next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1268
	  case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1269
	  with override_new_inter
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1270
	  have "Protected \<le> accmodi inter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1271
	    by (cases "accmodi inter") (auto dest: no_Private_override)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1272
	  with override_new_inter override_inter_old same_pack_old_inter
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1273
	  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1274
	    by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1275
	qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1276
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1277
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1278
      case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1279
      with accmodi_old hyp_inter_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1280
      obtain newinter where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1281
	over_inter_newinter: "G \<turnstile> inter overrides newinter" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1282
          over_newinter_old: "G \<turnstile> newinter overrides old" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1283
                eq_pid: "pid (declclass old) = pid (declclass newinter)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1284
	accmodi_newinter: "Protected \<le> accmodi newinter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1285
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1286
      from override_new_inter over_inter_newinter 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1287
      have "G \<turnstile> new overrides newinter"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1288
	by (rule overridesR.Indirect)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1289
      with eq_pid over_newinter_old accmodi_newinter
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1290
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1291
	by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1292
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1293
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1294
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1295
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1296
lemma declclass_widen[rule_format]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1297
 "wf_prog G 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1298
 \<longrightarrow> (\<forall>c m. class G C = Some c \<longrightarrow> methd G C sig = Some m 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1299
 \<longrightarrow> G\<turnstile>C \<preceq>\<^sub>C declclass m)" (is "?P G C")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1300
proof (rule class_rec.induct,intro allI impI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1301
  fix G C c m
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1302
  assume Hyp: "\<forall>c. C \<noteq> Object \<and> ws_prog G \<and> class G C = Some c 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1303
               \<longrightarrow> ?P G (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1304
  assume wf: "wf_prog G" and cls_C: "class G C = Some c" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1305
         m:  "methd G C sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1306
  show "G\<turnstile>C\<preceq>\<^sub>C declclass m" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1307
  proof (cases "C=Object")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1308
    case True 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1309
    with wf m show ?thesis by (simp add: methd_Object_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1310
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1311
    let ?filter="filter_tab (\<lambda>sig m. G\<turnstile>C inherits method sig m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1312
    let ?table = "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1313
    case False 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1314
    with cls_C wf m
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1315
    have methd_C: "(?filter (methd G (super c)) ++ ?table) sig = Some m "
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1316
      by (simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1317
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1318
    proof (cases "?table sig")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1319
      case None
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1320
      from this methd_C have "?filter (methd G (super c)) sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1321
	by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1322
      moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1323
      from wf cls_C False obtain sup where "class G (super c) = Some sup"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1324
	by (blast dest: wf_prog_cdecl wf_cdecl_supD is_acc_class_is_class)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  1325
      moreover note wf False cls_C  
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  1326
      ultimately have "G\<turnstile>super c \<preceq>\<^sub>C declclass m"  
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  1327
	by (auto intro: Hyp [rule_format])
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1328
      moreover from cls_C False have  "G\<turnstile>C \<prec>\<^sub>C\<^sub>1 super c" by (rule subcls1I)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1329
      ultimately show ?thesis by - (rule rtrancl_into_rtrancl2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1330
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1331
      case Some
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1332
      from this wf False cls_C methd_C show ?thesis by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1333
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1334
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1335
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1336
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1337
lemma declclass_methd_Object: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1338
 "\<lbrakk>wf_prog G; methd G Object sig = Some m\<rbrakk> \<Longrightarrow> declclass m = Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1339
by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1340
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1341
lemma methd_declaredD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1342
 "\<lbrakk>wf_prog G; is_class G C;methd G C sig = Some m\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1343
  \<Longrightarrow> G\<turnstile>(mdecl (sig,mthd m)) declared_in (declclass m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1344
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1345
  assume    wf: "wf_prog G"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1346
  then have ws: "ws_prog G" ..
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1347
  assume  clsC: "is_class G C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1348
  from clsC ws 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1349
  show "methd G C sig = Some m 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1350
        \<Longrightarrow> G\<turnstile>(mdecl (sig,mthd m)) declared_in (declclass m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1351
    (is "PROP ?P C") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1352
  proof (induct ?P C rule: ws_class_induct')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1353
    case Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1354
    assume "methd G Object sig = Some m" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1355
    with wf show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1356
      by - (rule method_declared_inI, auto) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1357
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1358
    case Subcls
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1359
    fix C c
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1360
    assume clsC: "class G C = Some c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1361
    and       m: "methd G C sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1362
    and     hyp: "methd G (super c) sig = Some m \<Longrightarrow> ?thesis" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1363
    let ?newMethods = "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1364
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1365
    proof (cases "?newMethods sig")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1366
      case None
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1367
      from None ws clsC m hyp 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1368
      show ?thesis by (auto intro: method_declared_inI simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1369
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1370
      case Some
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1371
      from Some ws clsC m 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1372
      show ?thesis by (auto intro: method_declared_inI simp add: methd_rec) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1373
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1374
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1375
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1376
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1377
lemma methd_rec_Some_cases [consumes 4, case_names NewMethod InheritedMethod]:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1378
  assumes methd_C: "methd G C sig = Some m" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1379
               ws: "ws_prog G" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1380
             clsC: "class G C = Some c" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1381
        neq_C_Obj: "C\<noteq>Object"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1382
  shows
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1383
"\<lbrakk>table_of (map (\<lambda>(s, m). (s, C, m)) (methods c)) sig = Some m \<Longrightarrow> P;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1384
  \<lbrakk>G\<turnstile>C inherits (method sig m); methd G (super c) sig = Some m\<rbrakk> \<Longrightarrow> P 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1385
 \<rbrakk> \<Longrightarrow> P"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1386
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1387
  let ?inherited   = "filter_tab (\<lambda>sig m. G\<turnstile>C inherits method sig m) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1388
                              (methd G (super c))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1389
  let ?new = "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1390
  from ws clsC neq_C_Obj methd_C 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1391
  have methd_unfold: "(?inherited ++ ?new) sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1392
    by (simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1393
  assume NewMethod: "?new sig = Some m \<Longrightarrow> P"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1394
  assume InheritedMethod: "\<lbrakk>G\<turnstile>C inherits (method sig m); 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1395
                            methd G (super c) sig = Some m\<rbrakk> \<Longrightarrow> P"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1396
  show P
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1397
  proof (cases "?new sig")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1398
    case None
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1399
    with methd_unfold have "?inherited sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1400
      by (auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1401
    with InheritedMethod show P by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1402
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1403
    case Some
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1404
    with methd_unfold have "?new sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1405
      by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1406
    with NewMethod show P by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1407
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1408
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1409
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1410
  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1411
lemma methd_member_of:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1412
  assumes wf: "wf_prog G"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1413
  shows
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1414
    "\<lbrakk>is_class G C; methd G C sig = Some m\<rbrakk> \<Longrightarrow> G\<turnstile>Methd sig m member_of C" 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1415
  (is "?Class C \<Longrightarrow> ?Method C \<Longrightarrow> ?MemberOf C") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1416
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1417
  from wf   have   ws: "ws_prog G" ..
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1418
  assume defC: "is_class G C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1419
  from defC ws 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1420
  show "?Class C \<Longrightarrow> ?Method C \<Longrightarrow> ?MemberOf C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1421
  proof (induct rule: ws_class_induct')  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1422
    case Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1423
    with wf have declC: "declclass m = Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1424
      by (blast intro: declclass_methd_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1425
    with Object wf have "G\<turnstile>Methd sig m declared_in Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1426
      by (auto dest: methd_declaredD simp del: methd_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1427
    with declC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1428
    show "?MemberOf Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1429
      by (auto intro!: members.Immediate
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1430
                  simp del: methd_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1431
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1432
    case (Subcls C c)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1433
    assume  clsC: "class G C = Some c" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1434
       neq_C_Obj: "C \<noteq> Object"  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1435
    assume methd: "?Method C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1436
    from methd ws clsC neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1437
    show "?MemberOf C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1438
    proof (cases rule: methd_rec_Some_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1439
      case NewMethod
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1440
      with clsC show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1441
	by (auto dest: method_declared_inI intro!: members.Immediate)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1442
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1443
      case InheritedMethod
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1444
      then show "?thesis"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1445
	by (blast dest: inherits_member)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1446
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1447
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1448
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1449
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1450
lemma current_methd: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1451
      "\<lbrakk>table_of (methods c) sig = Some new;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1452
        ws_prog G; class G C = Some c; C \<noteq> Object; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1453
        methd G (super c) sig = Some old\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1454
    \<Longrightarrow> methd G C sig = Some (C,new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1455
by (auto simp add: methd_rec
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1456
            intro: filter_tab_SomeI override_find_right table_of_map_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1457
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1458
lemma wf_prog_staticD:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1459
  assumes     wf: "wf_prog G" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1460
            clsC: "class G C = Some c" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1461
       neq_C_Obj: "C \<noteq> Object" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1462
             old: "methd G (super c) sig = Some old" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1463
     accmodi_old: "Protected \<le> accmodi old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1464
             new: "table_of (methods c) sig = Some new"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1465
  shows "is_static new = is_static old"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1466
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1467
  from clsC wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1468
  have wf_cdecl: "wf_cdecl G (C,c)" by (rule wf_prog_cdecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1469
  from wf clsC neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1470
  have is_cls_super: "is_class G (super c)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1471
    by (blast dest: wf_prog_acc_superD is_acc_classD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1472
  from wf is_cls_super old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1473
  have old_member_of: "G\<turnstile>Methd sig old member_of (super c)"  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1474
    by (rule methd_member_of)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1475
  from old wf is_cls_super 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1476
  have old_declared: "G\<turnstile>Methd sig old declared_in (declclass old)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1477
    by (auto dest: methd_declared_in_declclass)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1478
  from new clsC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1479
  have new_declared: "G\<turnstile>Methd sig (C,new) declared_in C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1480
    by (auto intro: method_declared_inI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1481
  note trancl_rtrancl_tranc = trancl_rtrancl_trancl [trans] (* ### in Basis *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1482
  from clsC neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1483
  have subcls1_C_super: "G\<turnstile>C \<prec>\<^sub>C\<^sub>1 super c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1484
    by (rule subcls1I)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1485
  then have "G\<turnstile>C \<prec>\<^sub>C super c" ..
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1486
  also from old wf is_cls_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1487
  have "G\<turnstile>super c \<preceq>\<^sub>C (declclass old)" by (auto dest: methd_declC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1488
  finally have subcls_C_old:  "G\<turnstile>C \<prec>\<^sub>C (declclass old)" .
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1489
  from accmodi_old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1490
  have inheritable: "G\<turnstile>Methd sig old inheritable_in pid C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1491
    by (auto simp add: inheritable_in_def
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1492
                 dest: acc_modi_le_Dests)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1493
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1494
  proof (cases "is_static new")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1495
    case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1496
    with subcls_C_old new_declared old_declared inheritable
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1497
    have "G,sig\<turnstile>(C,new) hides old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1498
      by (auto intro: hidesI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1499
    with True wf_cdecl neq_C_Obj new 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1500
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1501
      by (auto dest: wf_cdecl_hides_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1502
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1503
    case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1504
    with subcls_C_old new_declared old_declared inheritable subcls1_C_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1505
         old_member_of
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1506
    have "G,sig\<turnstile>(C,new) overrides\<^sub>S old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1507
      by (auto intro: stat_overridesR.Direct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1508
    with False wf_cdecl neq_C_Obj new 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1509
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1510
      by (auto dest: wf_cdecl_overrides_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1511
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1512
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1513
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1514
lemma inheritable_instance_methd: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1515
  assumes subclseq_C_D: "G\<turnstile>C \<preceq>\<^sub>C D" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1516
              is_cls_D: "is_class G D" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1517
                    wf: "wf_prog G" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1518
                   old: "methd G D sig = Some old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1519
           accmodi_old: "Protected \<le> accmodi old" and  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1520
        not_static_old: "\<not> is_static old"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1521
  shows
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1522
  "\<exists>new. methd G C sig = Some new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1523
         (new = old \<or> G,sig\<turnstile>new overrides\<^sub>S old)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1524
 (is "(\<exists>new. (?Constraint C new old))")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1525
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1526
  from subclseq_C_D is_cls_D 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1527
  have is_cls_C: "is_class G C" by (rule subcls_is_class2) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1528
  from wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1529
  have ws: "ws_prog G" ..
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1530
  from is_cls_C ws subclseq_C_D 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1531
  show "\<exists>new. ?Constraint C new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1532
  proof (induct rule: ws_class_induct')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1533
    case (Object co)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1534
    then have eq_D_Obj: "D=Object" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1535
    with old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1536
    have "?Constraint Object old old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1537
      by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1538
    with eq_D_Obj 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1539
    show "\<exists> new. ?Constraint Object new old" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1540
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1541
    case (Subcls C c)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1542
    assume hyp: "G\<turnstile>super c\<preceq>\<^sub>C D \<Longrightarrow> \<exists>new. ?Constraint (super c) new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1543
    assume clsC: "class G C = Some c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1544
    assume neq_C_Obj: "C\<noteq>Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1545
    from clsC wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1546
    have wf_cdecl: "wf_cdecl G (C,c)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1547
      by (rule wf_prog_cdecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1548
    from ws clsC neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1549
    have is_cls_super: "is_class G (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1550
      by (auto dest: ws_prog_cdeclD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1551
    from clsC wf neq_C_Obj 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1552
    have superAccessible: "G\<turnstile>(Class (super c)) accessible_in (pid C)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1553
	 subcls1_C_super: "G\<turnstile>C \<prec>\<^sub>C\<^sub>1 super c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1554
      by (auto dest: wf_prog_cdecl wf_cdecl_supD is_acc_classD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1555
              intro: subcls1I)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1556
    show "\<exists>new. ?Constraint C new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1557
    proof (cases "G\<turnstile>super c\<preceq>\<^sub>C D")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1558
      case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1559
      from False Subcls 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1560
      have eq_C_D: "C=D"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1561
	by (auto dest: subclseq_superD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1562
      with old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1563
      have "?Constraint C old old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1564
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1565
      with eq_C_D 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1566
      show "\<exists> new. ?Constraint C new old" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1567
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1568
      case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1569
      with hyp obtain super_method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1570
	where super: "?Constraint (super c) super_method old" by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1571
      from super not_static_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1572
      have not_static_super: "\<not> is_static super_method"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1573
	by (auto dest!: stat_overrides_commonD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1574
      from super old wf accmodi_old
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1575
      have accmodi_super_method: "Protected \<le> accmodi super_method"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1576
	by (auto dest!: wf_prog_stat_overridesD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1577
                 intro: order_trans)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1578
      from super accmodi_old wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1579
      have inheritable: "G\<turnstile>Methd sig super_method inheritable_in (pid C)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1580
	by (auto dest!: wf_prog_stat_overridesD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1581
                        acc_modi_le_Dests
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1582
              simp add: inheritable_in_def)	           
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1583
      from super wf is_cls_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1584
      have member: "G\<turnstile>Methd sig super_method member_of (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1585
	by (auto intro: methd_member_of) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1586
      from member
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1587
      have decl_super_method:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1588
        "G\<turnstile>Methd sig super_method declared_in (declclass super_method)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1589
	by (auto dest: member_of_declC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1590
      from super subcls1_C_super ws is_cls_super 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1591
      have subcls_C_super: "G\<turnstile>C \<prec>\<^sub>C (declclass super_method)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1592
	by (auto intro: rtrancl_into_trancl2 dest: methd_declC) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1593
      show "\<exists> new. ?Constraint C new old"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1594
      proof (cases "methd G C sig")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1595
	case None
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1596
	have "methd G (super c) sig = None"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1597
	proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1598
	  from clsC ws None 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1599
	  have no_new: "table_of (methods c) sig = None" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1600
	    by (auto simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1601
	  with clsC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1602
	  have undeclared: "G\<turnstile>mid sig undeclared_in C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1603
	    by (auto simp add: undeclared_in_def cdeclaredmethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1604
	  with inheritable member superAccessible subcls1_C_super
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1605
	  have inherits: "G\<turnstile>C inherits (method sig super_method)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1606
	    by (auto simp add: inherits_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1607
	  with clsC ws no_new super neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1608
	  have "methd G C sig = Some super_method"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1609
	    by (auto simp add: methd_rec override_def
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1610
	                intro: filter_tab_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1611
          with None show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1612
	    by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1613
	qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1614
	with super show ?thesis by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1615
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1616
	case (Some new)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1617
	from this ws clsC neq_C_Obj
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1618
	show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1619
	proof (cases rule: methd_rec_Some_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1620
	  case InheritedMethod
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1621
	  with super Some show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1622
	    by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1623
	next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1624
	  case NewMethod
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1625
	  assume new: "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c)) sig 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1626
                       = Some new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1627
	  from new 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1628
	  have declcls_new: "declclass new = C" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1629
	    by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1630
	  from wf clsC neq_C_Obj super new not_static_super accmodi_super_method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1631
	  have not_static_new: "\<not> is_static new" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1632
	    by (auto dest: wf_prog_staticD) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1633
	  from clsC new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1634
	  have decl_new: "G\<turnstile>Methd sig new declared_in C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1635
	    by (auto simp add: declared_in_def cdeclaredmethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1636
	  from not_static_new decl_new decl_super_method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1637
	       member subcls1_C_super inheritable declcls_new subcls_C_super 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1638
	  have "G,sig\<turnstile> new overrides\<^sub>S super_method"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1639
	    by (auto intro: stat_overridesR.Direct) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1640
	  with super Some
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1641
	  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1642
	    by (auto intro: stat_overridesR.Indirect)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1643
	qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1644
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1645
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1646
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1647
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1648
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1649
lemma inheritable_instance_methd_cases [consumes 6
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1650
                                       , case_names Inheritance Overriding]: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1651
  assumes subclseq_C_D: "G\<turnstile>C \<preceq>\<^sub>C D" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1652
              is_cls_D: "is_class G D" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1653
                    wf: "wf_prog G" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1654
                   old: "methd G D sig = Some old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1655
           accmodi_old: "Protected \<le> accmodi old" and  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1656
        not_static_old: "\<not> is_static old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1657
           inheritance:  "methd G C sig = Some old \<Longrightarrow> P" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1658
            overriding:  "\<And> new. \<lbrakk>methd G C sig = Some new;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1659
                                   G,sig\<turnstile>new overrides\<^sub>S old\<rbrakk> \<Longrightarrow> P"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1660
        
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1661
  shows P
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1662
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1663
from subclseq_C_D is_cls_D wf old accmodi_old not_static_old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1664
show ?thesis
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  1665
  by (auto dest: inheritable_instance_methd intro: inheritance overriding)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1666
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1667
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1668
lemma inheritable_instance_methd_props: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1669
  assumes subclseq_C_D: "G\<turnstile>C \<preceq>\<^sub>C D" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1670
              is_cls_D: "is_class G D" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1671
                    wf: "wf_prog G" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1672
                   old: "methd G D sig = Some old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1673
           accmodi_old: "Protected \<le> accmodi old" and  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1674
        not_static_old: "\<not> is_static old"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1675
  shows
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1676
  "\<exists>new. methd G C sig = Some new \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1677
          \<not> is_static new \<and> G\<turnstile>resTy new\<preceq>resTy old \<and> accmodi old \<le>accmodi new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1678
 (is "(\<exists>new. (?Constraint C new old))")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1679
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1680
  from subclseq_C_D is_cls_D wf old accmodi_old not_static_old 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1681
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1682
  proof (cases rule: inheritable_instance_methd_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1683
    case Inheritance
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1684
    with not_static_old accmodi_old show ?thesis by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1685
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1686
    case (Overriding new)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1687
    then have "\<not> is_static new" by (auto dest: stat_overrides_commonD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1688
    with Overriding not_static_old accmodi_old wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1689
    show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1690
      by (auto dest!: wf_prog_stat_overridesD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1691
               intro: order_trans)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1692
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1693
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1694
 	  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1695
(* ### Probleme: Die tollen methd_subcls_cases Lemma wird warscheinlich
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1696
  kaum gebraucht: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1697
Redundanz: stat_overrides.Direct old declared in declclass old folgt aus
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1698
           member of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1699
   Problem: Predikate wie overrides, sind global üper die Hierarchie hinweg
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1700
            definiert, aber oft barucht man eben zusätlich Induktion
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1701
            : von super c auf C; Dann ist aber auss dem Kontext
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1702
            die Unterscheidung in die 5 fälle overkill,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1703
            da man dann warscheinlich meistens eh in einem speziellen
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1704
            Fall kommt (durch die Hypothesen)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1705
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1706
    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1707
(* local lemma *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1708
ML {* bind_thm("bexI'",permute_prems 0 1 bexI) *}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1709
ML {* bind_thm("ballE'",permute_prems 1 1 ballE) *}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1710
lemma subint_widen_imethds: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1711
 "\<lbrakk>G\<turnstile>I\<preceq>I J; wf_prog G; is_iface G J; jm \<in> imethds G J sig\<rbrakk> \<Longrightarrow>   
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1712
  \<exists> im \<in> imethds G I sig. is_static im = is_static jm \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1713
                          accmodi im = accmodi jm \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1714
                          G\<turnstile>resTy im\<preceq>resTy jm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1715
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1716
  assume irel: "G\<turnstile>I\<preceq>I J" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1717
           wf: "wf_prog G" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1718
     is_iface: "is_iface G J"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1719
  from irel show "jm \<in> imethds G J sig \<Longrightarrow> ?thesis" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1720
               (is "PROP ?P I" is "PROP ?Prem J \<Longrightarrow> ?Concl I")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1721
  proof (induct ?P I rule: converse_rtrancl_induct) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1722
    case Id
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1723
    assume "jm \<in> imethds G J sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1724
    then show "?Concl J" by  (blast elim: bexI')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1725
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1726
    case Step
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1727
    fix I SI
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1728
    assume subint1_I_SI: "G\<turnstile>I \<prec>I1 SI" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1729
            subint_SI_J: "G\<turnstile>SI \<preceq>I J" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1730
                    hyp: "PROP ?P SI" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1731
                     jm: "jm \<in> imethds G J sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1732
    from subint1_I_SI 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1733
    obtain i where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1734
      ifI: "iface G I = Some i" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1735
       SI: "SI \<in> set (isuperIfs i)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1736
      by (blast dest: subint1D)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1737
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1738
    let ?newMethods 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1739
          = "(o2s \<circ> table_of (map (\<lambda>(sig, mh). (sig, I, mh)) (imethods i)))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1740
    show "?Concl I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1741
    proof (cases "?newMethods sig = {}")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1742
      case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1743
      with ifI SI hyp wf jm 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1744
      show "?thesis" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1745
	by (auto simp add: imethds_rec) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1746
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1747
      case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1748
      from ifI wf False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1749
      have imethds: "imethds G I sig = ?newMethods sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1750
	by (simp add: imethds_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1751
      from False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1752
      obtain im where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1753
        imdef: "im \<in> ?newMethods sig" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1754
	by (blast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1755
      with imethds 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1756
      have im: "im \<in> imethds G I sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1757
	by (blast)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1758
      with im wf ifI 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1759
      obtain
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1760
	 imStatic: "\<not> is_static im" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1761
         imPublic: "accmodi im = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1762
	by (auto dest!: imethds_wf_mhead)	
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1763
      from ifI wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1764
      have wf_I: "wf_idecl G (I,i)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1765
	by (rule wf_prog_idecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1766
      with SI wf  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1767
      obtain si where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1768
	 ifSI: "iface G SI = Some si" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1769
	wf_SI: "wf_idecl G (SI,si)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1770
	by (auto dest!: wf_idecl_supD is_acc_ifaceD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1771
                  dest: wf_prog_idecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1772
      from jm hyp 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1773
      obtain sim::"qtname \<times> mhead"  where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1774
                      sim: "sim \<in> imethds G SI sig" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1775
         eq_static_sim_jm: "is_static sim = is_static jm" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1776
         eq_access_sim_jm: "accmodi sim = accmodi jm" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1777
        resTy_widen_sim_jm: "G\<turnstile>resTy sim\<preceq>resTy jm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1778
	by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1779
      with wf_I SI imdef sim 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1780
      have "G\<turnstile>resTy im\<preceq>resTy sim"   
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1781
	by (auto dest!: wf_idecl_hidings hidings_entailsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1782
      with wf resTy_widen_sim_jm 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1783
      have resTy_widen_im_jm: "G\<turnstile>resTy im\<preceq>resTy jm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1784
	by (blast intro: widen_trans)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1785
      from sim wf ifSI  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1786
      obtain
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1787
	simStatic: "\<not> is_static sim" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1788
        simPublic: "accmodi sim = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1789
	by (auto dest!: imethds_wf_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1790
      from im 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1791
           imStatic simStatic eq_static_sim_jm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1792
           imPublic simPublic eq_access_sim_jm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1793
           resTy_widen_im_jm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1794
      show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1795
	by auto 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1796
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1797
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1798
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1799
     
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1800
(* Tactical version *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1801
(* 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1802
lemma subint_widen_imethds: "\<lbrakk>G\<turnstile>I\<preceq>I J; wf_prog G; is_iface G J\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1803
  \<forall> jm \<in> imethds G J sig.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1804
  \<exists> im \<in> imethds G I sig. static (mthd im)=static (mthd jm) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1805
                          access (mthd im)= access (mthd jm) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1806
                          G\<turnstile>resTy (mthd im)\<preceq>resTy (mthd jm)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1807
apply (erule converse_rtrancl_induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1808
apply  (clarsimp elim!: bexI')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1809
apply (frule subint1D)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1810
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1811
apply (erule ballE')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1812
apply  fast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1813
apply (erule_tac V = "?x \<in> imethds G J sig" in thin_rl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1814
apply clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1815
apply (subst imethds_rec, assumption, erule wf_ws_prog)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1816
apply (unfold overrides_t_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1817
apply (drule (1) wf_prog_idecl)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1818
apply (frule (3) imethds_wf_mhead [OF _ _ wf_idecl_supD [THEN conjunct1 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1819
                                       [THEN is_acc_ifaceD [THEN conjunct1]]]])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1820
apply (case_tac "(o2s \<circ> table_of (map (\<lambda>(s, mh). (s, y, mh)) (imethods i)))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1821
                  sig ={}")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1822
apply   force
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1823
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1824
apply   (simp only:)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1825
apply   (simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1826
apply   clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1827
apply   (frule wf_idecl_hidings [THEN hidings_entailsD])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1828
apply     blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1829
apply     blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1830
apply   (rule bexI')
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1831
apply     simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1832
apply     (drule table_of_map_SomeI [of _ "sig"])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1833
apply     simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1834
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1835
apply     (frule wf_idecl_mhead [of _ _ _ "sig"])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1836
apply       (rule table_of_Some_in_set)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1837
apply       assumption
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1838
apply     auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1839
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1840
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1841
    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1842
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1843
(* local lemma *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1844
lemma implmt1_methd: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1845
 "\<And>sig. \<lbrakk>G\<turnstile>C\<leadsto>1I; wf_prog G; im \<in> imethds G I sig\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1846
  \<exists>cm \<in>methd G C sig: \<not> is_static cm \<and> \<not> is_static im \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1847
                       G\<turnstile>resTy cm\<preceq>resTy im \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1848
                       accmodi im = Public \<and> accmodi cm = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1849
apply (drule implmt1D)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1850
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1851
apply (drule (2) wf_prog_cdecl [THEN wf_cdecl_impD])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1852
apply (frule (1) imethds_wf_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1853
apply  (simp add: is_acc_iface_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1854
apply (force)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1855
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1856
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1857
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1858
(* local lemma *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1859
lemma implmt_methd [rule_format (no_asm)]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1860
"\<lbrakk>wf_prog G; G\<turnstile>C\<leadsto>I\<rbrakk> \<Longrightarrow> is_iface G I \<longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1861
 (\<forall> im    \<in>imethds G I   sig.  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1862
  \<exists> cm\<in>methd G C sig: \<not>is_static cm \<and> \<not> is_static im \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1863
                      G\<turnstile>resTy cm\<preceq>resTy im \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1864
                      accmodi im = Public \<and> accmodi cm = Public)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1865
apply (frule implmt_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1866
apply (erule implmt.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1867
apply   safe
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1868
apply   (drule (2) implmt1_methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1869
apply   fast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1870
apply  (drule (1) subint_widen_imethds)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1871
apply   simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1872
apply   assumption
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1873
apply  clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1874
apply  (drule (2) implmt1_methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1875
apply  (force)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1876
apply (frule subcls1D)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1877
apply (drule (1) bspec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1878
apply clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1879
apply (drule (3) r_into_rtrancl [THEN inheritable_instance_methd_props, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1880
                                 OF _ implmt_is_class])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1881
apply auto 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1882
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1883
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1884
lemma mheadsD [rule_format (no_asm)]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1885
"emh \<in> mheads G S t sig \<longrightarrow> wf_prog G \<longrightarrow>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1886
 (\<exists>C D m. t = ClassT C \<and> declrefT emh = ClassT D \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1887
          accmethd G S C sig = Some m \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1888
          (declclass m = D) \<and> mhead (mthd m) = (mhd emh)) \<or>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1889
 (\<exists>I. t = IfaceT I \<and> ((\<exists>im. im  \<in> accimethds G (pid S) I sig \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1890
          mthd im = mhd emh) \<or> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1891
  (\<exists>m. G\<turnstile>Iface I accessible_in (pid S) \<and> accmethd G S Object sig = Some m \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1892
       accmodi m \<noteq> Private \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1893
       declrefT emh = ClassT Object \<and> mhead (mthd m) = mhd emh))) \<or>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1894
 (\<exists>T m. t = ArrayT T \<and> G\<turnstile>Array T accessible_in (pid S) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1895
        accmethd G S Object sig = Some m \<and> accmodi m \<noteq> Private \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1896
        declrefT emh = ClassT Object \<and> mhead (mthd m) = mhd emh)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1897
apply (rule_tac "ref_ty1"="t" in ref_ty_ty.induct [THEN conjunct1])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1898
apply auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1899
apply (auto simp add: cmheads_def accObjectmheads_def Objectmheads_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1900
apply (auto  dest!: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1901
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1902
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1903
lemma mheads_cases [consumes 2, case_names Class_methd 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1904
                    Iface_methd Iface_Object_methd Array_Object_methd]: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1905
"\<lbrakk>emh \<in> mheads G S t sig; wf_prog G;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1906
 \<And> C D m. \<lbrakk>t = ClassT C;declrefT emh = ClassT D; accmethd G S C sig = Some m;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1907
           (declclass m = D); mhead (mthd m) = (mhd emh)\<rbrakk> \<Longrightarrow> P emh; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1908
 \<And> I im. \<lbrakk>t = IfaceT I; im  \<in> accimethds G (pid S) I sig; mthd im = mhd emh\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1909
          \<Longrightarrow> P emh;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1910
 \<And> I m. \<lbrakk>t = IfaceT I; G\<turnstile>Iface I accessible_in (pid S);
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1911
          accmethd G S Object sig = Some m; accmodi m \<noteq> Private;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1912
         declrefT emh = ClassT Object; mhead (mthd m) = mhd emh\<rbrakk> \<Longrightarrow> P emh;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1913
 \<And> T m. \<lbrakk>t = ArrayT T;G\<turnstile>Array T accessible_in (pid S);
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1914
          accmethd G S Object sig = Some m; accmodi m \<noteq> Private; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1915
          declrefT emh = ClassT Object; mhead (mthd m) = mhd emh\<rbrakk> \<Longrightarrow>  P emh 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1916
\<rbrakk> \<Longrightarrow> P emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1917
by (blast dest!: mheadsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1918
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1919
lemma declclassD[rule_format]:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1920
 "\<lbrakk>wf_prog G;class G C = Some c; methd G C sig = Some m; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1921
   class G (declclass m) = Some d\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1922
  \<Longrightarrow> table_of (methods d) sig  = Some (mthd m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1923
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1924
  assume    wf: "wf_prog G"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1925
  then have ws: "ws_prog G" ..
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1926
  assume  clsC: "class G C = Some c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1927
  from clsC ws 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1928
  show "\<And> m d. \<lbrakk>methd G C sig = Some m; class G (declclass m) = Some d\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1929
        \<Longrightarrow> table_of (methods d) sig  = Some (mthd m)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1930
         (is "PROP ?P C") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1931
  proof (induct ?P C rule: ws_class_induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1932
    case Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1933
    fix m d
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1934
    assume "methd G Object sig = Some m" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1935
           "class G (declclass m) = Some d"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1936
    with wf show "?thesis m d" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1937
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1938
    case Subcls
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1939
    fix C c m d
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1940
    assume hyp: "PROP ?P (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1941
    and      m: "methd G C sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1942
    and  declC: "class G (declclass m) = Some d"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1943
    and   clsC: "class G C = Some c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1944
    and   nObj: "C \<noteq> Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1945
    let ?newMethods = "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c)) sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1946
    show "?thesis m d" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1947
    proof (cases "?newMethods")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1948
      case None
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1949
      from None clsC nObj ws m declC hyp  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1950
      show "?thesis" by (auto simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1951
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1952
      case Some
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1953
      from Some clsC nObj ws m declC hyp  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1954
      show "?thesis" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1955
	by (auto simp add: methd_rec
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1956
                     dest: wf_prog_cdecl wf_cdecl_supD is_acc_class_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1957
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1958
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1959
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1960
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1961
(* Tactical version *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1962
(*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1963
lemma declclassD[rule_format]:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1964
 "wf_prog G \<longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1965
 (\<forall> c d m. class G C = Some c \<longrightarrow> methd G C sig = Some m \<longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1966
  class G (declclass m) = Some d
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1967
 \<longrightarrow> table_of (methods d) sig  = Some (mthd m))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1968
apply (rule class_rec.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1969
apply (rule impI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1970
apply (rule allI)+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1971
apply (rule impI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1972
apply (case_tac "C=Object")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1973
apply   (force simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1974
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1975
apply   (subst methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1976
apply     (blast dest: wf_ws_prog)+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1977
apply   (case_tac "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c)) sig")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1978
apply     (auto dest: wf_prog_cdecl wf_cdecl_supD is_acc_class_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1979
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1980
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1981
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1982
lemma dynmethd_Object:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1983
  assumes statM: "methd G Object sig = Some statM" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1984
        private: "accmodi statM = Private" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1985
       is_cls_C: "is_class G C" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1986
             wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  1987
  shows "dynmethd G Object C sig = Some statM"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1988
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1989
  from is_cls_C wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1990
  have subclseq: "G\<turnstile>C \<preceq>\<^sub>C Object" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1991
    by (auto intro: subcls_ObjectI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1992
  from wf have ws: "ws_prog G" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1993
    by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1994
  from wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1995
  have is_cls_Obj: "is_class G Object" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1996
    by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1997
  from statM subclseq is_cls_Obj ws private
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1998
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  1999
  proof (cases rule: dynmethd_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2000
    case Static then show ?thesis .
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2001
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2002
    case Overrides 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2003
    with private show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2004
      by (auto dest: no_Private_override)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2005
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2006
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2007
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2008
lemma wf_imethds_hiding_objmethdsD: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2009
  assumes     old: "methd G Object sig = Some old" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2010
          is_if_I: "is_iface G I" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2011
               wf: "wf_prog G" and    
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2012
      not_private: "accmodi old \<noteq> Private" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2013
              new: "new \<in> imethds G I sig" 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2014
  shows "G\<turnstile>resTy new\<preceq>resTy old \<and> is_static new = is_static old" (is "?P new")
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2015
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2016
  from wf have ws: "ws_prog G" by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2017
  {
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2018
    fix I i new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2019
    assume ifI: "iface G I = Some i"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2020
    assume new: "table_of (imethods i) sig = Some new" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2021
    from ifI new not_private wf old  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2022
    have "?P (I,new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2023
      by (auto dest!: wf_prog_idecl wf_idecl_hiding cond_hiding_entailsD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2024
            simp del: methd_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2025
  } note hyp_newmethod = this  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2026
  from is_if_I ws new 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2027
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2028
  proof (induct rule: ws_interface_induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2029
    case (Step I i)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2030
    assume ifI: "iface G I = Some i" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2031
    assume new: "new \<in> imethds G I sig" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2032
    from Step
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2033
    have hyp: "\<forall> J \<in> set (isuperIfs i). (new \<in> imethds G J sig \<longrightarrow> ?P new)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2034
      by auto 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2035
    from new ifI ws
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2036
    show "?P new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2037
    proof (cases rule: imethds_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2038
      case NewMethod
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2039
      with ifI hyp_newmethod
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2040
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2041
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2042
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2043
      case (InheritedMethod J)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2044
      assume "J \<in> set (isuperIfs i)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2045
             "new \<in> imethds G J sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2046
      with hyp 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2047
      show "?thesis"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2048
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2049
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2050
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2051
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2052
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2053
text {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2054
Which dynamic classes are valid to look up a member of a distinct static type?
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2055
We have to distinct class members (named static members in Java) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2056
from instance members. Class members are global to all Objects of a class,
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2057
instance members are local to a single Object instance. If a member is
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2058
equipped with the static modifier it is a class member, else it is an 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2059
instance member.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2060
The following table gives an overview of the current framework. We assume
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2061
to have a reference with static type statT and a dynamic class dynC. Between
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2062
both of these types the widening relation holds 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2063
@{term "G\<turnstile>Class dynC\<preceq> statT"}. Unfortunately this ordinary widening relation 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2064
isn't enough to describe the valid lookup classes, since we must cope the
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2065
special cases of arrays and interfaces,too. If we statically expect an array or
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2066
inteface we may lookup a field or a method in Object which isn't covered in 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2067
the widening relation.
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2068
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2069
statT      field         instance method       static (class) method
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2070
------------------------------------------------------------------------
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2071
 NullT      /                  /                   /
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2072
 Iface      /                dynC                Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2073
 Class    dynC               dynC                 dynC
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2074
 Array      /                Object              Object
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2075
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2076
In most cases we con lookup the member in the dynamic class. But as an
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2077
interface can't declare new static methods, nor an array can define new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2078
methods at all, we have to lookup methods in the base class Object.
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2079
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2080
The limitation to classes in the field column is artificial  and comes out
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2081
of the typing rule for the field access (see rule @{text "FVar"} in the 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2082
welltyping relation @{term "wt"} in theory WellType). 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2083
I stems out of the fact, that Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2084
indeed has no non private fields. So interfaces and arrays can actually
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2085
have no fields at all and a field access would be senseless. (In Java
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2086
interfaces are allowed to declare new fields but in current Bali not!).
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2087
So there is no principal reason why we should not allow Objects to declare
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2088
non private fields. Then we would get the following column:
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2089
       
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2090
 statT    field
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2091
----------------- 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2092
 NullT      /  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2093
 Iface    Object 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2094
 Class    dynC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2095
 Array    Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2096
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2097
consts valid_lookup_cls:: "prog \<Rightarrow> ref_ty \<Rightarrow> qtname \<Rightarrow> bool \<Rightarrow> bool"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2098
                        ("_,_ \<turnstile> _ valid'_lookup'_cls'_for _" [61,61,61,61] 60)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2099
primrec
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2100
"G,NullT    \<turnstile> dynC valid_lookup_cls_for static_membr = False"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2101
"G,IfaceT I \<turnstile> dynC valid_lookup_cls_for static_membr 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2102
              = (if static_membr 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2103
                    then dynC=Object 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2104
                    else G\<turnstile>Class dynC\<preceq> Iface I)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2105
"G,ClassT C \<turnstile> dynC valid_lookup_cls_for static_membr = G\<turnstile>Class dynC\<preceq> Class C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2106
"G,ArrayT T \<turnstile> dynC valid_lookup_cls_for static_membr = (dynC=Object)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2107
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2108
lemma valid_lookup_cls_is_class:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2109
  assumes dynC: "G,statT \<turnstile> dynC valid_lookup_cls_for static_membr" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2110
      ty_statT: "isrtype G statT" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2111
            wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2112
  shows "is_class G dynC"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2113
proof (cases statT)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2114
  case NullT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2115
  with dynC ty_statT show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2116
    by (auto dest: widen_NT2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2117
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2118
  case (IfaceT I)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2119
  with dynC wf show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2120
    by (auto dest: implmt_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2121
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2122
  case (ClassT C)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2123
  with dynC ty_statT show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2124
    by (auto dest: subcls_is_class2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2125
next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2126
  case (ArrayT T)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2127
  with dynC wf show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2128
    by (auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2129
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2130
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2131
declare split_paired_All [simp del] split_paired_Ex [simp del]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2132
ML_setup {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2133
simpset_ref() := simpset() delloop "split_all_tac";
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2134
claset_ref () := claset () delSWrapper "split_all_tac"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2135
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2136
lemma dynamic_mheadsD:   
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2137
"\<lbrakk>emh \<in> mheads G S statT sig;    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2138
  G,statT \<turnstile> dynC valid_lookup_cls_for (is_static emh);
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2139
  isrtype G statT; wf_prog G
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2140
 \<rbrakk> \<Longrightarrow> \<exists>m \<in> dynlookup G statT dynC sig: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2141
          is_static m=is_static emh \<and> G\<turnstile>resTy m\<preceq>resTy emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2142
proof - 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2143
  assume      emh: "emh \<in> mheads G S statT sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2144
  and          wf: "wf_prog G"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2145
  and   dynC_Prop: "G,statT \<turnstile> dynC valid_lookup_cls_for (is_static emh)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2146
  and      istype: "isrtype G statT"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2147
  from dynC_Prop istype wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2148
  obtain y where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2149
    dynC: "class G dynC = Some y" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2150
    by (auto dest: valid_lookup_cls_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2151
  from emh wf show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2152
  proof (cases rule: mheads_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2153
    case Class_methd
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2154
    fix statC statDeclC sm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2155
    assume     statC: "statT = ClassT statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2156
    assume            "accmethd G S statC sig = Some sm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2157
    then have     sm: "methd G statC sig = Some sm" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2158
      by (blast dest: accmethd_SomeD)  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2159
    assume eq_mheads: "mhead (mthd sm) = mhd emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2160
    from statC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2161
    have dynlookup: "dynlookup G statT dynC sig = dynmethd G statC dynC sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2162
      by (simp add: dynlookup_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2163
    from wf statC istype dynC_Prop sm 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2164
    obtain dm where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2165
      "dynmethd G statC dynC sig = Some dm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2166
      "is_static dm = is_static sm" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2167
      "G\<turnstile>resTy dm\<preceq>resTy sm"  
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2168
      by (force dest!: ws_dynmethd accmethd_SomeD)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2169
    with dynlookup eq_mheads 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2170
    show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2171
      by (cases emh type: *) (auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2172
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2173
    case Iface_methd
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2174
    fix I im
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2175
    assume    statI: "statT = IfaceT I" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2176
          eq_mheads: "mthd im = mhd emh" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2177
                     "im \<in> accimethds G (pid S) I sig" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2178
    then have im: "im \<in> imethds G I sig" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2179
      by (blast dest: accimethdsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2180
    with istype statI eq_mheads wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2181
    have not_static_emh: "\<not> is_static emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2182
      by (cases emh) (auto dest: wf_prog_idecl imethds_wf_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2183
    from statI im
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2184
    have dynlookup: "dynlookup G statT dynC sig = methd G dynC sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2185
      by (auto simp add: dynlookup_def dynimethd_def) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2186
    from wf dynC_Prop statI istype im not_static_emh 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2187
    obtain dm where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2188
      "methd G dynC sig = Some dm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2189
      "is_static dm = is_static im" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2190
      "G\<turnstile>resTy (mthd dm)\<preceq>resTy (mthd im)" 
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2191
      by (force dest: implmt_methd)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2192
    with dynlookup eq_mheads
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2193
    show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2194
      by (cases emh type: *) (auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2195
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2196
    case Iface_Object_methd
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2197
    fix I sm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2198
    assume   statI: "statT = IfaceT I" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2199
                sm: "accmethd G S Object sig = Some sm" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2200
         eq_mheads: "mhead (mthd sm) = mhd emh" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2201
             nPriv: "accmodi sm \<noteq> Private"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2202
     show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2203
     proof (cases "imethds G I sig = {}")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2204
       case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2205
       with statI 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2206
       have dynlookup: "dynlookup G statT dynC sig = dynmethd G Object dynC sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2207
	 by (simp add: dynlookup_def dynimethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2208
       from wf dynC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2209
       have subclsObj: "G\<turnstile>dynC \<preceq>\<^sub>C Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2210
	 by (auto intro: subcls_ObjectI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2211
       from wf dynC dynC_Prop istype sm subclsObj 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2212
       obtain dm where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2213
	 "dynmethd G Object dynC sig = Some dm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2214
	 "is_static dm = is_static sm" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2215
	 "G\<turnstile>resTy (mthd dm)\<preceq>resTy (mthd sm)"  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2216
	 by (auto dest!: ws_dynmethd accmethd_SomeD 
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2217
                  intro: class_Object [OF wf] intro: that)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2218
       with dynlookup eq_mheads
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2219
       show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2220
	 by (cases emh type: *) (auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2221
     next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2222
       case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2223
       with statI
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2224
       have dynlookup: "dynlookup G statT dynC sig = methd G dynC sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2225
	 by (simp add: dynlookup_def dynimethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2226
       from istype statI
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2227
       have "is_iface G I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2228
	 by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2229
       with wf sm nPriv False 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2230
       obtain im where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2231
	      im: "im \<in> imethds G I sig" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2232
	 eq_stat: "is_static im = is_static sm" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2233
         resProp: "G\<turnstile>resTy (mthd im)\<preceq>resTy (mthd sm)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2234
	 by (auto dest: wf_imethds_hiding_objmethdsD accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2235
       from im wf statI istype eq_stat eq_mheads
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2236
       have not_static_sm: "\<not> is_static emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2237
	 by (cases emh) (auto dest: wf_prog_idecl imethds_wf_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2238
       from im wf dynC_Prop dynC istype statI not_static_sm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2239
       obtain dm where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2240
	 "methd G dynC sig = Some dm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2241
	 "is_static dm = is_static im" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2242
	 "G\<turnstile>resTy (mthd dm)\<preceq>resTy (mthd im)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2243
	 by (auto dest: implmt_methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2244
       with wf eq_stat resProp dynlookup eq_mheads
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2245
       show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2246
	 by (cases emh type: *) (auto intro: widen_trans)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2247
     qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2248
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2249
    case Array_Object_methd
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2250
    fix T sm
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2251
    assume statArr: "statT = ArrayT T" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2252
                sm: "accmethd G S Object sig = Some sm" and 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2253
         eq_mheads: "mhead (mthd sm) = mhd emh" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2254
    from statArr dynC_Prop wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2255
    have dynlookup: "dynlookup G statT dynC sig = methd G Object sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2256
      by (auto simp add: dynlookup_def dynmethd_C_C)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2257
    with sm eq_mheads sm 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2258
    show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2259
      by (cases emh type: *) (auto dest: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2260
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2261
qed
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2262
declare split_paired_All [simp] split_paired_Ex [simp]
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2263
ML_setup {*
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2264
claset_ref()  := claset() addSbefore ("split_all_tac", split_all_tac);
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2265
simpset_ref() := simpset() addloop ("split_all_tac", split_all_tac)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2266
*}
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2267
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2268
(* Tactical version *)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2269
(*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2270
lemma dynamic_mheadsD: "  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2271
 \<lbrakk>emh \<in> mheads G S statT sig; wf_prog G; class G dynC = Some y;  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2272
   if (\<exists>T. statT=ArrayT T) then dynC=Object else G\<turnstile>Class dynC\<preceq>RefT statT; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2273
   isrtype G statT\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2274
  \<exists>m \<in> dynlookup G statT dynC sig: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2275
     static (mthd m)=static (mhd emh) \<and> G\<turnstile>resTy (mthd m)\<preceq>resTy (mhd emh)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2276
apply (drule mheadsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2277
apply safe
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2278
       -- reftype statT is a class  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2279
apply  (case_tac "\<exists>T. ClassT C = ArrayT T")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2280
apply    (simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2281
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2282
apply    (clarsimp simp add: dynlookup_def )
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2283
apply    (frule_tac statC="C" and dynC="dynC"  and sig="sig"  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2284
         in ws_dynmethd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2285
apply      assumption+
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2286
apply    (case_tac "emh")  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2287
apply    (force dest: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2288
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2289
       -- reftype statT is a interface, method defined in interface 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2290
apply    (clarsimp simp add: dynlookup_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2291
apply    (drule (1) implmt_methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2292
apply      blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2293
apply      blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2294
apply    (clarify)  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2295
apply    (unfold dynimethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2296
apply    (rule_tac x="cm" in bexI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2297
apply      (case_tac "emh")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2298
apply      force
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2299
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2300
apply      force
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2301
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2302
        -- reftype statT is a interface, method defined in Object 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2303
apply    (simp add: dynlookup_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2304
apply    (simp only: dynimethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2305
apply    (case_tac "imethds G I sig = {}")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2306
apply       simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2307
apply       (frule_tac statC="Object" and dynC="dynC"  and sig="sig"  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2308
             in ws_dynmethd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2309
apply          (blast intro: subcls_ObjectI wf_ws_prog) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2310
apply          (blast dest: class_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2311
apply       (case_tac "emh") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2312
apply       (force dest: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2313
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2314
apply       simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2315
apply       (subgoal_tac "\<exists> im. im \<in> imethds G I sig") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2316
prefer 2      apply blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2317
apply       clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2318
apply       (frule (1) implmt_methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2319
apply         simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2320
apply         blast  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2321
apply       (clarify dest!: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2322
apply       (frule (4) iface_overrides_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2323
apply       clarify
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2324
apply       (case_tac emh)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2325
apply       force
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2326
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2327
        -- reftype statT is a array
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2328
apply    (simp add: dynlookup_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2329
apply    (case_tac emh)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2330
apply    (force dest: accmethd_SomeD simp add: dynmethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2331
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2332
*)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2333
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2334
(* FIXME occasionally convert to ws_class_induct*) 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2335
lemma methd_declclass:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2336
"\<lbrakk>class G C = Some c; wf_prog G; methd G C sig = Some m\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2337
 \<Longrightarrow> methd G (declclass m) sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2338
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2339
  assume asm: "class G C = Some c" "wf_prog G" "methd G C sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2340
  have "wf_prog G  \<longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2341
	   (\<forall> c m. class G C = Some c \<longrightarrow>  methd G C sig = Some m 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2342
                   \<longrightarrow>  methd G (declclass m) sig = Some m)"      (is "?P G C") 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2343
  proof (rule class_rec.induct,intro allI impI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2344
    fix G C c m
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2345
    assume hyp: "\<forall>c. C \<noteq> Object \<and> ws_prog G \<and> class G C = Some c \<longrightarrow>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2346
                     ?P G (super c)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2347
    assume wf: "wf_prog G" and cls_C: "class G C = Some c" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2348
            m: "methd G C sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2349
    show "methd G (declclass m) sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2350
    proof (cases "C=Object")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2351
      case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2352
      with wf m show ?thesis by (auto intro: table_of_map_SomeI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2353
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2354
      let ?filter="filter_tab (\<lambda>sig m. G\<turnstile>C inherits method sig m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2355
      let ?table = "table_of (map (\<lambda>(s, m). (s, C, m)) (methods c))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2356
      case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2357
      with cls_C wf m
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2358
      have methd_C: "(?filter (methd G (super c)) ++ ?table) sig = Some m "
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2359
	by (simp add: methd_rec)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2360
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2361
      proof (cases "?table sig")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2362
	case None
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2363
	from this methd_C have "?filter (methd G (super c)) sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2364
	  by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2365
	moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2366
	from wf cls_C False obtain sup where "class G (super c) = Some sup"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2367
	  by (blast dest: wf_prog_cdecl wf_cdecl_supD is_acc_class_is_class)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2368
	moreover note wf False cls_C 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2369
	ultimately show ?thesis by (auto intro: hyp [rule_format])
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2370
      next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2371
	case Some
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2372
	from this methd_C m show ?thesis by auto 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2373
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2374
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2375
  qed	
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2376
  with asm show ?thesis by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2377
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2378
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2379
lemma dynmethd_declclass:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2380
 "\<lbrakk>dynmethd G statC dynC sig = Some m;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2381
   wf_prog G; is_class G statC
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2382
  \<rbrakk> \<Longrightarrow> methd G (declclass m) sig = Some m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2383
by (auto dest: dynmethd_declC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2384
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2385
lemma dynlookup_declC:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2386
 "\<lbrakk>dynlookup G statT dynC sig = Some m; wf_prog G;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2387
   is_class G dynC;isrtype G statT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2388
  \<rbrakk> \<Longrightarrow> G\<turnstile>dynC \<preceq>\<^sub>C (declclass m) \<and> is_class G (declclass m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2389
by (cases "statT")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2390
   (auto simp add: dynlookup_def dynimethd_def 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2391
             dest: methd_declC dynmethd_declC)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2392
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2393
lemma dynlookup_Array_declclassD [simp]:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2394
"\<lbrakk>dynlookup G (ArrayT T) Object sig = Some dm;wf_prog G\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2395
 \<Longrightarrow> declclass dm = Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2396
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2397
  assume dynL: "dynlookup G (ArrayT T) Object sig = Some dm"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2398
  assume wf: "wf_prog G"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2399
  from wf have ws: "ws_prog G" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2400
  from wf have is_cls_Obj: "is_class G Object" by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2401
  from dynL wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2402
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2403
    by (auto simp add: dynlookup_def dynmethd_C_C [OF is_cls_Obj ws]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2404
                 dest: methd_Object_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2405
qed   
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2406
  
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2407
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2408
declare split_paired_All [simp del] split_paired_Ex [simp del]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2409
ML_setup {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2410
simpset_ref() := simpset() delloop "split_all_tac";
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2411
claset_ref () := claset () delSWrapper "split_all_tac"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2412
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2413
lemma wt_is_type: "E,dt\<Turnstile>v\<Colon>T \<Longrightarrow>  wf_prog (prg E) \<longrightarrow> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2414
  dt=empty_dt \<longrightarrow> (case T of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2415
                     Inl T \<Rightarrow> is_type (prg E) T 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2416
                   | Inr Ts \<Rightarrow> Ball (set Ts) (is_type (prg E)))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2417
apply (unfold empty_dt_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2418
apply (erule wt.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2419
apply (auto split del: split_if_asm simp del: snd_conv 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2420
            simp add: is_acc_class_def is_acc_type_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2421
apply    (erule typeof_empty_is_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2422
apply   (frule (1) wf_prog_cdecl [THEN wf_cdecl_supD], rotate_tac -1, 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2423
        force simp del: snd_conv, clarsimp simp add: is_acc_class_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2424
apply  (drule (1) max_spec2mheads [THEN conjunct1, THEN mheadsD])
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2425
apply  (drule_tac [2] accfield_fields) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2426
apply  (frule class_Object)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2427
apply  (auto dest: accmethd_rT_is_type 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2428
                   imethds_wf_mhead [THEN conjunct1, THEN rT_is_acc_type]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2429
             dest!:accimethdsD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2430
             simp del: class_Object
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2431
             simp add: is_acc_type_def
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2432
    )
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2433
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2434
declare split_paired_All [simp] split_paired_Ex [simp]
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2435
ML_setup {*
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2436
claset_ref()  := claset() addSbefore ("split_all_tac", split_all_tac);
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2437
simpset_ref() := simpset() addloop ("split_all_tac", split_all_tac)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2438
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2439
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2440
lemma ty_expr_is_type: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2441
"\<lbrakk>E\<turnstile>e\<Colon>-T; wf_prog (prg E)\<rbrakk> \<Longrightarrow> is_type (prg E) T"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2442
by (auto dest!: wt_is_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2443
lemma ty_var_is_type: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2444
"\<lbrakk>E\<turnstile>v\<Colon>=T; wf_prog (prg E)\<rbrakk> \<Longrightarrow> is_type (prg E) T"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2445
by (auto dest!: wt_is_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2446
lemma ty_exprs_is_type: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2447
"\<lbrakk>E\<turnstile>es\<Colon>\<doteq>Ts; wf_prog (prg E)\<rbrakk> \<Longrightarrow> Ball (set Ts) (is_type (prg E))"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2448
by (auto dest!: wt_is_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2449
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2450
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2451
lemma static_mheadsD: 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2452
 "\<lbrakk> emh \<in> mheads G S t sig; wf_prog G; E\<turnstile>e\<Colon>-RefT t; prg E=G ; 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2453
   invmode (mhd emh) e \<noteq> IntVir 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2454
  \<rbrakk> \<Longrightarrow> \<exists>m. (   (\<exists> C. t = ClassT C \<and> accmethd G S C sig = Some m)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2455
               \<or> (\<forall> C. t \<noteq> ClassT C \<and> accmethd G S Object sig = Some m )) \<and> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2456
          declrefT emh = ClassT (declclass m) \<and>  mhead (mthd m) = (mhd emh)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2457
apply (subgoal_tac "is_static emh \<or> e = Super")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2458
defer apply (force simp add: invmode_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2459
apply (frule  ty_expr_is_type)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2460
apply   simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2461
apply (case_tac "is_static emh")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2462
apply  (frule (1) mheadsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2463
apply  clarsimp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2464
apply  safe
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2465
apply    blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2466
apply   (auto dest!: imethds_wf_mhead
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2467
                     accmethd_SomeD 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2468
                     accimethdsD
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2469
              simp add: accObjectmheads_def Objectmheads_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2470
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2471
apply  (erule wt_elim_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2472
apply  (force simp add: cmheads_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2473
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2474
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2475
lemma wt_MethdI:  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2476
"\<lbrakk>methd G C sig = Some m; wf_prog G;  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2477
  class G C = Some c\<rbrakk> \<Longrightarrow>  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2478
 \<exists>T. \<lparr>prg=G,cls=(declclass m),
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2479
      lcl=\<lambda> k. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2480
          (case k of
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2481
             EName e 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2482
             \<Rightarrow> (case e of 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2483
                   VNam v 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2484
                   \<Rightarrow> (table_of (lcls (mbody (mthd m)))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2485
                                ((pars (mthd m))[\<mapsto>](parTs sig))) v
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2486
                 | Res \<Rightarrow> Some (resTy (mthd m)))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2487
           | This \<Rightarrow> if is_static m then None else Some (Class (declclass m)))
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2488
     \<rparr>\<turnstile> Methd C sig\<Colon>-T \<and> G\<turnstile>T\<preceq>resTy m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2489
apply (frule (2) methd_wf_mdecl, clarify)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2490
apply (force dest!: wf_mdecl_bodyD intro!: wt.Methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2491
done
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2492
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2493
subsection "accessibility concerns"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2494
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2495
lemma mheads_type_accessible:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2496
 "\<lbrakk>emh \<in> mheads G S T sig; wf_prog G\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2497
 \<Longrightarrow> G\<turnstile>RefT T accessible_in (pid S)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2498
by (erule mheads_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2499
   (auto dest: accmethd_SomeD accessible_from_commonD accimethdsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2500
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2501
lemma static_to_dynamic_accessible_from_aux:
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2502
"\<lbrakk>G\<turnstile>m of C accessible_from accC;wf_prog G\<rbrakk> 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2503
 \<Longrightarrow> G\<turnstile>m in C dyn_accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2504
proof (induct rule: accessible_fromR.induct)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2505
qed (auto intro: dyn_accessible_fromR.intros 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2506
                 member_of_to_member_in
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2507
                 static_to_dynamic_overriding)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2508
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2509
lemma static_to_dynamic_accessible_from:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2510
  assumes stat_acc: "G\<turnstile>m of statC accessible_from accC" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2511
          subclseq: "G\<turnstile>dynC \<preceq>\<^sub>C statC" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2512
                wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2513
  shows "G\<turnstile>m in dynC dyn_accessible_from accC"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2514
proof - 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2515
  from stat_acc subclseq 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2516
  show ?thesis (is "?Dyn_accessible m")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2517
  proof (induct rule: accessible_fromR.induct)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2518
    case (Immediate statC m)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2519
    then show "?Dyn_accessible m"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2520
      by (blast intro: dyn_accessible_fromR.Immediate
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2521
                       member_inI
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2522
                       permits_acc_inheritance)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2523
  next
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2524
    case (Overriding _ _ m)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2525
    with wf show "?Dyn_accessible m"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2526
      by (blast intro: dyn_accessible_fromR.Overriding
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2527
                       member_inI
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2528
                       static_to_dynamic_overriding  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2529
                       rtrancl_trancl_trancl 
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2530
                       static_to_dynamic_accessible_from_aux)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2531
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2532
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2533
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2534
lemma static_to_dynamic_accessible_from_static:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2535
  assumes stat_acc: "G\<turnstile>m of statC accessible_from accC" and
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2536
            static: "is_static m" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2537
                wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2538
  shows "G\<turnstile>m in (declclass m) dyn_accessible_from accC"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2539
proof -
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2540
  from stat_acc wf 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2541
  have "G\<turnstile>m in statC dyn_accessible_from accC"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2542
    by (auto intro: static_to_dynamic_accessible_from)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2543
  from this static
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2544
  show ?thesis
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2545
    by (rule dyn_accessible_from_static_declC)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2546
qed
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2547
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2548
lemma dynmethd_member_in:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2549
  assumes    m: "dynmethd G statC dynC sig = Some m" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2550
   iscls_statC: "is_class G statC" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2551
            wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2552
  shows "G\<turnstile>Methd sig m member_in dynC"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2553
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2554
  from m 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2555
  have subclseq: "G\<turnstile>dynC \<preceq>\<^sub>C statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2556
    by (auto simp add: dynmethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2557
  from subclseq iscls_statC 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2558
  have iscls_dynC: "is_class G dynC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2559
    by (rule subcls_is_class2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2560
  from  iscls_dynC iscls_statC wf m
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2561
  have "G\<turnstile>dynC \<preceq>\<^sub>C (declclass m) \<and> is_class G (declclass m) \<and>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2562
        methd G (declclass m) sig = Some m" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2563
    by - (drule dynmethd_declC, auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2564
  with wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2565
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2566
    by (auto intro: member_inI dest: methd_member_of)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2567
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2568
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2569
lemma dynmethd_access_prop:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2570
  assumes statM: "methd G statC sig = Some statM" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2571
       stat_acc: "G\<turnstile>Methd sig statM of statC accessible_from accC" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2572
           dynM: "dynmethd G statC dynC sig = Some dynM" and
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2573
             wf: "wf_prog G" 
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2574
  shows "G\<turnstile>Methd sig dynM in dynC dyn_accessible_from accC"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2575
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2576
  from wf have ws: "ws_prog G" ..
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2577
  from dynM 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2578
  have subclseq: "G\<turnstile>dynC \<preceq>\<^sub>C statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2579
    by (auto simp add: dynmethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2580
  from stat_acc 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2581
  have is_cls_statC: "is_class G statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2582
    by (auto dest: accessible_from_commonD member_of_is_classD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2583
  with subclseq 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2584
  have is_cls_dynC: "is_class G dynC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2585
    by (rule subcls_is_class2)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2586
  from is_cls_statC statM wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2587
  have member_statC: "G\<turnstile>Methd sig statM member_of statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2588
    by (auto intro: methd_member_of)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2589
  from stat_acc 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2590
  have statC_acc: "G\<turnstile>Class statC accessible_in (pid accC)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2591
    by (auto dest: accessible_from_commonD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2592
  from statM subclseq is_cls_statC ws 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2593
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2594
  proof (cases rule: dynmethd_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2595
    case Static
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2596
    assume dynmethd: "dynmethd G statC dynC sig = Some statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2597
    with dynM have eq_dynM_statM: "dynM=statM" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2598
      by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2599
    with stat_acc subclseq wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2600
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2601
      by (auto intro: static_to_dynamic_accessible_from)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2602
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2603
    case (Overrides newM)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2604
    assume dynmethd: "dynmethd G statC dynC sig = Some newM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2605
    assume override: "G,sig\<turnstile>newM overrides statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2606
    assume      neq: "newM\<noteq>statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2607
    from dynmethd dynM 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2608
    have eq_dynM_newM: "dynM=newM" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2609
      by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2610
    from dynmethd eq_dynM_newM wf is_cls_statC
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2611
    have "G\<turnstile>Methd sig dynM member_in dynC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2612
      by (auto intro: dynmethd_member_in)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2613
    moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2614
    from subclseq
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2615
    have "G\<turnstile>dynC\<prec>\<^sub>C statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2616
    proof (cases rule: subclseq_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2617
      case Eq
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2618
      assume "dynC=statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2619
      moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2620
      from is_cls_statC obtain c
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2621
	where "class G statC = Some c"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2622
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2623
      moreover 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2624
      note statM ws dynmethd 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2625
      ultimately
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2626
      have "newM=statM" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2627
	by (auto simp add: dynmethd_C_C)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2628
      with neq show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2629
	by (contradiction)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2630
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2631
      case Subcls show ?thesis .
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2632
    qed 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2633
    moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2634
    from stat_acc wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2635
    have "G\<turnstile>Methd sig statM in statC dyn_accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2636
      by (blast intro: static_to_dynamic_accessible_from)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2637
    moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2638
    note override eq_dynM_newM
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2639
    ultimately show ?thesis
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2640
      by (cases dynM,cases statM) (auto intro: dyn_accessible_fromR.Overriding)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2641
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2642
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2643
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2644
lemma implmt_methd_access:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2645
  fixes accC::qtname
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2646
  assumes iface_methd: "imethds G I sig \<noteq> {}" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2647
           implements: "G\<turnstile>dynC\<leadsto>I"  and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2648
               isif_I: "is_iface G I" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2649
                   wf: "wf_prog G" 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2650
  shows "\<exists> dynM. methd G dynC sig = Some dynM \<and> 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2651
            G\<turnstile>Methd sig dynM in dynC dyn_accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2652
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2653
  from implements 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2654
  have iscls_dynC: "is_class G dynC" by (rule implmt_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2655
  from iface_methd
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2656
  obtain im
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2657
    where "im \<in> imethds G I sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2658
    by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2659
  with wf implements isif_I 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2660
  obtain dynM 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2661
    where dynM: "methd G dynC sig = Some dynM" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2662
           pub: "accmodi dynM = Public"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2663
    by (blast dest: implmt_methd)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2664
  with iscls_dynC wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2665
  have "G\<turnstile>Methd sig dynM in dynC dyn_accessible_from accC"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2666
    by (auto intro!: dyn_accessible_fromR.Immediate 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2667
              intro: methd_member_of member_of_to_member_in
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2668
                     simp add: permits_acc_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2669
  with dynM    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2670
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2671
    by blast
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2672
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2673
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2674
corollary implmt_dynimethd_access:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2675
  fixes accC::qtname
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2676
  assumes iface_methd: "imethds G I sig \<noteq> {}" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2677
           implements: "G\<turnstile>dynC\<leadsto>I"  and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2678
               isif_I: "is_iface G I" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2679
                   wf: "wf_prog G" 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2680
  shows "\<exists> dynM. dynimethd G I dynC sig = Some dynM \<and> 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2681
            G\<turnstile>Methd sig dynM in dynC dyn_accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2682
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2683
  from iface_methd
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2684
  have "dynimethd G I dynC sig = methd G dynC sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2685
    by (simp add: dynimethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2686
  with iface_methd implements isif_I wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2687
  show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2688
    by (simp only:)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2689
       (blast intro: implmt_methd_access)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2690
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2691
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2692
lemma dynlookup_access_prop:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2693
  assumes emh: "emh \<in> mheads G accC statT sig" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2694
         dynM: "dynlookup G statT dynC sig = Some dynM" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2695
    dynC_prop: "G,statT \<turnstile> dynC valid_lookup_cls_for is_static emh" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2696
    isT_statT: "isrtype G statT" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2697
           wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2698
  shows "G \<turnstile>Methd sig dynM in dynC dyn_accessible_from accC"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2699
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2700
  from emh wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2701
  have statT_acc: "G\<turnstile>RefT statT accessible_in (pid accC)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2702
    by (rule mheads_type_accessible)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2703
  from dynC_prop isT_statT wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2704
  have iscls_dynC: "is_class G dynC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2705
    by (rule valid_lookup_cls_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2706
  from emh dynC_prop isT_statT wf dynM
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2707
  have eq_static: "is_static emh = is_static dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2708
    by (auto dest: dynamic_mheadsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2709
  from emh wf show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2710
  proof (cases rule: mheads_cases)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2711
    case (Class_methd statC _ statM)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2712
    assume statT: "statT = ClassT statC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2713
    assume "accmethd G accC statC sig = Some statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2714
    then have    statM: "methd G statC sig = Some statM" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2715
              stat_acc: "G\<turnstile>Methd sig statM of statC accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2716
      by (auto dest: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2717
    from dynM statT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2718
    have dynM': "dynmethd G statC dynC sig = Some dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2719
      by (simp add: dynlookup_def) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2720
    from statM stat_acc wf dynM'
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2721
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2722
      by (auto dest!: dynmethd_access_prop)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2723
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2724
    case (Iface_methd I im)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2725
    then have iface_methd: "imethds G I sig \<noteq> {}" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2726
                 statT_acc: "G\<turnstile>RefT statT accessible_in (pid accC)" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2727
      by (auto dest: accimethdsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2728
    assume   statT: "statT = IfaceT I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2729
    assume      im: "im \<in>  accimethds G (pid accC) I sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2730
    assume eq_mhds: "mthd im = mhd emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2731
    from dynM statT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2732
    have dynM': "dynimethd G I dynC sig = Some dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2733
      by (simp add: dynlookup_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2734
    from isT_statT statT 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2735
    have isif_I: "is_iface G I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2736
      by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2737
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2738
    proof (cases "is_static emh")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2739
      case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2740
      with statT dynC_prop 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2741
      have widen_dynC: "G\<turnstile>Class dynC \<preceq> RefT statT"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2742
	by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2743
      from statT widen_dynC
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2744
      have implmnt: "G\<turnstile>dynC\<leadsto>I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2745
	by auto    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2746
      from eq_static False 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2747
      have not_static_dynM: "\<not> is_static dynM" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2748
	by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2749
      from iface_methd implmnt isif_I wf dynM'
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2750
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2751
	by - (drule implmt_dynimethd_access, auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2752
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2753
      case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2754
      assume "is_static emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2755
      moreover
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2756
      from wf isT_statT statT im 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2757
      have "\<not> is_static im"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2758
	by (auto dest: accimethdsD wf_prog_idecl imethds_wf_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2759
      moreover note eq_mhds
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2760
      ultimately show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2761
	by (cases emh) auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2762
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2763
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2764
    case (Iface_Object_methd I statM)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2765
    assume statT: "statT = IfaceT I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2766
    assume "accmethd G accC Object sig = Some statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2767
    then have    statM: "methd G Object sig = Some statM" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2768
              stat_acc: "G\<turnstile>Methd sig statM of Object accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2769
      by (auto dest: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2770
    assume not_Private_statM: "accmodi statM \<noteq> Private"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2771
    assume eq_mhds: "mhead (mthd statM) = mhd emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2772
    from iscls_dynC wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2773
    have widen_dynC_Obj: "G\<turnstile>dynC \<preceq>\<^sub>C Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2774
      by (auto intro: subcls_ObjectI)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2775
    show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2776
    proof (cases "imethds G I sig = {}")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2777
      case True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2778
      from dynM statT True
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2779
      have dynM': "dynmethd G Object dynC sig = Some dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2780
	by (simp add: dynlookup_def dynimethd_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2781
      from statT  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2782
      have "G\<turnstile>RefT statT \<preceq>Class Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2783
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2784
      with statM statT_acc stat_acc widen_dynC_Obj statT isT_statT 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2785
        wf dynM' eq_static dynC_prop  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2786
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2787
	by - (drule dynmethd_access_prop,force+) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2788
    next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2789
      case False
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2790
      then obtain im where
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2791
	im: "im \<in>  imethds G I sig"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2792
	by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2793
      have not_static_emh: "\<not> is_static emh"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2794
      proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2795
	from im statM statT isT_statT wf not_Private_statM 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2796
	have "is_static im = is_static statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2797
	  by (auto dest: wf_imethds_hiding_objmethdsD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2798
	with wf isT_statT statT im 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2799
	have "\<not> is_static statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2800
	  by (auto dest: wf_prog_idecl imethds_wf_mhead)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2801
	with eq_mhds
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2802
	show ?thesis  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2803
	  by (cases emh) auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2804
      qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2805
      with statT dynC_prop
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2806
      have implmnt: "G\<turnstile>dynC\<leadsto>I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2807
	by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2808
      with isT_statT statT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2809
      have isif_I: "is_iface G I"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2810
	by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2811
      from dynM statT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2812
      have dynM': "dynimethd G I dynC sig = Some dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2813
	by (simp add: dynlookup_def) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2814
      from False implmnt isif_I wf dynM'
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2815
      show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2816
	by - (drule implmt_dynimethd_access, auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2817
    qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2818
  next
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2819
    case (Array_Object_methd T statM)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2820
    assume statT: "statT = ArrayT T"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2821
    assume "accmethd G accC Object sig = Some statM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2822
    then have    statM: "methd G Object sig = Some statM" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2823
              stat_acc: "G\<turnstile>Methd sig statM of Object accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2824
      by (auto dest: accmethd_SomeD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2825
    from statT dynC_prop
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2826
    have dynC_Obj: "dynC = Object" 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2827
      by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2828
    then
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2829
    have widen_dynC_Obj: "G\<turnstile>Class dynC \<preceq> Class Object"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2830
      by simp
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2831
    from dynM statT    
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2832
    have dynM': "dynmethd G Object dynC sig = Some dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2833
      by (simp add: dynlookup_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2834
    from statM statT_acc stat_acc dynM' wf widen_dynC_Obj  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2835
         statT isT_statT  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2836
    show ?thesis   
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2837
      by - (drule dynmethd_access_prop, simp+) 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2838
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2839
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2840
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2841
lemma dynlookup_access:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2842
  assumes emh: "emh \<in> mheads G accC statT sig" and
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2843
    dynC_prop: "G,statT \<turnstile> dynC valid_lookup_cls_for (is_static emh) " and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2844
    isT_statT: "isrtype G statT" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2845
           wf: "wf_prog G"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2846
  shows "\<exists> dynM. dynlookup G statT dynC sig = Some dynM \<and> 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2847
            G\<turnstile>Methd sig dynM in dynC dyn_accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2848
proof - 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2849
  from dynC_prop isT_statT wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2850
  have is_cls_dynC: "is_class G dynC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2851
    by (auto dest: valid_lookup_cls_is_class)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2852
  with emh wf dynC_prop isT_statT
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2853
  obtain dynM where 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2854
    "dynlookup G statT dynC sig = Some dynM"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2855
    by - (drule dynamic_mheadsD,auto)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2856
  with  emh dynC_prop isT_statT wf
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2857
  show ?thesis 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2858
    by (blast intro: dynlookup_access_prop)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2859
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2860
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2861
lemma stat_overrides_Package_old: 
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2862
  assumes stat_override: "G \<turnstile> new overrides\<^sub>S old" and 
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2863
          accmodi_new: "accmodi new = Package" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2864
                   wf: "wf_prog G "
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2865
  shows "accmodi old = Package"
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2866
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2867
  from stat_override wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2868
  have "accmodi old \<le> accmodi new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2869
    by (auto dest: wf_prog_stat_overridesD)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2870
  with stat_override accmodi_new show ?thesis
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2871
    by (cases "accmodi old") (auto dest: no_Private_stat_override 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2872
                                   dest: acc_modi_le_Dests)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2873
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2874
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2875
text {* @{text dyn_accessible_Package} only works with the @{text wf_prog} assumption. 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2876
Without it. it is easy to leaf the Package!
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2877
*}
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2878
lemma dyn_accessible_Package:
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2879
 "\<lbrakk>G \<turnstile> m in C dyn_accessible_from accC; accmodi m = Package;
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2880
   wf_prog G\<rbrakk>
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2881
  \<Longrightarrow> pid accC = pid (declclass m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2882
proof -
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2883
  assume wf: "wf_prog G "
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2884
  assume accessible: "G \<turnstile> m in C dyn_accessible_from accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2885
  then show "accmodi m = Package 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2886
            \<Longrightarrow> pid accC = pid (declclass m)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2887
    (is "?Pack m \<Longrightarrow> ?P m")
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2888
  proof (induct rule: dyn_accessible_fromR.induct)
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2889
    case (Immediate C m)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2890
    assume "G\<turnstile>m member_in C"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2891
           "G \<turnstile> m in C permits_acc_to accC"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2892
           "accmodi m = Package"      
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2893
    then show "?P m"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2894
      by (auto simp add: permits_acc_def)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2895
  next
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2896
    case (Overriding declC C new newm old Sup)
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2897
    assume member_new: "G \<turnstile> new member_in C" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2898
                  new: "new = (declC, mdecl newm)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2899
             override: "G \<turnstile> (declC, newm) overrides old" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2900
         subcls_C_Sup: "G\<turnstile>C \<prec>\<^sub>C Sup" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2901
              acc_old: "G \<turnstile> methdMembr old in Sup dyn_accessible_from accC" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2902
                  hyp: "?Pack (methdMembr old) \<Longrightarrow> ?P (methdMembr old)" and
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2903
          accmodi_new: "accmodi new = Package"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2904
    from override accmodi_new new wf 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2905
    have accmodi_old: "accmodi old = Package"  
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2906
      by (auto dest: overrides_Package_old)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2907
    with hyp 
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2908
    have P_sup: "?P (methdMembr old)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2909
      by (simp)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2910
    from wf override new accmodi_old accmodi_new
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2911
    have eq_pid_new_old: "pid (declclass new) = pid (declclass old)"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2912
      by (auto dest: dyn_override_Package)
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2913
    with eq_pid_new_old P_sup show "?P new"
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2914
      by auto
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2915
  qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2916
qed
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2917
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2918
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2919
text {* @{text dyn_accessible_instance_field_Protected} only works for fields
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2920
since methods can break the package bounds due to overriding
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2921
*}
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2922
lemma dyn_accessible_instance_field_Protected:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2923
  assumes dyn_acc: "G \<turnstile> f in C dyn_accessible_from accC" and
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2924
             prot: "accmodi f = Protected" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2925
            field: "is_field f" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2926
   instance_field: "\<not> is_static f" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2927
          outside: "pid (declclass f) \<noteq> pid accC"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2928
  shows "G\<turnstile> C \<preceq>\<^sub>C accC"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2929
proof -
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2930
  from dyn_acc prot field instance_field outside
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2931
  show ?thesis
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2932
  proof (induct)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2933
    case (Immediate C f)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2934
    have "G \<turnstile> f in C permits_acc_to accC" .
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2935
    moreover 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2936
    assume "accmodi f = Protected" and  "is_field f" and "\<not> is_static f" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2937
           "pid (declclass f) \<noteq> pid accC"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2938
    ultimately 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2939
    show "G\<turnstile> C \<preceq>\<^sub>C accC"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2940
      by (auto simp add: permits_acc_def)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2941
  next
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2942
    case Overriding
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2943
    then show ?case by (simp add: is_field_def)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2944
  qed
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2945
qed
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2946
   
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2947
lemma dyn_accessible_static_field_Protected:
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2948
  assumes dyn_acc: "G \<turnstile> f in C dyn_accessible_from accC" and
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2949
             prot: "accmodi f = Protected" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2950
            field: "is_field f" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2951
     static_field: "is_static f" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2952
          outside: "pid (declclass f) \<noteq> pid accC"
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12925
diff changeset
  2953
  shows "G\<turnstile> accC \<preceq>\<^sub>C declclass f  \<and> G\<turnstile>C \<preceq>\<^sub>C declclass f"
12925
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2954
proof -
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2955
  from dyn_acc prot field static_field outside
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2956
  show ?thesis
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2957
  proof (induct)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2958
    case (Immediate C f)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2959
    assume "accmodi f = Protected" and  "is_field f" and "is_static f" and
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2960
           "pid (declclass f) \<noteq> pid accC"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2961
    moreover 
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2962
    have "G \<turnstile> f in C permits_acc_to accC" .
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2963
    ultimately
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2964
    have "G\<turnstile> accC \<preceq>\<^sub>C declclass f"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2965
      by (auto simp add: permits_acc_def)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2966
    moreover
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2967
    have "G \<turnstile> f member_in C" .
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2968
    then have "G\<turnstile>C \<preceq>\<^sub>C declclass f"
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2969
      by (rule member_in_class_relation)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2970
    ultimately show ?case
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2971
      by blast
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2972
  next
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2973
    case Overriding
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2974
    then show ?case by (simp add: is_field_def)
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2975
  qed
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2976
qed
99131847fb93 Added check for field/method access to operational semantics and proved the acesses valid.
schirmer
parents: 12893
diff changeset
  2977
12854
00d4a435777f Isabelle/Bali sources;
schirmer
parents:
diff changeset
  2978
end