src/HOL/IMP/Machines.thy
changeset 18372 2bffdf62fe7f
parent 16417 9bc16273c2d4
child 20217 25b068a99d2b
equal deleted inserted replaced
18371:d93fdf00f8a6 18372:2bffdf62fe7f
       
     1 
       
     2 (* $Id$ *)
       
     3 
     1 theory Machines imports Natural begin
     4 theory Machines imports Natural begin
     2 
     5 
     3 lemma rtrancl_eq: "R^* = Id \<union> (R O R^*)"
     6 lemma rtrancl_eq: "R^* = Id \<union> (R O R^*)"
     4 by(fast intro:rtrancl.intros elim:rtranclE)
     7   by (fast intro: rtrancl.intros elim: rtranclE)
     5 
     8 
     6 lemma converse_rtrancl_eq: "R^* = Id \<union> (R^* O R)"
     9 lemma converse_rtrancl_eq: "R^* = Id \<union> (R^* O R)"
     7 by(subst r_comp_rtrancl_eq[symmetric], rule rtrancl_eq)
    10   by (subst r_comp_rtrancl_eq[symmetric], rule rtrancl_eq)
     8 
    11 
     9 lemmas converse_rel_powE = rel_pow_E2
    12 lemmas converse_rel_powE = rel_pow_E2
    10 
    13 
    11 lemma R_O_Rn_commute: "R O R^n = R^n O R"
    14 lemma R_O_Rn_commute: "R O R^n = R^n O R"
    12 by(induct_tac n, simp, simp add: O_assoc[symmetric])
    15   by (induct n) (simp, simp add: O_assoc [symmetric])
    13 
    16 
    14 lemma converse_in_rel_pow_eq:
    17 lemma converse_in_rel_pow_eq:
    15 "((x,z) \<in> R^n) = (n=0 \<and> z=x \<or> (\<exists>m y. n = Suc m \<and> (x,y) \<in> R \<and> (y,z) \<in> R^m))"
    18   "((x,z) \<in> R^n) = (n=0 \<and> z=x \<or> (\<exists>m y. n = Suc m \<and> (x,y) \<in> R \<and> (y,z) \<in> R^m))"
    16 apply(rule iffI)
    19 apply(rule iffI)
    17  apply(blast elim:converse_rel_powE)
    20  apply(blast elim:converse_rel_powE)
    18 apply (fastsimp simp add:gr0_conv_Suc R_O_Rn_commute)
    21 apply (fastsimp simp add:gr0_conv_Suc R_O_Rn_commute)
    19 done
    22 done
    20 
    23 
    21 lemma rel_pow_plus: "R^(m+n) = R^n O R^m"
    24 lemma rel_pow_plus: "R^(m+n) = R^n O R^m"
    22 by(induct n, simp, simp add:O_assoc)
    25   by (induct n) (simp, simp add: O_assoc)
    23 
    26 
    24 lemma rel_pow_plusI: "\<lbrakk> (x,y) \<in> R^m; (y,z) \<in> R^n \<rbrakk> \<Longrightarrow> (x,z) \<in> R^(m+n)"
    27 lemma rel_pow_plusI: "\<lbrakk> (x,y) \<in> R^m; (y,z) \<in> R^n \<rbrakk> \<Longrightarrow> (x,z) \<in> R^(m+n)"
    25 by(simp add:rel_pow_plus rel_compI)
    28   by (simp add: rel_pow_plus rel_compI)
    26 
    29 
    27 subsection "Instructions"
    30 subsection "Instructions"
    28 
    31 
    29 text {* There are only three instructions: *}
    32 text {* There are only three instructions: *}
    30 datatype instr = SET loc aexp | JMPF bexp nat | JMPB nat
    33 datatype instr = SET loc aexp | JMPF bexp nat | JMPB nat
    31 
    34 
    32 types instrs = "instr list"
    35 types instrs = "instr list"
    33 
    36 
    34 subsection "M0 with PC"
    37 subsection "M0 with PC"
    35 
    38 
    36 consts  exec01 :: "instr list \<Rightarrow> ((nat\<times>state) \<times> (nat\<times>state))set" 
    39 consts  exec01 :: "instr list \<Rightarrow> ((nat\<times>state) \<times> (nat\<times>state))set"
    37 syntax
    40 syntax
    38   "_exec01" :: "[instrs, nat,state, nat,state] \<Rightarrow> bool"
    41   "_exec01" :: "[instrs, nat,state, nat,state] \<Rightarrow> bool"
    39                ("(_/ |- (1<_,/_>)/ -1-> (1<_,/_>))" [50,0,0,0,0] 50)
    42                ("(_/ |- (1<_,/_>)/ -1-> (1<_,/_>))" [50,0,0,0,0] 50)
    40   "_exec0s" :: "[instrs, nat,state, nat,state] \<Rightarrow> bool"
    43   "_exec0s" :: "[instrs, nat,state, nat,state] \<Rightarrow> bool"
    41                ("(_/ |- (1<_,/_>)/ -*-> (1<_,/_>))" [50,0,0,0,0] 50)
    44                ("(_/ |- (1<_,/_>)/ -*-> (1<_,/_>))" [50,0,0,0,0] 50)
    56   "_exec0s" :: "[instrs, nat,state, nat,state] \<Rightarrow> bool"
    59   "_exec0s" :: "[instrs, nat,state, nat,state] \<Rightarrow> bool"
    57                ("(_/ |- (1\<langle>_,/_\<rangle>)/ -*\<rightarrow> (1\<langle>_,/_\<rangle>))" [50,0,0,0,0] 50)
    60                ("(_/ |- (1\<langle>_,/_\<rangle>)/ -*\<rightarrow> (1\<langle>_,/_\<rangle>))" [50,0,0,0,0] 50)
    58   "_exec0n" :: "[instrs, nat,state, nat, nat,state] \<Rightarrow> bool"
    61   "_exec0n" :: "[instrs, nat,state, nat, nat,state] \<Rightarrow> bool"
    59                ("(_/ |- (1\<langle>_,/_\<rangle>)/ -_\<rightarrow> (1\<langle>_,/_\<rangle>))" [50,0,0,0,0] 50)
    62                ("(_/ |- (1\<langle>_,/_\<rangle>)/ -_\<rightarrow> (1\<langle>_,/_\<rangle>))" [50,0,0,0,0] 50)
    60 
    63 
    61 translations  
    64 translations
    62   "p \<turnstile> \<langle>i,s\<rangle> -1\<rightarrow> \<langle>j,t\<rangle>" == "((i,s),j,t) : (exec01 p)"
    65   "p \<turnstile> \<langle>i,s\<rangle> -1\<rightarrow> \<langle>j,t\<rangle>" == "((i,s),j,t) : (exec01 p)"
    63   "p \<turnstile> \<langle>i,s\<rangle> -*\<rightarrow> \<langle>j,t\<rangle>" == "((i,s),j,t) : (exec01 p)^*"
    66   "p \<turnstile> \<langle>i,s\<rangle> -*\<rightarrow> \<langle>j,t\<rangle>" == "((i,s),j,t) : (exec01 p)^*"
    64   "p \<turnstile> \<langle>i,s\<rangle> -n\<rightarrow> \<langle>j,t\<rangle>" == "((i,s),j,t) : (exec01 p)^n"
    67   "p \<turnstile> \<langle>i,s\<rangle> -n\<rightarrow> \<langle>j,t\<rangle>" == "((i,s),j,t) : (exec01 p)^n"
    65 
    68 
    66 inductive "exec01 P"
    69 inductive "exec01 P"
    95   "_stepa" :: "[instrs,instrs,state, instrs,instrs,state] \<Rightarrow> bool"
    98   "_stepa" :: "[instrs,instrs,state, instrs,instrs,state] \<Rightarrow> bool"
    96                ("((1\<langle>_,/_,/_\<rangle>)/ -*\<rightarrow> (1\<langle>_,/_,/_\<rangle>))" 50)
    99                ("((1\<langle>_,/_,/_\<rangle>)/ -*\<rightarrow> (1\<langle>_,/_,/_\<rangle>))" 50)
    97   "_stepan" :: "[instrs,instrs,state, nat, instrs,instrs,state] \<Rightarrow> bool"
   100   "_stepan" :: "[instrs,instrs,state, nat, instrs,instrs,state] \<Rightarrow> bool"
    98                ("((1\<langle>_,/_,/_\<rangle>)/ -_\<rightarrow> (1\<langle>_,/_,/_\<rangle>))" 50)
   101                ("((1\<langle>_,/_,/_\<rangle>)/ -_\<rightarrow> (1\<langle>_,/_,/_\<rangle>))" 50)
    99 
   102 
   100 translations  
   103 translations
   101   "\<langle>p,q,s\<rangle> -1\<rightarrow> \<langle>p',q',t\<rangle>" == "((p,q,s),p',q',t) : stepa1"
   104   "\<langle>p,q,s\<rangle> -1\<rightarrow> \<langle>p',q',t\<rangle>" == "((p,q,s),p',q',t) : stepa1"
   102   "\<langle>p,q,s\<rangle> -*\<rightarrow> \<langle>p',q',t\<rangle>" == "((p,q,s),p',q',t) : (stepa1^*)"
   105   "\<langle>p,q,s\<rangle> -*\<rightarrow> \<langle>p',q',t\<rangle>" == "((p,q,s),p',q',t) : (stepa1^*)"
   103   "\<langle>p,q,s\<rangle> -i\<rightarrow> \<langle>p',q',t\<rangle>" == "((p,q,s),p',q',t) : (stepa1^i)"
   106   "\<langle>p,q,s\<rangle> -i\<rightarrow> \<langle>p',q',t\<rangle>" == "((p,q,s),p',q',t) : (stepa1^i)"
   104 
   107 
   105 
   108 
   154 done
   157 done
   155 
   158 
   156 lemma direction1:
   159 lemma direction1:
   157  "\<langle>q,p,s\<rangle> -1\<rightarrow> \<langle>q',p',t\<rangle> \<Longrightarrow>
   160  "\<langle>q,p,s\<rangle> -1\<rightarrow> \<langle>q',p',t\<rangle> \<Longrightarrow>
   158   rev p' @ q' = rev p @ q \<and> rev p @ q \<turnstile> \<langle>size p,s\<rangle> -1\<rightarrow> \<langle>size p',t\<rangle>"
   161   rev p' @ q' = rev p @ q \<and> rev p @ q \<turnstile> \<langle>size p,s\<rangle> -1\<rightarrow> \<langle>size p',t\<rangle>"
   159 apply(erule stepa1.induct)
   162 apply(induct set: stepa1)
   160    apply(simp add:exec01.SET)
   163    apply(simp add:exec01.SET)
   161   apply(fastsimp intro:exec01.JMPFT)
   164   apply(fastsimp intro:exec01.JMPFT)
   162  apply simp
   165  apply simp
   163  apply(rule exec01.JMPFF)
   166  apply(rule exec01.JMPFF)
   164      apply simp
   167      apply simp
   185 apply simp_all
   188 apply simp_all
   186 done
   189 done
   187 *)
   190 *)
   188 lemma direction2:
   191 lemma direction2:
   189  "rpq \<turnstile> \<langle>sp,s\<rangle> -1\<rightarrow> \<langle>sp',t\<rangle> \<Longrightarrow>
   192  "rpq \<turnstile> \<langle>sp,s\<rangle> -1\<rightarrow> \<langle>sp',t\<rangle> \<Longrightarrow>
   190  \<forall>p q p' q'. rpq = rev p @ q & sp = size p & sp' = size p' \<longrightarrow>
   193   rpq = rev p @ q & sp = size p & sp' = size p' \<longrightarrow>
   191           rev p' @ q' = rev p @ q \<longrightarrow> \<langle>q,p,s\<rangle> -1\<rightarrow> \<langle>q',p',t\<rangle>"
   194           rev p' @ q' = rev p @ q \<longrightarrow> \<langle>q,p,s\<rangle> -1\<rightarrow> \<langle>q',p',t\<rangle>"
   192 apply(erule exec01.induct)
   195 apply(induct fixing: p q p' q' set: exec01)
   193    apply(clarsimp simp add: neq_Nil_conv append_eq_conv_conj)
   196    apply(clarsimp simp add: neq_Nil_conv append_eq_conv_conj)
   194    apply(drule sym)
   197    apply(drule sym)
   195    apply simp
   198    apply simp
   196    apply(rule rev_revD)
   199    apply(rule rev_revD)
   197    apply simp
   200    apply simp
   214 
   217 
   215 
   218 
   216 theorem M_eqiv:
   219 theorem M_eqiv:
   217 "(\<langle>q,p,s\<rangle> -1\<rightarrow> \<langle>q',p',t\<rangle>) =
   220 "(\<langle>q,p,s\<rangle> -1\<rightarrow> \<langle>q',p',t\<rangle>) =
   218  (rev p' @ q' = rev p @ q \<and> rev p @ q \<turnstile> \<langle>size p,s\<rangle> -1\<rightarrow> \<langle>size p',t\<rangle>)"
   221  (rev p' @ q' = rev p @ q \<and> rev p @ q \<turnstile> \<langle>size p,s\<rangle> -1\<rightarrow> \<langle>size p',t\<rangle>)"
   219 by(fast dest:direction1 direction2)
   222   by (blast dest: direction1 direction2)
   220 
   223 
   221 end
   224 end