src/HOL/NanoJava/Equivalence.thy
changeset 11476 06c1998340a8
parent 11376 bf98ad1c22c6
child 11486 8f32860eac3a
equal deleted inserted replaced
11475:11402be6e4b0 11476:06c1998340a8
     9 theory Equivalence = OpSem + AxSem:
     9 theory Equivalence = OpSem + AxSem:
    10 
    10 
    11 subsection "Validity"
    11 subsection "Validity"
    12 
    12 
    13 constdefs
    13 constdefs
    14   valid   :: "[assn,stmt,assn] => bool" ("|= {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
    14   valid   :: "[assn,stmt, assn] => bool"  ("|= {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
    15  "|= {P} c {Q} \<equiv> \<forall>s t. P s --> (\<exists>n. s -c-n-> t) --> Q t"
    15  "|=  {P} c {Q} \<equiv> \<forall>s   t. P s --> (\<exists>n. s -c  -n-> t) --> Q   t"
    16 
    16 
    17  nvalid   :: "[nat,       triple    ] => bool" ("|=_: _"  [61,61] 60)
    17  evalid   :: "[assn,expr,vassn] => bool" ("|=e {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
    18  "|=n: t \<equiv> let (P,c,Q) = t in \<forall>s t. s -c-n-> t --> P s --> Q t"
    18  "|=e {P} e {Q} \<equiv> \<forall>s v t. P s --> (\<exists>n. s -e>v-n-> t) --> Q v t"
    19 
    19 
    20  nvalids  :: "[nat,       triple set] => bool" ("||=_: _" [61,61] 60)
    20 
       
    21  nvalid   :: "[nat, triple    ] => bool" ("|=_: _"  [61,61] 60)
       
    22  "|=n:  t \<equiv> let (P,c,Q) = t in \<forall>s   t. s -c  -n-> t --> P s --> Q   t"
       
    23 
       
    24 envalid   :: "[nat,etriple    ] => bool" ("|=_:e _" [61,61] 60)
       
    25  "|=n:e t \<equiv> let (P,e,Q) = t in \<forall>s v t. s -e>v-n-> t --> P s --> Q v t"
       
    26 
       
    27   nvalids :: "[nat,       triple set] => bool" ("||=_: _" [61,61] 60)
    21  "||=n: T \<equiv> \<forall>t\<in>T. |=n: t"
    28  "||=n: T \<equiv> \<forall>t\<in>T. |=n: t"
    22 
    29 
    23  cnvalids :: "[triple set,triple set] => bool" ("_ ||=/ _"[61,61] 60)
    30  cnvalids :: "[triple set,triple set] => bool" ("_ ||=/ _"  [61,61] 60)
    24  "A ||= C \<equiv> \<forall>n. ||=n: A --> ||=n: C"
    31  "A ||=  C \<equiv> \<forall>n. ||=n: A --> ||=n: C"
       
    32 
       
    33 cenvalid  :: "[triple set,etriple   ] => bool" ("_ ||=e/ _" [61,61] 60)
       
    34  "A ||=e t \<equiv> \<forall>n. ||=n: A --> |=n:e t"
    25 
    35 
    26 syntax (xsymbols)
    36 syntax (xsymbols)
    27   valid   :: "[assn,stmt,assn] => bool" ("\<Turnstile> {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
    37    valid  :: "[assn,stmt, assn] => bool" ( "\<Turnstile> {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
    28  nvalid   :: "[nat,       triple    ] => bool" ("\<Turnstile>_: _"   [61,61] 60)
    38   evalid  :: "[assn,expr,vassn] => bool" ("\<Turnstile>e {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
    29  nvalids  :: "[nat,       triple set] => bool" ("|\<Turnstile>_: _"  [61,61] 60)
    39   nvalid  :: "[nat, triple          ] => bool" ("\<Turnstile>_: _"  [61,61] 60)
       
    40  envalid  :: "[nat,etriple          ] => bool" ("\<Turnstile>_:e _" [61,61] 60)
       
    41   nvalids :: "[nat,       triple set] => bool" ("|\<Turnstile>_: _"  [61,61] 60)
    30  cnvalids :: "[triple set,triple set] => bool" ("_ |\<Turnstile>/ _" [61,61] 60)
    42  cnvalids :: "[triple set,triple set] => bool" ("_ |\<Turnstile>/ _" [61,61] 60)
    31 
    43 cenvalid  :: "[triple set,etriple   ] => bool" ("_ |\<Turnstile>e/ _"[61,61] 60)
    32 syntax
    44 
    33   nvalid1::"[nat,        assn,stmt,assn] => bool" ( "|=_:.{(1_)}/ (_)/ {(1_)}"
    45 
    34                                                          [61,3,90,3] 60)
    46 lemma nvalid_def2: "\<Turnstile>n: (P,c,Q) \<equiv> \<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t"
    35  cnvalid1::"[triple set, assn,stmt,assn] => bool" ("_ ||=.{(1_)}/ (_)/ {(1_)}"
       
    36                                                          [61,3,90,3] 60)
       
    37 syntax (xsymbols)
       
    38   nvalid1::"[nat,        assn,stmt,assn] => bool" (  "\<Turnstile>_:.{(1_)}/ (_)/ {(1_)}"
       
    39                                                          [61,3,90,3] 60)
       
    40  cnvalid1::"[triple set, assn,stmt,assn] => bool" ( "_ |\<Turnstile>.{(1_)}/ (_)/ {(1_)}"
       
    41                                                          [61,3,90,3] 60)
       
    42 translations
       
    43  " \<Turnstile>n:.{P} c {Q}" \<rightleftharpoons> " \<Turnstile>n:  (P,c,Q)"
       
    44  "A |\<Turnstile>.{P} c {Q}" \<rightleftharpoons> "A |\<Turnstile> {(P,c,Q)}"
       
    45 
       
    46 lemma nvalid1_def2: "\<Turnstile>n:.{P} c {Q} \<equiv> \<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t"
       
    47 by (simp add: nvalid_def Let_def)
    47 by (simp add: nvalid_def Let_def)
    48 
    48 
    49 lemma cnvalid1_def2: 
    49 lemma valid_def2: "\<Turnstile> {P} c {Q} = (\<forall>n. \<Turnstile>n: (P,c,Q))"
    50   "A |\<Turnstile>.{P} c {Q} \<equiv> \<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t)"
    50 apply (simp add: valid_def nvalid_def2)
    51 by(simp add: nvalid1_def2 nvalids_def cnvalids_def)
    51 apply blast
    52 
    52 done
    53 lemma valid_def2: "\<Turnstile> {P} c {Q} = (\<forall>n. \<Turnstile>n:.{P} c {Q})"
    53 
    54 apply (simp add: valid_def nvalid1_def2)
    54 lemma envalid_def2: "\<Turnstile>n:e (P,e,Q) \<equiv> \<forall>s v t. s -e\<succ>v-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q v t"
    55 apply blast
    55 by (simp add: envalid_def Let_def)
    56 done
    56 
       
    57 lemma evalid_def2: "\<Turnstile>e {P} e {Q} = (\<forall>n. \<Turnstile>n:e (P,e,Q))"
       
    58 apply (simp add: evalid_def envalid_def2)
       
    59 apply blast
       
    60 done
       
    61 
       
    62 lemma cenvalid_def2: 
       
    63   "A|\<Turnstile>e (P,e,Q) = (\<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s v t. s -e\<succ>v-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q v t))"
       
    64 by(simp add: cenvalid_def envalid_def2) 
    57 
    65 
    58 
    66 
    59 subsection "Soundness"
    67 subsection "Soundness"
    60 
    68 
    61 declare exec_elim_cases [elim!]
    69 declare exec_elim_cases [elim!] eval_elim_cases [elim!]
    62 
    70 
    63 lemma Impl_nvalid_0: "\<Turnstile>0:.{P} Impl C m {Q}"
    71 lemma Impl_nvalid_0: "\<Turnstile>0: (P,Impl C m,Q)"
    64 by (clarsimp simp add: nvalid1_def2)
    72 by (clarsimp simp add: nvalid_def2)
    65 
    73 
    66 lemma Impl_nvalid_Suc: "\<Turnstile>n:.{P} body C m {Q} \<Longrightarrow> \<Turnstile>Suc n:.{P} Impl C m {Q}"
    74 lemma Impl_nvalid_Suc: "\<Turnstile>n: (P,body C m,Q) \<Longrightarrow> \<Turnstile>Suc n: (P,Impl C m,Q)"
    67 by (clarsimp simp add: nvalid1_def2)
    75 by (clarsimp simp add: nvalid_def2)
    68 
    76 
    69 lemma nvalid_SucD: "\<And>t. \<Turnstile>Suc n:t \<Longrightarrow> \<Turnstile>n:t"
    77 lemma nvalid_SucD: "\<And>t. \<Turnstile>Suc n:t \<Longrightarrow> \<Turnstile>n:t"
    70 by (force simp add: split_paired_all nvalid1_def2 intro: exec_mono)
    78 by (force simp add: split_paired_all nvalid_def2 intro: exec_mono)
    71 
    79 
    72 lemma nvalids_SucD: "Ball A (nvalid (Suc n)) \<Longrightarrow>  Ball A (nvalid n)"
    80 lemma nvalids_SucD: "Ball A (nvalid (Suc n)) \<Longrightarrow>  Ball A (nvalid n)"
    73 by (fast intro: nvalid_SucD)
    81 by (fast intro: nvalid_SucD)
    74 
    82 
    75 lemma Loop_sound_lemma [rule_format (no_asm)]: 
    83 lemma Loop_sound_lemma [rule_format (no_asm)]: 
    76 "\<lbrakk>\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<and> s<e> \<noteq> Null \<longrightarrow> P t; s -c0-n0\<rightarrow> t\<rbrakk> \<Longrightarrow> 
    84 "\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<and> s<x> \<noteq> Null \<longrightarrow> P t \<Longrightarrow> 
    77   P s \<longrightarrow> c0 = While (e) c \<longrightarrow> n0 = n \<longrightarrow> P t \<and> t<e> = Null"
    85   (s -c0-n0\<rightarrow> t \<longrightarrow> P s \<longrightarrow> c0 = While (x) c \<longrightarrow> n0 = n \<longrightarrow> P t \<and> t<x> = Null)"
    78 apply (erule exec.induct)
    86 apply (rule_tac "P2.1"="%s e v n t. True" in exec_eval.induct [THEN conjunct1])
    79 apply clarsimp+
    87 apply clarsimp+
    80 done
    88 done
    81 
    89 
    82 lemma Impl_sound_lemma: 
    90 lemma Impl_sound_lemma: 
    83 "\<lbrakk>\<forall>n. Ball (A \<union> B) (nvalid n) \<longrightarrow> Ball (\<Union>z. split (f z) ` ms) (nvalid n);
    91 "\<lbrakk>\<forall>n. Ball (A \<union> B) (nvalid n) \<longrightarrow> Ball (\<Union>z. split (f z) ` ms) (nvalid n);
    84           (C, m) \<in> ms; Ball A (nvalid na); Ball B (nvalid na)\<rbrakk> \<Longrightarrow> nvalid na (f z C m)"
    92           (C, m) \<in> ms; Ball A (nvalid na); Ball B (nvalid na)\<rbrakk> \<Longrightarrow> nvalid na (f z C m)"
    85 by blast
    93 by blast
    86 
    94 
    87 lemma hoare_sound_main: "A |\<turnstile> C \<Longrightarrow> A |\<Turnstile> C"
    95 lemma all_conjunct2: "\<forall>l. P' l \<and> P l \<Longrightarrow> \<forall>l. P l"
    88 apply (erule hoare.induct)
    96 by fast
    89 apply (simp_all only: cnvalid1_def2)
    97 
    90 apply clarsimp
    98 lemma all3_conjunct2: 
    91 apply clarsimp
    99   "\<forall>a p l. (P' a p l \<and> P a p l) \<Longrightarrow> \<forall>a p l. P a p l"
    92 apply (clarsimp split add: split_if_asm)
   100 by fast
    93 apply (clarsimp,tactic "smp_tac 1 1",erule(2) Loop_sound_lemma,(rule HOL.refl)+)
   101 
    94 apply clarsimp
   102 lemma cnvalid1_eq: 
    95 apply clarsimp
   103   "A |\<Turnstile> {(P,c,Q)} \<equiv> \<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t)"
    96 apply clarsimp
   104 by(simp add: cnvalids_def nvalids_def nvalid_def2)
    97 apply clarsimp
   105 
       
   106 lemma hoare_sound_main:"\<And>t. (A |\<turnstile> C \<longrightarrow> A |\<Turnstile> C) \<and> (A |\<turnstile>e t \<longrightarrow> A |\<Turnstile>e t)"
       
   107 apply (tactic "split_all_tac 1", rename_tac P e Q)
       
   108 apply (rule hoare_ehoare.induct)
       
   109 apply (tactic {* ALLGOALS (REPEAT o dresolve_tac [thm "all_conjunct2", thm "all3_conjunct2"]) *})
       
   110 apply (tactic {* ALLGOALS (REPEAT o thin_tac "?x :  hoare") *})
       
   111 apply (tactic {* ALLGOALS (REPEAT o thin_tac "?x : ehoare") *})
       
   112 apply (simp_all only: cnvalid1_eq cenvalid_def2)
       
   113 apply fast
       
   114 apply fast
       
   115 apply fast
       
   116 apply (clarify,tactic "smp_tac 1 1",erule(2) Loop_sound_lemma,(rule HOL.refl)+)
       
   117 apply fast
       
   118 apply fast
       
   119 apply fast
       
   120 apply fast
       
   121 apply fast
       
   122 apply fast
    98 apply (clarsimp del: Meth_elim_cases) (* Call *)
   123 apply (clarsimp del: Meth_elim_cases) (* Call *)
       
   124 apply (tactic "smp_tac 1 1", tactic "smp_tac 3 1", tactic "smp_tac 0 1")
       
   125 apply (tactic "smp_tac 2 1", tactic "smp_tac 3 1", tactic "smp_tac 0 1")
       
   126 apply (tactic "smp_tac 4 1", tactic "smp_tac 2 1", fast)
    99 apply (clarsimp del: Impl_elim_cases) (* Meth *)
   127 apply (clarsimp del: Impl_elim_cases) (* Meth *)
   100 defer
   128 defer
   101 apply blast (* Conseq *)
   129 prefer 4 apply blast (*  Conseq *)
       
   130 prefer 4 apply blast (* eConseq *)
   102 apply (simp_all (no_asm_use) only: cnvalids_def nvalids_def)
   131 apply (simp_all (no_asm_use) only: cnvalids_def nvalids_def)
   103 apply blast
   132 apply blast
   104 apply blast
   133 apply blast
   105 apply blast
   134 apply blast
   106 (* Impl *)
   135 (* Impl *)
   107 apply (erule thin_rl)
       
   108 apply (rule allI)
   136 apply (rule allI)
   109 apply (induct_tac "n")
   137 apply (induct_tac "n")
   110 apply  (clarify intro!: Impl_nvalid_0)
   138 apply  (clarify intro!: Impl_nvalid_0)
   111 apply (clarify  intro!: Impl_nvalid_Suc)
   139 apply (clarify  intro!: Impl_nvalid_Suc)
   112 apply (drule nvalids_SucD)
   140 apply (drule nvalids_SucD)
   114 apply (drule (4) Impl_sound_lemma)
   142 apply (drule (4) Impl_sound_lemma)
   115 done
   143 done
   116 
   144 
   117 theorem hoare_sound: "{} \<turnstile> {P} c {Q} \<Longrightarrow> \<Turnstile> {P} c {Q}"
   145 theorem hoare_sound: "{} \<turnstile> {P} c {Q} \<Longrightarrow> \<Turnstile> {P} c {Q}"
   118 apply (simp only: valid_def2)
   146 apply (simp only: valid_def2)
   119 apply (drule hoare_sound_main)
   147 apply (drule hoare_sound_main [THEN conjunct1, rule_format])
   120 apply (unfold cnvalids_def nvalids_def)
   148 apply (unfold cnvalids_def nvalids_def)
   121 apply fast
   149 apply fast
   122 done
   150 done
   123 
   151 
       
   152 theorem ehoare_sound: "{} \<turnstile>e {P} e {Q} \<Longrightarrow> \<Turnstile>e {P} e {Q}"
       
   153 apply (simp only: evalid_def2)
       
   154 apply (drule hoare_sound_main [THEN conjunct2, rule_format])
       
   155 apply (unfold cenvalid_def nvalids_def)
       
   156 apply fast
       
   157 done
       
   158 
   124 
   159 
   125 subsection "(Relative) Completeness"
   160 subsection "(Relative) Completeness"
   126 
   161 
   127 constdefs MGT    :: "stmt => state => triple"
   162 constdefs MGT    :: "stmt => state =>  triple"
   128          "MGT c z \<equiv> (\<lambda> s. z = s, c, %t. \<exists>n. z -c-n-> t)"
   163          "MGT c z \<equiv> (\<lambda>s. z = s, c, \<lambda>  t. \<exists>n. z -c-  n-> t)"
       
   164          eMGT    :: "expr => state => etriple"
       
   165         "eMGT e z \<equiv> (\<lambda>s. z = s, e, \<lambda>v t. \<exists>n. z -e>v-n-> t)"
   129 
   166 
   130 lemma MGF_implies_complete:
   167 lemma MGF_implies_complete:
   131  "\<forall>z. {} |\<turnstile> {MGT c z} \<Longrightarrow> \<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}"
   168  "\<forall>z. {} |\<turnstile> { MGT c z} \<Longrightarrow> \<Turnstile>  {P} c {Q} \<Longrightarrow> {} \<turnstile>  {P} c {Q}"
   132 apply (simp only: valid_def2)
   169 apply (simp only: valid_def2)
   133 apply (unfold MGT_def)
   170 apply (unfold MGT_def)
   134 apply (erule hoare.Conseq)
   171 apply (erule hoare_ehoare.Conseq)
   135 apply (clarsimp simp add: nvalid1_def2)
   172 apply (clarsimp simp add: nvalid_def2)
   136 done
   173 done
   137 
   174 
   138 
   175 lemma eMGF_implies_complete:
   139 declare exec.intros[intro!]
   176  "\<forall>z. {} |\<turnstile>e eMGT e z \<Longrightarrow> \<Turnstile>e {P} e {Q} \<Longrightarrow> {} \<turnstile>e {P} e {Q}"
       
   177 apply (simp only: evalid_def2)
       
   178 apply (unfold eMGT_def)
       
   179 apply (erule hoare_ehoare.eConseq)
       
   180 apply (clarsimp simp add: envalid_def2)
       
   181 done
       
   182 
       
   183 declare exec_eval.intros[intro!]
   140 
   184 
   141 lemma MGF_Loop: "\<forall>z. A \<turnstile> {op = z} c {\<lambda>t. \<exists>n. z -c-n\<rightarrow> t} \<Longrightarrow> 
   185 lemma MGF_Loop: "\<forall>z. A \<turnstile> {op = z} c {\<lambda>t. \<exists>n. z -c-n\<rightarrow> t} \<Longrightarrow> 
   142   A \<turnstile> {op = z} While (e) c {\<lambda>t. \<exists>n. z -While (e) c-n\<rightarrow> t}"
   186   A \<turnstile> {op = z} While (e) c {\<lambda>t. \<exists>n. z -While (e) c-n\<rightarrow> t}"
   143 apply (rule_tac P' = "\<lambda>z s. (z,s) \<in> ({(s,t). \<exists>n. s<e> \<noteq> Null \<and> s -c-n\<rightarrow> t})^*"
   187 apply (rule_tac P' = "\<lambda>z s. (z,s) \<in> ({(s,t). \<exists>n. s<e> \<noteq> Null \<and> s -c-n\<rightarrow> t})^*"
   144        in hoare.Conseq)
   188        in hoare_ehoare.Conseq)
   145 apply  (rule allI)
   189 apply  (rule allI)
   146 apply  (rule hoare.Loop)
   190 apply  (rule hoare_ehoare.Loop)
   147 apply  (erule hoare.Conseq)
   191 apply  (erule hoare_ehoare.Conseq)
   148 apply  clarsimp
   192 apply  clarsimp
   149 apply  (blast intro:rtrancl_into_rtrancl)
   193 apply  (blast intro:rtrancl_into_rtrancl)
   150 apply (erule thin_rl)
   194 apply (erule thin_rl)
   151 apply clarsimp
   195 apply clarsimp
   152 apply (erule_tac x = z in allE)
   196 apply (erule_tac x = z in allE)
   153 apply clarsimp
   197 apply clarsimp
   154 apply (erule converse_rtrancl_induct)
   198 apply (erule converse_rtrancl_induct)
   155 apply  blast
   199 apply  blast
   156 apply clarsimp
   200 apply clarsimp
   157 apply (drule (1) exec_max2)
   201 apply (drule (1) exec_exec_max)
   158 apply (blast del: exec_elim_cases)
   202 apply (blast del: exec_elim_cases)
   159 done
   203 done
   160 
   204 
   161 lemma MGF_lemma[rule_format]:
   205 lemma MGF_lemma: "\<forall>C m z. A |\<turnstile> {MGT (Impl C m) z} \<Longrightarrow> 
   162  "(\<forall>C m z. A |\<turnstile> {MGT (Impl C m) z}) \<longrightarrow> (\<forall>z. A |\<turnstile> {MGT c z})"
   206  (\<forall>z. A |\<turnstile> {MGT c z}) \<and> (\<forall>z. A |\<turnstile>e eMGT e z)"
   163 apply (simp add: MGT_def)
   207 apply (simp add: MGT_def eMGT_def)
   164 apply (induct_tac c)
   208 apply (rule stmt_expr.induct)
   165 apply (tactic "ALLGOALS Clarify_tac")
   209 apply (rule_tac [!] allI)
   166 
   210 
   167 apply (rule Conseq1 [OF hoare.Skip])
   211 apply (rule Conseq1 [OF hoare_ehoare.Skip])
   168 apply blast
   212 apply blast
   169 
   213 
   170 apply (rule hoare.Comp)
   214 apply (rule hoare_ehoare.Comp)
   171 apply  (erule spec)
   215 apply  (erule spec)
   172 apply (erule hoare.Conseq)
   216 apply (erule hoare_ehoare.Conseq)
       
   217 apply clarsimp
       
   218 apply (drule (1) exec_exec_max)
       
   219 apply blast
       
   220 
       
   221 apply (erule thin_rl)
       
   222 apply (rule hoare_ehoare.Cond)
       
   223 apply  (erule spec)
       
   224 apply (rule allI)
       
   225 apply (simp)
       
   226 apply (rule conjI)
       
   227 apply  (rule impI, erule hoare_ehoare.Conseq, clarsimp, drule (1) eval_exec_max,
       
   228         erule thin_rl, erule thin_rl, force)+
       
   229 
       
   230 apply (erule MGF_Loop)
       
   231 
       
   232 apply (erule hoare_ehoare.eConseq [THEN hoare_ehoare.LAss])
       
   233 apply fast
       
   234 
       
   235 apply (erule thin_rl)
       
   236 apply (rule_tac Q = "\<lambda>a s. \<exists>n. z -expr1\<succ>Addr a-n\<rightarrow> s" in hoare_ehoare.FAss)
       
   237 apply  (drule spec)
       
   238 apply  (erule eConseq2)
       
   239 apply  fast
       
   240 apply (rule allI)
       
   241 apply (erule hoare_ehoare.eConseq)
       
   242 apply clarsimp
       
   243 apply (drule (1) eval_eval_max)
       
   244 apply blast
       
   245 
       
   246 apply (rule hoare_ehoare.Meth)
       
   247 apply (rule allI)
       
   248 apply (drule spec, drule spec, erule hoare_ehoare.Conseq)
       
   249 apply blast
       
   250 
       
   251 apply blast
       
   252 
       
   253 apply (rule eConseq1 [OF hoare_ehoare.NewC])
       
   254 apply blast
       
   255 
       
   256 apply (erule hoare_ehoare.eConseq [THEN hoare_ehoare.Cast])
       
   257 apply fast
       
   258 
       
   259 apply (rule eConseq1 [OF hoare_ehoare.LAcc])
       
   260 apply blast
       
   261 
       
   262 apply (erule hoare_ehoare.eConseq [THEN hoare_ehoare.FAcc])
       
   263 apply fast
       
   264 
       
   265 apply (rule_tac R = "\<lambda>a v s. \<exists>n1 n2 t. z -expr1\<succ>a-n1\<rightarrow> t \<and> t -expr2\<succ>v-n2\<rightarrow> s" in
       
   266                 hoare_ehoare.Call)
       
   267 apply   (erule spec)
       
   268 apply  (rule allI)
       
   269 apply  (erule hoare_ehoare.eConseq)
       
   270 apply  clarsimp
       
   271 apply  blast
       
   272 apply (rule allI)+
       
   273 apply (rule hoare_ehoare.Meth)
       
   274 apply (rule allI)
       
   275 apply (drule spec, drule spec, erule hoare_ehoare.Conseq)
   173 apply (erule thin_rl, erule thin_rl)
   276 apply (erule thin_rl, erule thin_rl)
   174 apply clarsimp
   277 apply (clarsimp del: Impl_elim_cases)
   175 apply (drule (1) exec_max2)
   278 apply (drule (2) eval_eval_exec_max)
   176 apply blast
   279 apply (fast del: Impl_elim_cases)
   177 
       
   178 apply (rule hoare.Cond)
       
   179 apply  (erule hoare.Conseq)
       
   180 apply  (erule thin_rl, erule thin_rl)
       
   181 apply  force
       
   182 apply (erule hoare.Conseq)
       
   183 apply (erule thin_rl, erule thin_rl)
       
   184 apply force
       
   185 
       
   186 apply (erule MGF_Loop)
       
   187 
       
   188 apply (rule Conseq1 [OF hoare.NewC])
       
   189 apply blast
       
   190 
       
   191 apply (rule Conseq1 [OF hoare.Cast])
       
   192 apply blast
       
   193 
       
   194 apply (rule Conseq1 [OF hoare.FAcc])
       
   195 apply blast
       
   196 
       
   197 apply (rule Conseq1 [OF hoare.FAss])
       
   198 apply blast
       
   199 
       
   200 apply (rule hoare.Call)
       
   201 apply (rule allI)
       
   202 apply (rule hoare.Meth)
       
   203 apply (rule allI)
       
   204 apply (drule spec, drule spec, erule hoare.Conseq)
       
   205 apply blast
       
   206 
       
   207 apply (rule hoare.Meth)
       
   208 apply (rule allI)
       
   209 apply (drule spec, drule spec, erule hoare.Conseq)
       
   210 apply blast
       
   211 
       
   212 apply blast
       
   213 done
   280 done
   214 
   281 
   215 lemma MGF_Impl: "{} |\<turnstile> {MGT (Impl C m) z}"
   282 lemma MGF_Impl: "{} |\<turnstile> {MGT (Impl C m) z}"
   216 apply (unfold MGT_def)
   283 apply (unfold MGT_def)
   217 apply (rule Impl1)
   284 apply (rule Impl1)
   218 apply  (rule_tac [2] UNIV_I)
   285 apply  (rule_tac [2] UNIV_I)
   219 apply clarsimp
   286 apply clarsimp
   220 apply (rule hoare.ConjI)
   287 apply (rule hoare_ehoare.ConjI)
   221 apply clarsimp
   288 apply clarsimp
   222 apply (rule ssubst [OF Impl_body_eq])
   289 apply (rule ssubst [OF Impl_body_eq])
   223 apply (fold MGT_def)
   290 apply (fold MGT_def)
   224 apply (rule MGF_lemma)
   291 apply (rule MGF_lemma [THEN conjunct1, rule_format])
   225 apply (rule hoare.Asm)
   292 apply (rule hoare_ehoare.Asm)
   226 apply force
   293 apply force
   227 done
   294 done
   228 
   295 
   229 theorem hoare_relative_complete: "\<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}"
   296 theorem hoare_relative_complete: "\<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}"
   230 apply (rule MGF_implies_complete)
   297 apply (rule MGF_implies_complete)
   231 apply  (erule_tac [2] asm_rl)
   298 apply  (erule_tac [2] asm_rl)
   232 apply (rule allI)
   299 apply (rule allI)
   233 apply (rule MGF_lemma)
   300 apply (rule MGF_lemma [THEN conjunct1, rule_format])
   234 apply (rule MGF_Impl)
   301 apply (rule MGF_Impl)
   235 done
   302 done
   236 
   303 
       
   304 theorem ehoare_relative_complete: "\<Turnstile>e {P} e {Q} \<Longrightarrow> {} \<turnstile>e {P} e {Q}"
       
   305 apply (rule eMGF_implies_complete)
       
   306 apply  (erule_tac [2] asm_rl)
       
   307 apply (rule allI)
       
   308 apply (rule MGF_lemma [THEN conjunct2, rule_format])
       
   309 apply (rule MGF_Impl)
       
   310 done
       
   311 
   237 end
   312 end