|
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 |