changeset 80138 | a30a1385f7d0 |
parent 74101 | d804e93ae9ff |
child 80139 | fec5a23017b5 |
80137:0c51e0a6bc37 | 80138:a30a1385f7d0 |
---|---|
1 theory Class1 |
1 theory Class1 |
2 imports "HOL-Nominal.Nominal" |
2 imports "HOL-Nominal.Nominal" |
3 begin |
3 begin |
4 |
4 |
5 section \<open>Term-Calculus from Urban's PhD\<close> |
5 section \<open>Term-Calculus from Urban's PhD\<close> |
6 |
6 |
7 atom_decl name coname |
7 atom_decl name coname |
42 fixes a::"coname" |
42 fixes a::"coname" |
43 and x::"name" |
43 and x::"name" |
44 and T::"ty" |
44 and T::"ty" |
45 shows "a\<sharp>T" and "x\<sharp>T" |
45 shows "a\<sharp>T" and "x\<sharp>T" |
46 by (nominal_induct T rule: ty.strong_induct) |
46 by (nominal_induct T rule: ty.strong_induct) |
47 (auto simp add: fresh_string) |
47 (auto simp: fresh_string) |
48 |
48 |
49 text \<open>terms\<close> |
49 text \<open>terms\<close> |
50 |
50 |
51 nominal_datatype trm = |
51 nominal_datatype trm = |
52 Ax "name" "coname" |
52 Ax "name" "coname" |
53 | Cut "\<guillemotleft>coname\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm" ("Cut <_>._ (_)._" [100,100,100,100] 100) |
53 | Cut "\<guillemotleft>coname\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm" ("Cut <_>._ (_)._" [100,100,100,100] 100) |
54 | NotR "\<guillemotleft>name\<guillemotright>trm" "coname" ("NotR (_)._ _" [100,100,100] 100) |
54 | NotR "\<guillemotleft>name\<guillemotright>trm" "coname" ("NotR (_)._ _" [100,100,100] 100) |
87 | "a\<sharp>(d,e,b) \<Longrightarrow> (OrR2 <a>.M b)[d\<turnstile>c>e] = (if b=d then OrR2 <a>.(M[d\<turnstile>c>e]) e else OrR2 <a>.(M[d\<turnstile>c>e]) b)" |
87 | "a\<sharp>(d,e,b) \<Longrightarrow> (OrR2 <a>.M b)[d\<turnstile>c>e] = (if b=d then OrR2 <a>.(M[d\<turnstile>c>e]) e else OrR2 <a>.(M[d\<turnstile>c>e]) b)" |
88 | "\<lbrakk>x\<sharp>(N,z);y\<sharp>(M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[d\<turnstile>c>e] = OrL (x).(M[d\<turnstile>c>e]) (y).(N[d\<turnstile>c>e]) z" |
88 | "\<lbrakk>x\<sharp>(N,z);y\<sharp>(M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[d\<turnstile>c>e] = OrL (x).(M[d\<turnstile>c>e]) (y).(N[d\<turnstile>c>e]) z" |
89 | "a\<sharp>(d,e,b) \<Longrightarrow> (ImpR (x).<a>.M b)[d\<turnstile>c>e] = |
89 | "a\<sharp>(d,e,b) \<Longrightarrow> (ImpR (x).<a>.M b)[d\<turnstile>c>e] = |
90 (if b=d then ImpR (x).<a>.(M[d\<turnstile>c>e]) e else ImpR (x).<a>.(M[d\<turnstile>c>e]) b)" |
90 (if b=d then ImpR (x).<a>.(M[d\<turnstile>c>e]) e else ImpR (x).<a>.(M[d\<turnstile>c>e]) b)" |
91 | "\<lbrakk>a\<sharp>(d,e,N);x\<sharp>(M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[d\<turnstile>c>e] = ImpL <a>.(M[d\<turnstile>c>e]) (x).(N[d\<turnstile>c>e]) y" |
91 | "\<lbrakk>a\<sharp>(d,e,N);x\<sharp>(M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[d\<turnstile>c>e] = ImpL <a>.(M[d\<turnstile>c>e]) (x).(N[d\<turnstile>c>e]) y" |
92 apply(finite_guess)+ |
92 by(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess)+ |
93 apply(rule TrueI)+ |
|
94 apply(simp add: abs_fresh abs_supp fin_supp)+ |
|
95 apply(fresh_guess)+ |
|
96 done |
|
97 |
93 |
98 nominal_primrec (freshness_context: "(u::name,v::name)") |
94 nominal_primrec (freshness_context: "(u::name,v::name)") |
99 nrename :: "trm \<Rightarrow> name \<Rightarrow> name \<Rightarrow> trm" ("_[_\<turnstile>n>_]" [100,100,100] 100) |
95 nrename :: "trm \<Rightarrow> name \<Rightarrow> name \<Rightarrow> trm" ("_[_\<turnstile>n>_]" [100,100,100] 100) |
100 where |
96 where |
101 "(Ax x a)[u\<turnstile>n>v] = (if x=u then Ax v a else Ax x a)" |
97 "(Ax x a)[u\<turnstile>n>v] = (if x=u then Ax v a else Ax x a)" |
110 | "\<lbrakk>x\<sharp>(u,v,N,z);y\<sharp>(u,v,M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[u\<turnstile>n>v] = |
106 | "\<lbrakk>x\<sharp>(u,v,N,z);y\<sharp>(u,v,M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[u\<turnstile>n>v] = |
111 (if z=u then OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) v else OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) z)" |
107 (if z=u then OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) v else OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) z)" |
112 | "\<lbrakk>a\<sharp>b; x\<sharp>(u,v)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b)[u\<turnstile>n>v] = ImpR (x).<a>.(M[u\<turnstile>n>v]) b" |
108 | "\<lbrakk>a\<sharp>b; x\<sharp>(u,v)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b)[u\<turnstile>n>v] = ImpR (x).<a>.(M[u\<turnstile>n>v]) b" |
113 | "\<lbrakk>a\<sharp>N;x\<sharp>(u,v,M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[u\<turnstile>n>v] = |
109 | "\<lbrakk>a\<sharp>N;x\<sharp>(u,v,M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[u\<turnstile>n>v] = |
114 (if y=u then ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) v else ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) y)" |
110 (if y=u then ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) v else ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) y)" |
115 apply(finite_guess)+ |
111 by(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess)+ |
116 apply(rule TrueI)+ |
|
117 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+ |
|
118 apply(fresh_guess)+ |
|
119 done |
|
120 |
112 |
121 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst] |
113 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst] |
122 |
114 |
123 lemma crename_name_eqvt[eqvt]: |
115 lemma crename_name_eqvt[eqvt]: |
124 fixes pi::"name prm" |
116 fixes pi::"name prm" |
125 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
117 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
126 apply(nominal_induct M avoiding: d e rule: trm.strong_induct) |
118 by (nominal_induct M avoiding: d e rule: trm.strong_induct) (auto simp: fresh_bij eq_bij) |
127 apply(auto simp add: fresh_bij eq_bij) |
|
128 done |
|
129 |
119 |
130 lemma crename_coname_eqvt[eqvt]: |
120 lemma crename_coname_eqvt[eqvt]: |
131 fixes pi::"coname prm" |
121 fixes pi::"coname prm" |
132 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
122 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
133 apply(nominal_induct M avoiding: d e rule: trm.strong_induct) |
123 by (nominal_induct M avoiding: d e rule: trm.strong_induct)(auto simp: fresh_bij eq_bij) |
134 apply(auto simp add: fresh_bij eq_bij) |
|
135 done |
|
136 |
124 |
137 lemma nrename_name_eqvt[eqvt]: |
125 lemma nrename_name_eqvt[eqvt]: |
138 fixes pi::"name prm" |
126 fixes pi::"name prm" |
139 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
127 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
140 apply(nominal_induct M avoiding: x y rule: trm.strong_induct) |
128 by(nominal_induct M avoiding: x y rule: trm.strong_induct) (auto simp: fresh_bij eq_bij) |
141 apply(auto simp add: fresh_bij eq_bij) |
|
142 done |
|
143 |
129 |
144 lemma nrename_coname_eqvt[eqvt]: |
130 lemma nrename_coname_eqvt[eqvt]: |
145 fixes pi::"coname prm" |
131 fixes pi::"coname prm" |
146 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
132 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
147 apply(nominal_induct M avoiding: x y rule: trm.strong_induct) |
133 by(nominal_induct M avoiding: x y rule: trm.strong_induct)(auto simp: fresh_bij eq_bij) |
148 apply(auto simp add: fresh_bij eq_bij) |
|
149 done |
|
150 |
134 |
151 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt |
135 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt |
152 nrename_name_eqvt nrename_coname_eqvt |
136 nrename_name_eqvt nrename_coname_eqvt |
153 lemma nrename_fresh: |
137 lemma nrename_fresh: |
154 assumes a: "x\<sharp>M" |
138 assumes a: "x\<sharp>M" |
155 shows "M[x\<turnstile>n>y] = M" |
139 shows "M[x\<turnstile>n>y] = M" |
156 using a |
140 using a |
157 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
141 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
158 (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp) |
142 (auto simp: trm.inject fresh_atm abs_fresh fin_supp abs_supp) |
159 |
143 |
160 lemma crename_fresh: |
144 lemma crename_fresh: |
161 assumes a: "a\<sharp>M" |
145 assumes a: "a\<sharp>M" |
162 shows "M[a\<turnstile>c>b] = M" |
146 shows "M[a\<turnstile>c>b] = M" |
163 using a |
147 using a |
164 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
148 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
165 (auto simp add: trm.inject fresh_atm abs_fresh) |
149 (auto simp: trm.inject fresh_atm abs_fresh) |
166 |
150 |
167 lemma nrename_nfresh: |
151 lemma nrename_nfresh: |
168 fixes x::"name" |
152 fixes x::"name" |
169 shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]" |
153 shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]" |
170 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
154 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
171 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
155 (auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
172 |
156 |
173 lemma crename_nfresh: |
157 lemma crename_nfresh: |
174 fixes x::"name" |
158 fixes x::"name" |
175 shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]" |
159 shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]" |
176 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
160 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
177 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
161 (auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
178 |
162 |
179 lemma crename_cfresh: |
163 lemma crename_cfresh: |
180 fixes a::"coname" |
164 fixes a::"coname" |
181 shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]" |
165 shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]" |
182 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
166 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
183 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
167 (auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
184 |
168 |
185 lemma nrename_cfresh: |
169 lemma nrename_cfresh: |
186 fixes c::"coname" |
170 fixes c::"coname" |
187 shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]" |
171 shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]" |
188 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
172 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
189 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
173 (auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
190 |
174 |
191 lemma nrename_nfresh': |
175 lemma nrename_nfresh': |
192 fixes x::"name" |
176 fixes x::"name" |
193 shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]" |
177 shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]" |
194 by (nominal_induct M avoiding: x z y rule: trm.strong_induct) |
178 by (nominal_induct M avoiding: x z y rule: trm.strong_induct) |
195 (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
179 (auto simp: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
196 |
180 |
197 lemma crename_cfresh': |
181 lemma crename_cfresh': |
198 fixes a::"coname" |
182 fixes a::"coname" |
199 shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]" |
183 shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]" |
200 by (nominal_induct M avoiding: a b c rule: trm.strong_induct) |
184 by (nominal_induct M avoiding: a b c rule: trm.strong_induct) |
201 (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
185 (auto simp: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
202 |
186 |
203 lemma nrename_rename: |
187 lemma nrename_rename: |
204 assumes a: "x'\<sharp>M" |
188 assumes a: "x'\<sharp>M" |
205 shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]" |
189 shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]" |
206 using a |
190 using a |
207 apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct) |
191 apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct) |
208 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
192 apply(auto simp: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
209 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) |
193 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm) |
210 done |
194 done |
211 |
195 |
212 lemma crename_rename: |
196 lemma crename_rename: |
213 assumes a: "a'\<sharp>M" |
197 assumes a: "a'\<sharp>M" |
214 shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]" |
198 shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]" |
215 using a |
199 using a |
216 apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct) |
200 apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct) |
217 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
201 apply(auto simp: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
218 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) |
202 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm) |
219 done |
203 done |
220 |
204 |
221 lemmas rename_fresh = nrename_fresh crename_fresh |
205 lemmas rename_fresh = nrename_fresh crename_fresh |
222 nrename_nfresh crename_nfresh crename_cfresh nrename_cfresh |
206 nrename_nfresh crename_nfresh crename_cfresh nrename_cfresh |
223 nrename_nfresh' crename_cfresh' |
207 nrename_nfresh' crename_cfresh' |
228 shows "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" |
212 shows "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" |
229 proof - |
213 proof - |
230 obtain x'::"name" where fs1: "x'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(1), rule fin_supp, blast) |
214 obtain x'::"name" where fs1: "x'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(1), rule fin_supp, blast) |
231 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(2), rule fin_supp, blast) |
215 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(2), rule fin_supp, blast) |
232 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
216 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
233 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
217 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
234 have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[u\<turnstile>n>v] = |
218 have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[u\<turnstile>n>v] = |
235 Cut <a'>.(([(a',a)]\<bullet>M)[u\<turnstile>n>v]) (x').(([(x',x)]\<bullet>N)[u\<turnstile>n>v])" |
219 Cut <a'>.(([(a',a)]\<bullet>M)[u\<turnstile>n>v]) (x').(([(x',x)]\<bullet>N)[u\<turnstile>n>v])" |
236 using fs1 fs2 |
220 using fs1 fs2 |
237 apply - |
221 by (intro nrename.simps; simp add: fresh_left calc_atm) |
238 apply(rule nrename.simps) |
|
239 apply(simp add: fresh_left calc_atm) |
|
240 apply(simp add: fresh_left calc_atm) |
|
241 done |
|
242 also have "\<dots> = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using fs1 fs2 a |
222 also have "\<dots> = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using fs1 fs2 a |
243 apply - |
223 by(simp add: trm.inject alpha fresh_prod rename_eqvts calc_atm rename_fresh fresh_atm) |
244 apply(simp add: trm.inject alpha fresh_atm fresh_prod rename_eqvts) |
|
245 apply(simp add: calc_atm) |
|
246 apply(simp add: rename_fresh fresh_atm) |
|
247 done |
|
248 finally show "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using eq1 |
224 finally show "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using eq1 |
249 by simp |
225 by simp |
250 qed |
226 qed |
251 |
227 |
252 lemma better_crename_Cut: |
228 lemma better_crename_Cut: |
254 shows "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" |
230 shows "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" |
255 proof - |
231 proof - |
256 obtain x'::"name" where fs1: "x'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(1), rule fin_supp, blast) |
232 obtain x'::"name" where fs1: "x'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(1), rule fin_supp, blast) |
257 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) |
233 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) |
258 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
234 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
259 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
235 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
260 have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[b\<turnstile>c>c] = |
236 have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[b\<turnstile>c>c] = |
261 Cut <a'>.(([(a',a)]\<bullet>M)[b\<turnstile>c>c]) (x').(([(x',x)]\<bullet>N)[b\<turnstile>c>c])" |
237 Cut <a'>.(([(a',a)]\<bullet>M)[b\<turnstile>c>c]) (x').(([(x',x)]\<bullet>N)[b\<turnstile>c>c])" |
262 using fs1 fs2 |
238 using fs1 fs2 |
263 apply - |
239 by (intro crename.simps; simp add: fresh_left calc_atm) |
264 apply(rule crename.simps) |
|
265 apply(simp add: fresh_left calc_atm) |
|
266 apply(simp add: fresh_left calc_atm) |
|
267 done |
|
268 also have "\<dots> = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using fs1 fs2 a |
240 also have "\<dots> = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using fs1 fs2 a |
269 apply - |
241 by(simp add: trm.inject alpha calc_atm rename_fresh fresh_atm fresh_prod rename_eqvts) |
270 apply(simp add: trm.inject alpha fresh_atm fresh_prod rename_eqvts) |
|
271 apply(simp add: calc_atm) |
|
272 apply(simp add: rename_fresh fresh_atm) |
|
273 done |
|
274 finally show "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using eq1 |
242 finally show "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using eq1 |
275 by simp |
243 by simp |
276 qed |
244 qed |
277 |
245 |
278 lemma crename_id: |
246 lemma crename_id: |
315 fixes c::"coname" |
283 fixes c::"coname" |
316 and pi::"coname prm" |
284 and pi::"coname prm" |
317 and M::"trm" |
285 and M::"trm" |
318 assumes a: "c\<sharp>pi" "c\<sharp>M" |
286 assumes a: "c\<sharp>pi" "c\<sharp>M" |
319 shows "c\<sharp>(pi\<bullet>M)" |
287 shows "c\<sharp>(pi\<bullet>M)" |
320 using a |
288 by (simp add: assms fresh_perm_app) |
321 apply - |
|
322 apply(simp add: fresh_left) |
|
323 apply(simp add: at_prm_fresh[OF at_coname_inst] fresh_list_rev) |
|
324 done |
|
325 |
289 |
326 lemma fresh_perm_name: |
290 lemma fresh_perm_name: |
327 fixes x::"name" |
291 fixes x::"name" |
328 and pi::"name prm" |
292 and pi::"name prm" |
329 and M::"trm" |
293 and M::"trm" |
330 assumes a: "x\<sharp>pi" "x\<sharp>M" |
294 assumes a: "x\<sharp>pi" "x\<sharp>M" |
331 shows "x\<sharp>(pi\<bullet>M)" |
295 shows "x\<sharp>(pi\<bullet>M)" |
332 using a |
296 by (simp add: assms fresh_perm_app) |
333 apply - |
|
334 apply(simp add: fresh_left) |
|
335 apply(simp add: at_prm_fresh[OF at_name_inst] fresh_list_rev) |
|
336 done |
|
337 |
297 |
338 lemma fresh_fun_simp_NotL: |
298 lemma fresh_fun_simp_NotL: |
339 assumes a: "x'\<sharp>P" "x'\<sharp>M" |
299 assumes a: "x'\<sharp>P" "x'\<sharp>M" |
340 shows "fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x') = Cut <c>.P (x').NotL <a>.M x'" |
300 shows "fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x') = Cut <c>.P (x').NotL <a>.M x'" |
341 using a |
301 proof (rule fresh_fun_app) |
342 apply - |
302 show "pt (TYPE(trm)::trm itself) (TYPE(name)::name itself)" |
343 apply(rule fresh_fun_app) |
303 by(rule pt_name_inst) |
344 apply(rule pt_name_inst) |
304 show "at (TYPE(name)::name itself)" |
345 apply(rule at_name_inst) |
305 by(rule at_name_inst) |
346 apply(finite_guess) |
306 show "finite (supp (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')::name set)" |
347 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,a,M)") |
307 using a by(finite_guess) |
348 apply(erule exE) |
308 obtain n::name where n: "n\<sharp>(c,P,a,M)" |
349 apply(rule_tac x="n" in exI) |
309 by (metis assms fresh_atm(3) fresh_prod) |
350 apply(simp add: fresh_prod abs_fresh) |
310 with assms |
351 apply(fresh_guess) |
311 show "\<exists>b. b \<sharp> (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x', Cut <c>.P (b).NotL <a>.M b)" |
352 apply(rule exists_fresh') |
312 apply(intro exI [where x="n"]) |
353 apply(simp add: fin_supp) |
313 apply(simp add: fresh_prod abs_fresh) |
354 apply(fresh_guess) |
314 apply(fresh_guess) |
355 done |
315 done |
316 show "x' \<sharp> (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')" |
|
317 using assms by(fresh_guess) |
|
318 qed |
|
356 |
319 |
357 lemma fresh_fun_NotL[eqvt_force]: |
320 lemma fresh_fun_NotL[eqvt_force]: |
358 fixes pi1::"name prm" |
321 fixes pi1::"name prm" |
359 and pi2::"coname prm" |
322 and pi2::"coname prm" |
360 shows "pi1\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')= |
323 shows "pi1\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')= |
361 fresh_fun (pi1\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))" |
324 fresh_fun (pi1\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))" |
362 and "pi2\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')= |
325 and "pi2\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')= |
363 fresh_fun (pi2\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))" |
326 fresh_fun (pi2\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))" |
364 apply - |
327 apply(perm_simp) |
365 apply(perm_simp) |
328 apply(generate_fresh "name") |
366 apply(generate_fresh "name") |
329 apply(auto simp: fresh_prod fresh_fun_simp_NotL) |
367 apply(auto simp add: fresh_prod) |
330 apply(rule sym) |
368 apply(simp add: fresh_fun_simp_NotL) |
331 apply(rule trans) |
369 apply(rule sym) |
332 apply(rule fresh_fun_simp_NotL) |
370 apply(rule trans) |
333 apply(blast intro: fresh_perm_name) |
371 apply(rule fresh_fun_simp_NotL) |
334 apply(metis fresh_perm_name) |
372 apply(rule fresh_perm_name) |
335 apply(simp add: at_prm_fresh[OF at_name_inst] swap_simps) |
373 apply(assumption) |
336 |
374 apply(assumption) |
337 apply(perm_simp) |
375 apply(rule fresh_perm_name) |
338 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)") |
376 apply(assumption) |
339 apply (metis fresh_fun_simp_NotL fresh_prodD swap_simps(8) trm.perm(14) trm.perm(16)) |
377 apply(assumption) |
340 by (meson exists_fresh(1) fs_name1) |
378 apply(simp add: at_prm_fresh[OF at_name_inst] swap_simps) |
|
379 apply(perm_simp) |
|
380 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)") |
|
381 apply(simp add: fresh_prod) |
|
382 apply(auto) |
|
383 apply(simp add: fresh_fun_simp_NotL calc_atm) |
|
384 apply(rule exists_fresh') |
|
385 apply(simp add: fin_supp) |
|
386 done |
|
387 |
341 |
388 lemma fresh_fun_simp_AndL1: |
342 lemma fresh_fun_simp_AndL1: |
389 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x" |
343 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x" |
390 shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z') = Cut <c>.P (z').AndL1 (x).M z'" |
344 shows "fresh_fun (\<lambda>z'. Cut <c>.P(z').AndL1 (x).M z') = Cut <c>.P (z').AndL1 (x).M z'" |
391 using a |
345 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) |
392 apply - |
346 obtain n::name where "n\<sharp>(c,P,x,M)" |
393 apply(rule fresh_fun_app) |
347 by (meson exists_fresh(1) fs_name1) |
394 apply(rule pt_name_inst) |
348 then show "\<exists>a. a \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL1 x. M z', Cut <c>.P(a).AndL1 x. M a)" |
395 apply(rule at_name_inst) |
349 apply(intro exI [where x="n"]) |
396 apply(finite_guess) |
350 apply(simp add: fresh_prod abs_fresh) |
397 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M)") |
351 apply(fresh_guess) |
398 apply(erule exE) |
352 done |
399 apply(rule_tac x="n" in exI) |
353 next |
400 apply(simp add: fresh_prod abs_fresh) |
354 show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL1 x. M z')" |
401 apply(fresh_guess) |
355 using a by(fresh_guess) |
402 apply(rule exists_fresh') |
356 qed finite_guess |
403 apply(simp add: fin_supp) |
|
404 apply(fresh_guess) |
|
405 done |
|
406 |
357 |
407 lemma fresh_fun_AndL1[eqvt_force]: |
358 lemma fresh_fun_AndL1[eqvt_force]: |
408 fixes pi1::"name prm" |
359 fixes pi1::"name prm" |
409 and pi2::"coname prm" |
360 and pi2::"coname prm" |
410 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')= |
361 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')= |
411 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))" |
362 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))" |
412 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')= |
363 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')= |
413 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))" |
364 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))" |
414 apply - |
|
415 apply(perm_simp) |
365 apply(perm_simp) |
416 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)") |
366 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)") |
417 apply(simp add: fresh_prod) |
367 apply(force simp add: fresh_prod fresh_fun_simp_AndL1 at_prm_fresh[OF at_name_inst] swap_simps) |
418 apply(auto) |
368 apply (meson exists_fresh(1) fs_name1) |
419 apply(simp add: fresh_fun_simp_AndL1 at_prm_fresh[OF at_name_inst] swap_simps) |
|
420 apply(rule exists_fresh') |
|
421 apply(simp add: fin_supp) |
|
422 apply(perm_simp) |
369 apply(perm_simp) |
423 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)") |
370 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)") |
424 apply(simp add: fresh_prod) |
371 apply(force simp add: fresh_prod fresh_fun_simp_AndL1 calc_atm) |
425 apply(auto) |
372 by (meson exists_fresh'(1) fs_name1) |
426 apply(simp add: fresh_fun_simp_AndL1 calc_atm) |
|
427 apply(rule exists_fresh') |
|
428 apply(simp add: fin_supp) |
|
429 done |
|
430 |
373 |
431 lemma fresh_fun_simp_AndL2: |
374 lemma fresh_fun_simp_AndL2: |
432 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x" |
375 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x" |
433 shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z') = Cut <c>.P (z').AndL2 (x).M z'" |
376 shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z') = Cut <c>.P (z').AndL2 (x).M z'" |
434 using a |
377 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) |
435 apply - |
378 obtain n::name where "n\<sharp>(c,P,x,M)" |
436 apply(rule fresh_fun_app) |
379 by (meson exists_fresh(1) fs_name1) |
437 apply(rule pt_name_inst) |
380 then show "\<exists>a. a \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL2 x. M z', Cut <c>.P(a).AndL2 x. M a)" |
438 apply(rule at_name_inst) |
381 apply(intro exI [where x="n"]) |
439 apply(finite_guess) |
382 apply(simp add: fresh_prod abs_fresh) |
440 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M)") |
383 apply(fresh_guess) |
441 apply(erule exE) |
384 done |
442 apply(rule_tac x="n" in exI) |
385 next |
443 apply(simp add: fresh_prod abs_fresh) |
386 show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL2 x. M z')" |
444 apply(fresh_guess) |
387 using a by(fresh_guess) |
445 apply(rule exists_fresh') |
388 qed finite_guess |
446 apply(simp add: fin_supp) |
|
447 apply(fresh_guess) |
|
448 done |
|
449 |
389 |
450 lemma fresh_fun_AndL2[eqvt_force]: |
390 lemma fresh_fun_AndL2[eqvt_force]: |
451 fixes pi1::"name prm" |
391 fixes pi1::"name prm" |
452 and pi2::"coname prm" |
392 and pi2::"coname prm" |
453 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')= |
393 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')= |
454 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))" |
394 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))" |
455 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')= |
395 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')= |
456 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))" |
396 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))" |
457 apply - |
397 apply(perm_simp) |
458 apply(perm_simp) |
398 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)") |
459 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)") |
399 apply(force simp add: fresh_prod fresh_fun_simp_AndL2 at_prm_fresh[OF at_name_inst] swap_simps) |
460 apply(simp add: fresh_prod) |
400 apply (meson exists_fresh(1) fs_name1) |
461 apply(auto) |
401 apply(perm_simp) |
462 apply(simp add: fresh_fun_simp_AndL2 at_prm_fresh[OF at_name_inst] swap_simps) |
402 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)") |
463 apply(rule exists_fresh') |
403 apply(force simp add: fresh_prod fresh_fun_simp_AndL2 calc_atm) |
464 apply(simp add: fin_supp) |
404 by (meson exists_fresh(1) fs_name1) |
465 apply(perm_simp) |
|
466 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)") |
|
467 apply(simp add: fresh_prod) |
|
468 apply(auto) |
|
469 apply(simp add: fresh_fun_simp_AndL2 calc_atm) |
|
470 apply(rule exists_fresh') |
|
471 apply(simp add: fin_supp) |
|
472 done |
|
473 |
405 |
474 lemma fresh_fun_simp_OrL: |
406 lemma fresh_fun_simp_OrL: |
475 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>u" "z'\<sharp>x" |
407 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>u" "z'\<sharp>x" |
476 shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z') = Cut <c>.P (z').OrL (x).M (u).N z'" |
408 shows "fresh_fun (\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N z') = Cut <c>.P (z').OrL (x).M (u).N z'" |
477 using a |
409 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) |
478 apply - |
410 obtain n::name where "n\<sharp>(c,P,x,M,u,N)" |
479 apply(rule fresh_fun_app) |
411 by (meson exists_fresh(1) fs_name1) |
480 apply(rule pt_name_inst) |
412 then show "\<exists>a. a \<sharp> (\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N(z'), Cut <c>.P(a).OrL(x).M(u).N(a))" |
481 apply(rule at_name_inst) |
413 apply(intro exI [where x="n"]) |
482 apply(finite_guess) |
414 apply(simp add: fresh_prod abs_fresh) |
483 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M,u,N)") |
415 apply(fresh_guess) |
484 apply(erule exE) |
416 done |
485 apply(rule_tac x="n" in exI) |
417 next |
486 apply(simp add: fresh_prod abs_fresh) |
418 show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N(z'))" |
487 apply(fresh_guess) |
419 using a by(fresh_guess) |
488 apply(rule exists_fresh') |
420 qed finite_guess |
489 apply(simp add: fin_supp) |
|
490 apply(fresh_guess) |
|
491 done |
|
492 |
421 |
493 lemma fresh_fun_OrL[eqvt_force]: |
422 lemma fresh_fun_OrL[eqvt_force]: |
494 fixes pi1::"name prm" |
423 fixes pi1::"name prm" |
495 and pi2::"coname prm" |
424 and pi2::"coname prm" |
496 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z')= |
425 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P(z').OrL (x).M(u).N z')= |
497 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z'))" |
426 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').OrL(x).M (u).N z'))" |
498 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z')= |
427 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P(z').OrL (x).M(u).N z')= |
499 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z'))" |
428 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N z'))" |
500 apply - |
429 apply(perm_simp) |
501 apply(perm_simp) |
430 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1\<bullet>u,pi1)") |
502 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1\<bullet>u,pi1)") |
431 apply(force simp add: fresh_prod fresh_fun_simp_OrL at_prm_fresh[OF at_name_inst] swap_simps) |
503 apply(simp add: fresh_prod) |
432 apply (meson exists_fresh(1) fs_name1) |
504 apply(auto) |
433 apply(perm_simp) |
505 apply(simp add: fresh_fun_simp_OrL at_prm_fresh[OF at_name_inst] swap_simps) |
434 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2\<bullet>u,pi2)") |
506 apply(rule exists_fresh') |
435 apply(force simp add: fresh_prod fresh_fun_simp_OrL calc_atm) |
507 apply(simp add: fin_supp) |
436 by (meson exists_fresh(1) fs_name1) |
508 apply(perm_simp) |
|
509 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2\<bullet>u,pi2)") |
|
510 apply(simp add: fresh_prod) |
|
511 apply(auto) |
|
512 apply(simp add: fresh_fun_simp_OrL calc_atm) |
|
513 apply(rule exists_fresh') |
|
514 apply(simp add: fin_supp) |
|
515 done |
|
516 |
437 |
517 lemma fresh_fun_simp_ImpL: |
438 lemma fresh_fun_simp_ImpL: |
518 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>x" |
439 assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>x" |
519 shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z') = Cut <c>.P (z').ImpL <a>.M (x).N z'" |
440 shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z') = Cut <c>.P (z').ImpL <a>.M (x).N z'" |
520 using a |
441 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) |
521 apply - |
442 obtain n::name where "n\<sharp>(c,P,x,M,N)" |
522 apply(rule fresh_fun_app) |
443 by (meson exists_fresh(1) fs_name1) |
523 apply(rule pt_name_inst) |
444 then show "\<exists>aa. aa \<sharp> (\<lambda>z'. Cut <c>.P(z').ImpL <a>.M(x).N z', Cut <c>.P(aa).ImpL <a>.M(x).N aa)" |
524 apply(rule at_name_inst) |
445 apply(intro exI [where x="n"]) |
525 apply(finite_guess) |
446 apply(simp add: fresh_prod abs_fresh) |
526 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M,N)") |
447 apply(fresh_guess) |
527 apply(erule exE) |
448 done |
528 apply(rule_tac x="n" in exI) |
449 next |
529 apply(simp add: fresh_prod abs_fresh) |
450 show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').ImpL <a>.M(x).N z')" |
530 apply(fresh_guess) |
451 using a by(fresh_guess) |
531 apply(rule exists_fresh') |
452 qed finite_guess |
532 apply(simp add: fin_supp) |
|
533 apply(fresh_guess) |
|
534 done |
|
535 |
453 |
536 lemma fresh_fun_ImpL[eqvt_force]: |
454 lemma fresh_fun_ImpL[eqvt_force]: |
537 fixes pi1::"name prm" |
455 fixes pi1::"name prm" |
538 and pi2::"coname prm" |
456 and pi2::"coname prm" |
539 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')= |
457 shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')= |
540 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))" |
458 fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))" |
541 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')= |
459 and "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')= |
542 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))" |
460 fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))" |
543 apply - |
461 apply(perm_simp) |
544 apply(perm_simp) |
462 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1)") |
545 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1)") |
463 apply(force simp add: fresh_prod fresh_fun_simp_ImpL at_prm_fresh[OF at_name_inst] swap_simps) |
546 apply(simp add: fresh_prod) |
464 apply (meson exists_fresh(1) fs_name1) |
547 apply(auto) |
465 apply(perm_simp) |
548 apply(simp add: fresh_fun_simp_ImpL at_prm_fresh[OF at_name_inst] swap_simps) |
466 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2)") |
549 apply(rule exists_fresh') |
467 apply(force simp add: fresh_prod fresh_fun_simp_ImpL calc_atm) |
550 apply(simp add: fin_supp) |
468 by (meson exists_fresh(1) fs_name1) |
551 apply(perm_simp) |
|
552 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2)") |
|
553 apply(simp add: fresh_prod) |
|
554 apply(auto) |
|
555 apply(simp add: fresh_fun_simp_ImpL calc_atm) |
|
556 apply(rule exists_fresh') |
|
557 apply(simp add: fin_supp) |
|
558 done |
|
559 |
469 |
560 lemma fresh_fun_simp_NotR: |
470 lemma fresh_fun_simp_NotR: |
561 assumes a: "a'\<sharp>P" "a'\<sharp>M" |
471 assumes a: "a'\<sharp>P" "a'\<sharp>M" |
562 shows "fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P) = Cut <a'>.(NotR (y).M a') (x).P" |
472 shows "fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P) = Cut <a'>.(NotR (y).M a') (x).P" |
563 using a |
473 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) |
564 apply - |
474 obtain n::coname where "n\<sharp>(x,P,y,M)" |
565 apply(rule fresh_fun_app) |
475 by (metis assms(1) assms(2) fresh_atm(4) fresh_prod) |
566 apply(rule pt_coname_inst) |
476 then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P, Cut <a>.NotR(y).M(a) (x).P)" |
567 apply(rule at_coname_inst) |
477 apply(intro exI [where x="n"]) |
568 apply(finite_guess) |
478 apply(simp add: fresh_prod abs_fresh) |
569 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,y,M)") |
479 apply(fresh_guess) |
570 apply(erule exE) |
480 done |
571 apply(rule_tac x="n" in exI) |
481 qed (use a in \<open>fresh_guess|finite_guess\<close>)+ |
572 apply(simp add: fresh_prod abs_fresh) |
|
573 apply(fresh_guess) |
|
574 apply(rule exists_fresh') |
|
575 apply(simp add: fin_supp) |
|
576 apply(fresh_guess) |
|
577 done |
|
578 |
482 |
579 lemma fresh_fun_NotR[eqvt_force]: |
483 lemma fresh_fun_NotR[eqvt_force]: |
580 fixes pi1::"name prm" |
484 fixes pi1::"name prm" |
581 and pi2::"coname prm" |
485 and pi2::"coname prm" |
582 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)= |
486 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)= |
583 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))" |
487 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))" |
584 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)= |
488 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)= |
585 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))" |
489 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))" |
586 apply - |
490 apply(perm_simp) |
587 apply(perm_simp) |
491 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi1\<bullet>P,pi1\<bullet>M,pi1)") |
588 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi1\<bullet>P,pi1\<bullet>M,pi1)") |
492 apply(force simp add: fresh_prod fresh_fun_simp_NotR calc_atm) |
589 apply(simp add: fresh_prod) |
493 apply (meson exists_fresh(2) fs_coname1) |
590 apply(auto) |
494 apply(perm_simp) |
591 apply(simp add: fresh_fun_simp_NotR calc_atm) |
495 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)") |
592 apply(rule exists_fresh') |
496 apply(force simp: fresh_prod fresh_fun_simp_NotR at_prm_fresh[OF at_coname_inst] swap_simps) |
593 apply(simp add: fin_supp) |
497 by (meson exists_fresh(2) fs_coname1) |
594 apply(perm_simp) |
|
595 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)") |
|
596 apply(simp add: fresh_prod) |
|
597 apply(auto) |
|
598 apply(simp add: fresh_fun_simp_NotR at_prm_fresh[OF at_coname_inst] swap_simps) |
|
599 apply(rule exists_fresh') |
|
600 apply(simp add: fin_supp) |
|
601 done |
|
602 |
498 |
603 lemma fresh_fun_simp_AndR: |
499 lemma fresh_fun_simp_AndR: |
604 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>N" "a'\<sharp>b" "a'\<sharp>c" |
500 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>N" "a'\<sharp>b" "a'\<sharp>c" |
605 shows "fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P) = Cut <a'>.(AndR <b>.M <c>.N a') (x).P" |
501 shows "fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P) = Cut <a'>.(AndR <b>.M <c>.N a') (x).P" |
606 using a |
502 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) |
607 apply - |
503 obtain n::coname where "n\<sharp>(x,P,b,M,c,N)" |
608 apply(rule fresh_fun_app) |
504 by (meson exists_fresh(2) fs_coname1) |
609 apply(rule pt_coname_inst) |
505 then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.AndR <b>.M <c>.N(a') (x).P, Cut <a>.AndR <b>.M <c>.N(a) (x).P)" |
610 apply(rule at_coname_inst) |
506 apply(intro exI [where x="n"]) |
611 apply(finite_guess) |
507 apply(simp add: fresh_prod abs_fresh) |
612 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,b,M,c,N)") |
508 apply(fresh_guess) |
613 apply(erule exE) |
509 done |
614 apply(rule_tac x="n" in exI) |
510 qed (use a in \<open>fresh_guess|finite_guess\<close>)+ |
615 apply(simp add: fresh_prod abs_fresh) |
|
616 apply(fresh_guess) |
|
617 apply(rule exists_fresh') |
|
618 apply(simp add: fin_supp) |
|
619 apply(fresh_guess) |
|
620 done |
|
621 |
511 |
622 lemma fresh_fun_AndR[eqvt_force]: |
512 lemma fresh_fun_AndR[eqvt_force]: |
623 fixes pi1::"name prm" |
513 fixes pi1::"name prm" |
624 and pi2::"coname prm" |
514 and pi2::"coname prm" |
625 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)= |
515 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)= |
626 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))" |
516 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))" |
627 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)= |
517 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)= |
628 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))" |
518 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))" |
629 apply - |
519 apply(perm_simp) |
630 apply(perm_simp) |
520 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>b,pi1\<bullet>c,pi1)") |
631 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>b,pi1\<bullet>c,pi1)") |
521 apply(force simp add: fresh_prod fresh_fun_simp_AndR calc_atm) |
632 apply(simp add: fresh_prod) |
522 apply (meson exists_fresh(2) fs_coname1) |
633 apply(auto) |
523 apply(perm_simp) |
634 apply(simp add: fresh_fun_simp_AndR calc_atm) |
524 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>b,pi2\<bullet>c,pi2)") |
635 apply(rule exists_fresh') |
525 apply(force simp add: fresh_prod fresh_fun_simp_AndR at_prm_fresh[OF at_coname_inst] swap_simps) |
636 apply(simp add: fin_supp) |
526 by (meson exists_fresh(2) fs_coname1) |
637 apply(perm_simp) |
|
638 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>b,pi2\<bullet>c,pi2)") |
|
639 apply(simp add: fresh_prod) |
|
640 apply(auto) |
|
641 apply(simp add: fresh_fun_simp_AndR at_prm_fresh[OF at_coname_inst] swap_simps) |
|
642 apply(rule exists_fresh') |
|
643 apply(simp add: fin_supp) |
|
644 done |
|
645 |
527 |
646 lemma fresh_fun_simp_OrR1: |
528 lemma fresh_fun_simp_OrR1: |
647 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" |
529 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" |
648 shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P) = Cut <a'>.(OrR1 <b>.M a') (x).P" |
530 shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P) = Cut <a'>.(OrR1 <b>.M a') (x).P" |
649 using a |
531 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) |
650 apply - |
532 obtain n::coname where "n\<sharp>(x,P,b,M)" |
651 apply(rule fresh_fun_app) |
533 by (meson exists_fresh(2) fs_coname1) |
652 apply(rule pt_coname_inst) |
534 then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.OrR1 <b>.M(a') (x).P, Cut <a>.OrR1 <b>.M(a) (x).P)" |
653 apply(rule at_coname_inst) |
535 apply(intro exI [where x="n"]) |
654 apply(finite_guess) |
536 apply(simp add: fresh_prod abs_fresh) |
655 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,b,M)") |
537 apply(fresh_guess) |
656 apply(erule exE) |
538 done |
657 apply(rule_tac x="n" in exI) |
539 qed (use a in \<open>fresh_guess|finite_guess\<close>)+ |
658 apply(simp add: fresh_prod abs_fresh) |
|
659 apply(fresh_guess) |
|
660 apply(rule exists_fresh') |
|
661 apply(simp add: fin_supp) |
|
662 apply(fresh_guess) |
|
663 done |
|
664 |
540 |
665 lemma fresh_fun_OrR1[eqvt_force]: |
541 lemma fresh_fun_OrR1[eqvt_force]: |
666 fixes pi1::"name prm" |
542 fixes pi1::"name prm" |
667 and pi2::"coname prm" |
543 and pi2::"coname prm" |
668 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)= |
544 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)= |
669 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P))" |
545 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P))" |
670 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)= |
546 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)= |
671 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P))" |
547 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P))" |
672 apply - |
548 apply(perm_simp) |
673 apply(perm_simp) |
549 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)") |
674 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)") |
550 apply(force simp add: fresh_prod fresh_fun_simp_OrR1 calc_atm) |
675 apply(simp add: fresh_prod) |
551 apply (meson exists_fresh(2) fs_coname1) |
676 apply(auto) |
552 apply(perm_simp) |
677 apply(simp add: fresh_fun_simp_OrR1 calc_atm) |
553 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)") |
678 apply(rule exists_fresh') |
554 apply(force simp add: fresh_prod fresh_fun_simp_OrR1 at_prm_fresh[OF at_coname_inst] swap_simps) |
679 apply(simp add: fin_supp) |
555 by (meson exists_fresh(2) fs_coname1) |
680 apply(perm_simp) |
|
681 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)") |
|
682 apply(simp add: fresh_prod) |
|
683 apply(auto) |
|
684 apply(simp add: fresh_fun_simp_OrR1 at_prm_fresh[OF at_coname_inst] swap_simps) |
|
685 apply(rule exists_fresh') |
|
686 apply(simp add: fin_supp) |
|
687 done |
|
688 |
556 |
689 lemma fresh_fun_simp_OrR2: |
557 lemma fresh_fun_simp_OrR2: |
690 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" |
558 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" |
691 shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P) = Cut <a'>.(OrR2 <b>.M a') (x).P" |
559 shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P) = Cut <a'>.(OrR2 <b>.M a') (x).P" |
692 using a |
560 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) |
693 apply - |
561 obtain n::coname where "n\<sharp>(x,P,b,M)" |
694 apply(rule fresh_fun_app) |
562 by (meson exists_fresh(2) fs_coname1) |
695 apply(rule pt_coname_inst) |
563 then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.OrR2 <b>.M(a') (x).P, Cut <a>.OrR2 <b>.M(a) (x).P)" |
696 apply(rule at_coname_inst) |
564 apply(intro exI [where x="n"]) |
697 apply(finite_guess) |
565 apply(simp add: fresh_prod abs_fresh) |
698 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,b,M)") |
566 apply(fresh_guess) |
699 apply(erule exE) |
567 done |
700 apply(rule_tac x="n" in exI) |
568 qed (use a in \<open>fresh_guess|finite_guess\<close>)+ |
701 apply(simp add: fresh_prod abs_fresh) |
|
702 apply(fresh_guess) |
|
703 apply(rule exists_fresh') |
|
704 apply(simp add: fin_supp) |
|
705 apply(fresh_guess) |
|
706 done |
|
707 |
569 |
708 lemma fresh_fun_OrR2[eqvt_force]: |
570 lemma fresh_fun_OrR2[eqvt_force]: |
709 fixes pi1::"name prm" |
571 fixes pi1::"name prm" |
710 and pi2::"coname prm" |
572 and pi2::"coname prm" |
711 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)= |
573 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)= |
712 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P))" |
574 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P))" |
713 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)= |
575 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)= |
714 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P))" |
576 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P))" |
715 apply - |
577 apply(perm_simp) |
716 apply(perm_simp) |
578 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)") |
717 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)") |
579 apply(force simp add: fresh_prod fresh_fun_simp_OrR2 calc_atm) |
718 apply(simp add: fresh_prod) |
580 apply (meson exists_fresh(2) fs_coname1) |
719 apply(auto) |
581 apply(perm_simp) |
720 apply(simp add: fresh_fun_simp_OrR2 calc_atm) |
582 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)") |
721 apply(rule exists_fresh') |
583 apply(force simp add: fresh_prod fresh_fun_simp_OrR2 at_prm_fresh[OF at_coname_inst] swap_simps) |
722 apply(simp add: fin_supp) |
584 by (meson exists_fresh(2) fs_coname1) |
723 apply(perm_simp) |
|
724 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)") |
|
725 apply(simp add: fresh_prod) |
|
726 apply(auto) |
|
727 apply(simp add: fresh_fun_simp_OrR2 at_prm_fresh[OF at_coname_inst] swap_simps) |
|
728 apply(rule exists_fresh') |
|
729 apply(simp add: fin_supp) |
|
730 done |
|
731 |
585 |
732 lemma fresh_fun_simp_ImpR: |
586 lemma fresh_fun_simp_ImpR: |
733 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" |
587 assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" |
734 shows "fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P) = Cut <a'>.(ImpR (y).<b>.M a') (x).P" |
588 shows "fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P) = Cut <a'>.(ImpR (y).<b>.M a') (x).P" |
735 using a |
589 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) |
736 apply - |
590 obtain n::coname where "n\<sharp>(x,P,y,b,M)" |
737 apply(rule fresh_fun_app) |
591 by (meson exists_fresh(2) fs_coname1) |
738 apply(rule pt_coname_inst) |
592 then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P, Cut <a>.(ImpR (y).<b>.M a) (x).P)" |
739 apply(rule at_coname_inst) |
593 apply(intro exI [where x="n"]) |
740 apply(finite_guess) |
594 apply(simp add: fresh_prod abs_fresh) |
741 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,y,b,M)") |
595 apply(fresh_guess) |
742 apply(erule exE) |
596 done |
743 apply(rule_tac x="n" in exI) |
597 qed (use a in \<open>fresh_guess|finite_guess\<close>)+ |
744 apply(simp add: fresh_prod abs_fresh) |
|
745 apply(fresh_guess) |
|
746 apply(rule exists_fresh') |
|
747 apply(simp add: fin_supp) |
|
748 apply(fresh_guess) |
|
749 done |
|
750 |
598 |
751 lemma fresh_fun_ImpR[eqvt_force]: |
599 lemma fresh_fun_ImpR[eqvt_force]: |
752 fixes pi1::"name prm" |
600 fixes pi1::"name prm" |
753 and pi2::"coname prm" |
601 and pi2::"coname prm" |
754 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)= |
602 shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)= |
755 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))" |
603 fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))" |
756 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)= |
604 and "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)= |
757 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))" |
605 fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))" |
758 apply - |
606 apply(perm_simp) |
759 apply(perm_simp) |
607 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)") |
760 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)") |
608 apply(force simp add: fresh_prod fresh_fun_simp_ImpR calc_atm) |
761 apply(simp add: fresh_prod) |
609 apply (meson exists_fresh(2) fs_coname1) |
762 apply(auto) |
610 apply(perm_simp) |
763 apply(simp add: fresh_fun_simp_ImpR calc_atm) |
611 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)") |
764 apply(rule exists_fresh') |
612 apply(force simp add: fresh_prod fresh_fun_simp_ImpR at_prm_fresh[OF at_coname_inst] swap_simps) |
765 apply(simp add: fin_supp) |
613 by (meson exists_fresh(2) fs_coname1) |
766 apply(perm_simp) |
|
767 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)") |
|
768 apply(simp add: fresh_prod) |
|
769 apply(auto) |
|
770 apply(simp add: fresh_fun_simp_ImpR at_prm_fresh[OF at_coname_inst] swap_simps) |
|
771 apply(rule exists_fresh') |
|
772 apply(simp add: fin_supp) |
|
773 done |
|
774 |
614 |
775 nominal_primrec (freshness_context: "(y::name,c::coname,P::trm)") |
615 nominal_primrec (freshness_context: "(y::name,c::coname,P::trm)") |
776 substn :: "trm \<Rightarrow> name \<Rightarrow> coname \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=<_>._}" [100,100,100,100] 100) |
616 substn :: "trm \<Rightarrow> name \<Rightarrow> coname \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=<_>._}" [100,100,100,100] 100) |
777 where |
617 where |
778 "(Ax x a){y:=<c>.P} = (if x=y then Cut <c>.P (y).Ax y a else Ax x a)" |
618 "(Ax x a){y:=<c>.P} = (if x=y then Cut <c>.P (y).Ax y a else Ax x a)" |
796 else OrL (x).(M{y:=<c>.P}) (u).(N{y:=<c>.P}) z)" |
636 else OrL (x).(M{y:=<c>.P}) (u).(N{y:=<c>.P}) z)" |
797 | "\<lbrakk>a\<sharp>(b,c,P); x\<sharp>(y,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){y:=<c>.P} = ImpR (x).<a>.(M{y:=<c>.P}) b" |
637 | "\<lbrakk>a\<sharp>(b,c,P); x\<sharp>(y,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){y:=<c>.P} = ImpR (x).<a>.(M{y:=<c>.P}) b" |
798 | "\<lbrakk>a\<sharp>(N,c,P);x\<sharp>(y,P,M,z)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N z){y:=<c>.P} = |
638 | "\<lbrakk>a\<sharp>(N,c,P);x\<sharp>(y,P,M,z)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N z){y:=<c>.P} = |
799 (if y=z then fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z') |
639 (if y=z then fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z') |
800 else ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z)" |
640 else ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z)" |
801 apply(finite_guess)+ |
641 apply(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess | rule strip)+ |
802 apply(rule TrueI)+ |
642 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)") |
803 apply(simp add: abs_fresh abs_supp)+ |
643 apply(force simp add: fresh_prod fresh_fun_simp_NotL abs_fresh fresh_atm) |
804 apply(rule impI) |
644 apply (meson exists_fresh(1) fs_name1) |
805 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod) |
645 |
806 apply(erule conjE)+ |
646 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ |
807 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) |
647 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)") |
808 apply(rule exists_fresh', simp add: fin_supp) |
648 apply(force simp add: fresh_prod fresh_fun_simp_AndL1 abs_fresh fresh_atm) |
809 apply(simp add: abs_fresh abs_supp)+ |
649 apply (meson exists_fresh(1) fs_name1) |
810 apply(rule impI) |
650 |
811 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod) |
651 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ |
812 apply(erule conjE)+ |
652 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)") |
813 apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) |
653 apply(force simp add: fresh_prod fresh_fun_simp_AndL2 abs_fresh fresh_atm) |
814 apply(rule exists_fresh', simp add: fin_supp) |
654 apply (meson exists_fresh(1) fs_name1) |
815 apply(simp add: abs_fresh abs_supp)+ |
655 |
816 apply(rule impI) |
656 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ |
817 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod) |
657 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)") |
818 apply(erule conjE)+ |
658 apply(force simp add: fresh_prod fresh_fun_simp_OrL abs_fresh fresh_atm) |
819 apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) |
659 apply (meson exists_fresh(1) fs_name1) |
820 apply(rule exists_fresh', simp add: fin_supp) |
660 |
821 apply(simp add: abs_fresh abs_supp)+ |
661 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ |
822 apply(rule impI) |
662 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)") |
823 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) |
663 apply(force simp add: fresh_prod fresh_fun_simp_OrL abs_fresh fresh_atm) |
824 apply(erule conjE)+ |
664 apply (meson exists_fresh(1) fs_name1) |
825 apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) |
665 |
826 apply(rule exists_fresh', simp add: fin_supp) |
666 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ |
827 apply(simp add: abs_fresh abs_supp)+ |
667 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)") |
828 apply(rule impI) |
668 apply(force simp add: fresh_prod fresh_fun_simp_ImpL abs_fresh fresh_atm) |
829 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) |
669 apply (meson exists_fresh(1) fs_name1) |
830 apply(erule conjE)+ |
670 |
831 apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) |
671 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ |
832 apply(rule exists_fresh', simp add: fin_supp) |
672 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)") |
833 apply(simp add: abs_fresh abs_supp)+ |
673 apply(force simp add: fresh_prod fresh_fun_simp_ImpL abs_fresh fresh_atm) |
834 apply(rule impI) |
674 apply (meson exists_fresh(1) fs_name1) |
835 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)", erule exE, simp add: fresh_prod) |
|
836 apply(erule conjE)+ |
|
837 apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) |
|
838 apply(rule exists_fresh', simp add: fin_supp) |
|
839 apply(simp add: abs_fresh abs_supp)+ |
|
840 apply(rule impI) |
|
841 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)", erule exE, simp add: fresh_prod) |
|
842 apply(erule conjE)+ |
|
843 apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) |
|
844 apply(rule exists_fresh', simp add: fin_supp) |
|
845 apply(fresh_guess)+ |
675 apply(fresh_guess)+ |
846 done |
676 done |
847 |
677 |
848 nominal_primrec (freshness_context: "(d::name,z::coname,P::trm)") |
678 nominal_primrec (freshness_context: "(d::name,z::coname,P::trm)") |
849 substc :: "trm \<Rightarrow> coname \<Rightarrow> name \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=(_)._}" [100,100,100,100] 100) |
679 substc :: "trm \<Rightarrow> coname \<Rightarrow> name \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=(_)._}" [100,100,100,100] 100) |
868 | "\<lbrakk>a\<sharp>(b,d,P); x\<sharp>(z,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){d:=(z).P} = |
698 | "\<lbrakk>a\<sharp>(b,d,P); x\<sharp>(z,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){d:=(z).P} = |
869 (if d=b then fresh_fun (\<lambda>a'. Cut <a'>.ImpR (x).<a>.(M{d:=(z).P}) a' (z).P) |
699 (if d=b then fresh_fun (\<lambda>a'. Cut <a'>.ImpR (x).<a>.(M{d:=(z).P}) a' (z).P) |
870 else ImpR (x).<a>.(M{d:=(z).P}) b)" |
700 else ImpR (x).<a>.(M{d:=(z).P}) b)" |
871 | "\<lbrakk>a\<sharp>(N,d,P);x\<sharp>(y,z,P,M)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y){d:=(z).P} = |
701 | "\<lbrakk>a\<sharp>(N,d,P);x\<sharp>(y,z,P,M)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y){d:=(z).P} = |
872 ImpL <a>.(M{d:=(z).P}) (x).(N{d:=(z).P}) y" |
702 ImpL <a>.(M{d:=(z).P}) (x).(N{d:=(z).P}) y" |
873 apply(finite_guess)+ |
703 apply(finite_guess | simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ |
874 apply(rule TrueI)+ |
704 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)") |
875 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+ |
705 apply(force simp add: fresh_prod fresh_fun_simp_NotR abs_fresh fresh_atm) |
876 apply(rule impI) |
706 apply(meson exists_fresh' fin_supp) |
877 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod) |
707 |
878 apply(erule conjE)+ |
708 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ |
879 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) |
709 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)") |
880 apply(rule exists_fresh', simp add: fin_supp) |
710 apply(force simp add: fresh_prod fresh_fun_simp_AndR abs_fresh fresh_atm) |
881 apply(simp add: abs_fresh abs_supp)+ |
711 apply(meson exists_fresh' fin_supp) |
882 apply(rule impI) |
712 |
883 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) |
713 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ |
884 apply(erule conjE)+ |
714 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)") |
885 apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) |
715 apply(force simp add: fresh_prod fresh_fun_simp_AndR abs_fresh fresh_atm) |
886 apply(rule exists_fresh', simp add: fin_supp) |
716 apply(meson exists_fresh' fin_supp) |
887 apply(simp add: abs_fresh abs_supp)+ |
717 |
888 apply(rule impI) |
718 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ |
889 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) |
719 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)") |
890 apply(erule conjE)+ |
720 apply(force simp add: fresh_prod fresh_fun_simp_OrR1 abs_fresh fresh_atm) |
891 apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) |
721 apply(meson exists_fresh' fin_supp) |
892 apply(rule exists_fresh', simp add: fin_supp) |
722 |
893 apply(simp add: abs_fresh abs_supp)+ |
723 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ |
894 apply(rule impI) |
724 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)") |
895 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod) |
725 apply(force simp add: fresh_prod fresh_fun_simp_OrR2 abs_fresh fresh_atm) |
896 apply(erule conjE)+ |
726 apply(meson exists_fresh' fin_supp) |
897 apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) |
727 |
898 apply(rule exists_fresh', simp add: fin_supp) |
728 apply(simp add: abs_fresh abs_supp | rule strip)+ |
899 apply(simp add: abs_fresh abs_supp)+ |
729 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)") |
900 apply(rule impI) |
730 apply(force simp add: fresh_prod fresh_fun_simp_ImpR abs_fresh fresh_atm abs_supp) |
901 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod) |
731 apply(meson exists_fresh' fin_supp) |
902 apply(erule conjE)+ |
732 |
903 apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) |
733 apply(simp add: abs_fresh abs_supp | rule strip)+ |
904 apply(rule exists_fresh', simp add: fin_supp) |
734 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)") |
905 apply(simp add: abs_fresh abs_supp)+ |
735 apply(force simp add: fresh_prod fresh_fun_simp_ImpR abs_fresh fresh_atm) |
906 apply(rule impI) |
736 apply(meson exists_fresh' fin_supp) |
907 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)", erule exE, simp add: fresh_prod) |
737 |
908 apply(erule conjE)+ |
738 apply(simp add: abs_fresh | fresh_guess add: abs_fresh)+ |
909 apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm abs_supp) |
739 done |
910 apply(rule exists_fresh', simp add: fin_supp) |
740 |
911 apply(simp add: abs_fresh abs_supp)+ |
|
912 apply(rule impI) |
|
913 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)", erule exE, simp add: fresh_prod) |
|
914 apply(erule conjE)+ |
|
915 apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm) |
|
916 apply(rule exists_fresh', simp add: fin_supp) |
|
917 apply(simp add: abs_fresh abs_supp)+ |
|
918 apply(fresh_guess add: abs_fresh fresh_prod)+ |
|
919 done |
|
920 |
741 |
921 lemma csubst_eqvt[eqvt]: |
742 lemma csubst_eqvt[eqvt]: |
922 fixes pi1::"name prm" |
743 fixes pi1::"name prm" |
923 and pi2::"coname prm" |
744 and pi2::"coname prm" |
924 shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}" |
745 shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}" |
925 and "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}" |
746 and "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}" |
926 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) |
747 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) |
927 apply(auto simp add: eq_bij fresh_bij eqvts) |
748 apply(auto simp: eq_bij fresh_bij eqvts) |
928 apply(perm_simp)+ |
749 apply(perm_simp)+ |
929 done |
750 done |
930 |
751 |
931 lemma nsubst_eqvt[eqvt]: |
752 lemma nsubst_eqvt[eqvt]: |
932 fixes pi1::"name prm" |
753 fixes pi1::"name prm" |
933 and pi2::"coname prm" |
754 and pi2::"coname prm" |
934 shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}" |
755 shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}" |
935 and "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}" |
756 and "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}" |
936 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) |
757 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) |
937 apply(auto simp add: eq_bij fresh_bij eqvts) |
758 apply(auto simp: eq_bij fresh_bij eqvts) |
938 apply(perm_simp)+ |
759 apply(perm_simp)+ |
939 done |
760 done |
940 |
761 |
941 lemma supp_subst1: |
762 lemma supp_subst1: |
942 shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)" |
763 shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)" |
943 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
764 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
944 apply(auto) |
765 apply(auto) |
945 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
766 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
946 apply(blast)+ |
767 apply(blast)+ |
947 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
768 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
948 apply(erule exE) |
769 apply(erule exE) |
949 apply(simp add: fresh_prod) |
770 apply(simp add: fresh_prod) |
950 apply(erule conjE)+ |
771 apply(erule conjE)+ |
1069 |
890 |
1070 lemma supp_subst2: |
891 lemma supp_subst2: |
1071 shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})" |
892 shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})" |
1072 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
893 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1073 apply(auto) |
894 apply(auto) |
1074 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
895 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1075 apply(blast)+ |
896 apply(blast)+ |
1076 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
897 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1077 apply(erule exE) |
898 apply(erule exE) |
1078 apply(simp add: fresh_prod) |
899 apply(simp add: fresh_prod) |
1079 apply(erule conjE)+ |
900 apply(erule conjE)+ |
1182 |
1003 |
1183 lemma supp_subst3: |
1004 lemma supp_subst3: |
1184 shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)" |
1005 shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)" |
1185 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1006 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1186 apply(auto) |
1007 apply(auto) |
1187 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1008 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1188 apply(blast)+ |
1009 apply(blast)+ |
1189 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1010 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1190 apply(erule exE) |
1011 apply(erule exE) |
1191 apply(simp add: fresh_prod) |
1012 apply(simp add: fresh_prod) |
1192 apply(erule conjE)+ |
1013 apply(erule conjE)+ |
1310 |
1131 |
1311 lemma supp_subst4: |
1132 lemma supp_subst4: |
1312 shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})" |
1133 shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})" |
1313 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1134 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1314 apply(auto) |
1135 apply(auto) |
1315 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1136 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1316 apply(blast)+ |
1137 apply(blast)+ |
1317 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1138 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1318 apply(erule exE) |
1139 apply(erule exE) |
1319 apply(simp add: fresh_prod) |
1140 apply(simp add: fresh_prod) |
1320 apply(erule conjE)+ |
1141 apply(erule conjE)+ |
1415 |
1236 |
1416 lemma supp_subst5: |
1237 lemma supp_subst5: |
1417 shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})" |
1238 shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})" |
1418 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1239 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1419 apply(auto) |
1240 apply(auto) |
1420 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1241 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1421 apply(blast)+ |
1242 apply(blast)+ |
1422 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1243 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1423 apply(erule exE) |
1244 apply(erule exE) |
1424 apply(simp add: fresh_prod) |
1245 apply(simp add: fresh_prod) |
1425 apply(erule conjE)+ |
1246 apply(erule conjE)+ |
1482 |
1303 |
1483 lemma supp_subst6: |
1304 lemma supp_subst6: |
1484 shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)" |
1305 shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)" |
1485 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1306 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1486 apply(auto) |
1307 apply(auto) |
1487 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1308 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1488 apply(blast)+ |
1309 apply(blast)+ |
1489 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1310 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1490 apply(erule exE) |
1311 apply(erule exE) |
1491 apply(simp add: fresh_prod) |
1312 apply(simp add: fresh_prod) |
1492 apply(erule conjE)+ |
1313 apply(erule conjE)+ |
1549 |
1370 |
1550 lemma supp_subst7: |
1371 lemma supp_subst7: |
1551 shows "(supp M - {c}) \<subseteq> supp (M{c:=(x).P})" |
1372 shows "(supp M - {c}) \<subseteq> supp (M{c:=(x).P})" |
1552 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1373 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1553 apply(auto) |
1374 apply(auto) |
1554 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1375 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1555 apply(blast)+ |
1376 apply(blast)+ |
1556 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1377 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1557 apply(erule exE) |
1378 apply(erule exE) |
1558 apply(simp add: fresh_prod) |
1379 apply(simp add: fresh_prod) |
1559 apply(erule conjE)+ |
1380 apply(erule conjE)+ |
1608 |
1429 |
1609 lemma supp_subst8: |
1430 lemma supp_subst8: |
1610 shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)" |
1431 shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)" |
1611 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1432 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1612 apply(auto) |
1433 apply(auto) |
1613 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1434 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1614 apply(blast)+ |
1435 apply(blast)+ |
1615 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1436 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1616 apply(erule exE) |
1437 apply(erule exE) |
1617 apply(simp add: fresh_prod) |
1438 apply(simp add: fresh_prod) |
1618 apply(erule conjE)+ |
1439 apply(erule conjE)+ |
1686 |
1507 |
1687 lemma forget: |
1508 lemma forget: |
1688 shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M" |
1509 shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M" |
1689 and "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M" |
1510 and "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M" |
1690 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct) |
1511 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct) |
1691 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
1512 apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
1692 done |
1513 done |
1693 |
1514 |
1694 lemma substc_rename1: |
1515 lemma substc_rename1: |
1695 assumes a: "c\<sharp>(M,a)" |
1516 assumes a: "c\<sharp>(M,a)" |
1696 shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}" |
1517 shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}" |
1697 using a |
1518 using a |
1698 proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct) |
1519 proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct) |
1699 case (Ax z d) |
1520 case (Ax z d) |
1700 then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1521 then show ?case by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1701 next |
1522 next |
1702 case NotL |
1523 case NotL |
1703 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1524 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1704 next |
1525 next |
1705 case (NotR y M d) |
1526 case (NotR y M d) |
1706 then show ?case |
1527 then show ?case |
1707 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1528 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1708 next |
1529 next |
1709 case (AndR c1 M c2 M' c3) |
1530 case (AndR c1 M c2 M' c3) |
1710 then show ?case |
1531 then show ?case |
1711 apply(auto simp add: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) |
1532 apply(auto simp: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) |
1712 apply (metis (erased, opaque_lifting)) |
1533 apply (metis (erased, opaque_lifting)) |
1713 by metis |
1534 by metis |
1714 next |
1535 next |
1715 case AndL1 |
1536 case AndL1 |
1716 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1537 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1717 next |
1538 next |
1718 case AndL2 |
1539 case AndL2 |
1719 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1540 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1720 next |
1541 next |
1721 case (OrR1 d M e) |
1542 case (OrR1 d M e) |
1722 then show ?case |
1543 then show ?case |
1723 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1544 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1724 next |
1545 next |
1725 case (OrR2 d M e) |
1546 case (OrR2 d M e) |
1726 then show ?case |
1547 then show ?case |
1727 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1548 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1728 next |
1549 next |
1729 case (OrL x1 M x2 M' x3) |
1550 case (OrL x1 M x2 M' x3) |
1730 then show ?case |
1551 then show ?case |
1731 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1552 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1732 next |
1553 next |
1733 case ImpL |
1554 case ImpL |
1734 then show ?case |
1555 then show ?case |
1735 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1556 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1736 metis |
1557 metis |
1737 next |
1558 next |
1738 case (ImpR y d M e) |
1559 case (ImpR y d M e) |
1739 then show ?case |
1560 then show ?case |
1740 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1561 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1741 next |
1562 next |
1742 case (Cut d M y M') |
1563 case (Cut d M y M') |
1743 then show ?case |
1564 then show ?case |
1744 by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1565 by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1745 (metis crename.simps(1) crename_id crename_rename) |
1566 (metis crename.simps(1) crename_id crename_rename) |
1750 shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}" |
1571 shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}" |
1751 using a |
1572 using a |
1752 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) |
1573 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) |
1753 case (Ax z d) |
1574 case (Ax z d) |
1754 then show ?case |
1575 then show ?case |
1755 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1576 by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1756 next |
1577 next |
1757 case NotL |
1578 case NotL |
1758 then show ?case |
1579 then show ?case |
1759 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1580 by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1760 next |
1581 next |
1761 case (NotR y M d) |
1582 case (NotR y M d) |
1762 then show ?case |
1583 then show ?case |
1763 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1584 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1764 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{d:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N)") |
1585 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{d:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N)") |
1765 apply(erule exE, simp add: fresh_prod) |
1586 apply(erule exE, simp add: fresh_prod) |
1766 apply(erule conjE)+ |
1587 apply(erule conjE)+ |
1767 apply(simp add: fresh_fun_simp_NotR) |
1588 apply(simp add: fresh_fun_simp_NotR) |
1768 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1589 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1769 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1590 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1770 done |
1591 done |
1771 next |
1592 next |
1772 case (AndR c1 M c2 M' c3) |
1593 case (AndR c1 M c2 M' c3) |
1773 then show ?case |
1594 then show ?case |
1774 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1595 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1775 apply(subgoal_tac |
1596 apply(subgoal_tac |
1776 "\<exists>a'::coname. a'\<sharp>(N,M{c3:=(y).([(y,x)]\<bullet>N)},M'{c3:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,c1,c2,c3)") |
1597 "\<exists>a'::coname. a'\<sharp>(N,M{c3:=(y).([(y,x)]\<bullet>N)},M'{c3:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,c1,c2,c3)") |
1777 apply(erule exE, simp add: fresh_prod) |
1598 apply(erule exE, simp add: fresh_prod) |
1778 apply(erule conjE)+ |
1599 apply(erule conjE)+ |
1779 apply(simp add: fresh_fun_simp_AndR) |
1600 apply(simp add: fresh_fun_simp_AndR) |
1780 apply (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) |
1601 apply (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) |
1781 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1602 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1782 done |
1603 done |
1783 next |
1604 next |
1784 case AndL1 |
1605 case AndL1 |
1785 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1606 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1786 next |
1607 next |
1787 case AndL2 |
1608 case AndL2 |
1788 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1609 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1789 next |
1610 next |
1790 case (OrR1 d M e) |
1611 case (OrR1 d M e) |
1791 then show ?case |
1612 then show ?case |
1792 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1613 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1793 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)") |
1614 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)") |
1794 apply(erule exE, simp add: fresh_prod) |
1615 apply(erule exE, simp add: fresh_prod) |
1795 apply(erule conjE)+ |
1616 apply(erule conjE)+ |
1796 apply(simp add: fresh_fun_simp_OrR1) |
1617 apply(simp add: fresh_fun_simp_OrR1) |
1797 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1618 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1798 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1619 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1799 done |
1620 done |
1800 next |
1621 next |
1801 case (OrR2 d M e) |
1622 case (OrR2 d M e) |
1802 then show ?case |
1623 then show ?case |
1803 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1624 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1804 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)") |
1625 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)") |
1805 apply(erule exE, simp add: fresh_prod) |
1626 apply(erule exE, simp add: fresh_prod) |
1806 apply(erule conjE)+ |
1627 apply(erule conjE)+ |
1807 apply(simp add: fresh_fun_simp_OrR2) |
1628 apply(simp add: fresh_fun_simp_OrR2) |
1808 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1629 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1809 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1630 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1810 done |
1631 done |
1811 next |
1632 next |
1812 case (OrL x1 M x2 M' x3) |
1633 case (OrL x1 M x2 M' x3) |
1813 then show ?case |
1634 then show ?case |
1814 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1635 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1815 next |
1636 next |
1816 case ImpL |
1637 case ImpL |
1817 then show ?case |
1638 then show ?case |
1818 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1639 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1819 next |
1640 next |
1820 case (ImpR y d M e) |
1641 case (ImpR y d M e) |
1821 then show ?case |
1642 then show ?case |
1822 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1643 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1823 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)") |
1644 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)") |
1824 apply(erule exE, simp add: fresh_prod) |
1645 apply(erule exE, simp add: fresh_prod) |
1825 apply(erule conjE)+ |
1646 apply(erule conjE)+ |
1826 apply(simp add: fresh_fun_simp_ImpR) |
1647 apply(simp add: fresh_fun_simp_ImpR) |
1827 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1648 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1828 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1649 apply(rule exists_fresh'(2)[OF fs_coname1]) |
1829 done |
1650 done |
1830 next |
1651 next |
1831 case (Cut d M y M') |
1652 case (Cut d M y M') |
1832 then show ?case |
1653 then show ?case |
1833 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) |
1654 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) |
1834 qed |
1655 qed |
1835 |
1656 |
1836 lemma substn_rename3: |
1657 lemma substn_rename3: |
1837 assumes a: "y\<sharp>(M,x)" |
1658 assumes a: "y\<sharp>(M,x)" |
1838 shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}" |
1659 shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}" |
1839 using a |
1660 using a |
1840 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) |
1661 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) |
1841 case (Ax z d) |
1662 case (Ax z d) |
1842 then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1663 then show ?case by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1843 next |
1664 next |
1844 case NotR |
1665 case NotR |
1845 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1666 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1846 next |
1667 next |
1847 case (NotL d M z) |
1668 case (NotL d M z) |
1848 then show ?case |
1669 then show ?case |
1849 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1670 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1850 next |
1671 next |
1851 case (AndR c1 M c2 M' c3) |
1672 case (AndR c1 M c2 M' c3) |
1852 then show ?case |
1673 then show ?case |
1853 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1674 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1854 next |
1675 next |
1855 case OrR1 |
1676 case OrR1 |
1856 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1677 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1857 next |
1678 next |
1858 case OrR2 |
1679 case OrR2 |
1859 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1680 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1860 next |
1681 next |
1861 case (AndL1 u M v) |
1682 case (AndL1 u M v) |
1862 then show ?case |
1683 then show ?case |
1863 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1684 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1864 next |
1685 next |
1865 case (AndL2 u M v) |
1686 case (AndL2 u M v) |
1866 then show ?case |
1687 then show ?case |
1867 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1688 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1868 next |
1689 next |
1869 case (OrL x1 M x2 M' x3) |
1690 case (OrL x1 M x2 M' x3) |
1870 then show ?case |
1691 then show ?case |
1871 by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1692 by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1872 (metis (poly_guards_query)) |
1693 (metis (poly_guards_query)) |
1873 next |
1694 next |
1874 case ImpR |
1695 case ImpR |
1875 then show ?case |
1696 then show ?case |
1876 by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_left abs_supp fin_supp fresh_prod) |
1697 by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_left abs_supp fin_supp fresh_prod) |
1877 next |
1698 next |
1878 case (ImpL d M v M' u) |
1699 case (ImpL d M v M' u) |
1879 then show ?case |
1700 then show ?case |
1880 by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1701 by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1881 (metis (poly_guards_query)) |
1702 (metis (poly_guards_query)) |
1882 next |
1703 next |
1883 case (Cut d M y M') |
1704 case (Cut d M y M') |
1884 then show ?case |
1705 then show ?case |
1885 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1706 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1886 apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) |
1707 apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) |
1887 apply(simp add: calc_atm) |
1708 apply(simp add: calc_atm) |
1888 apply metis |
1709 apply metis |
1889 done |
1710 done |
1890 qed |
1711 qed |
1894 shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}" |
1715 shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}" |
1895 using a |
1716 using a |
1896 proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct) |
1717 proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct) |
1897 case (Ax z d) |
1718 case (Ax z d) |
1898 then show ?case |
1719 then show ?case |
1899 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1720 by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1900 next |
1721 next |
1901 case NotR |
1722 case NotR |
1902 then show ?case |
1723 then show ?case |
1903 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1724 by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1904 next |
1725 next |
1905 case (NotL d M y) |
1726 case (NotL d M y) |
1906 then show ?case |
1727 then show ?case |
1907 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1728 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1908 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N)") |
1729 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N)") |
1909 apply(erule exE, simp add: fresh_prod) |
1730 apply(erule exE, simp add: fresh_prod) |
1910 apply(erule conjE)+ |
1731 apply(erule conjE)+ |
1911 apply(simp add: fresh_fun_simp_NotL) |
1732 apply(simp add: fresh_fun_simp_NotL) |
1912 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1733 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1913 apply(rule exists_fresh'(1)[OF fs_name1]) |
1734 apply(rule exists_fresh'(1)[OF fs_name1]) |
1914 done |
1735 done |
1915 next |
1736 next |
1916 case (OrL x1 M x2 M' x3) |
1737 case (OrL x1 M x2 M' x3) |
1917 then show ?case |
1738 then show ?case |
1918 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1739 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1919 apply(subgoal_tac |
1740 apply(subgoal_tac |
1920 "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},M'{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,x1,x2,x3)") |
1741 "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},M'{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,x1,x2,x3)") |
1921 apply(erule exE, simp add: fresh_prod) |
1742 apply(erule exE, simp add: fresh_prod) |
1922 apply(erule conjE)+ |
1743 apply(erule conjE)+ |
1923 apply(simp add: fresh_fun_simp_OrL) |
1744 apply(simp add: fresh_fun_simp_OrL) |
1924 apply (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) |
1745 apply (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) |
1925 apply(rule exists_fresh'(1)[OF fs_name1]) |
1746 apply(rule exists_fresh'(1)[OF fs_name1]) |
1926 done |
1747 done |
1927 next |
1748 next |
1928 case OrR1 |
1749 case OrR1 |
1929 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1750 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1930 next |
1751 next |
1931 case OrR2 |
1752 case OrR2 |
1932 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1753 then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1933 next |
1754 next |
1934 case (AndL1 u M v) |
1755 case (AndL1 u M v) |
1935 then show ?case |
1756 then show ?case |
1936 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1757 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1937 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)") |
1758 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)") |
1938 apply(erule exE, simp add: fresh_prod) |
1759 apply(erule exE, simp add: fresh_prod) |
1939 apply(erule conjE)+ |
1760 apply(erule conjE)+ |
1940 apply(simp add: fresh_fun_simp_AndL1) |
1761 apply(simp add: fresh_fun_simp_AndL1) |
1941 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1762 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1942 apply(rule exists_fresh'(1)[OF fs_name1]) |
1763 apply(rule exists_fresh'(1)[OF fs_name1]) |
1943 done |
1764 done |
1944 next |
1765 next |
1945 case (AndL2 u M v) |
1766 case (AndL2 u M v) |
1946 then show ?case |
1767 then show ?case |
1947 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1768 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1948 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)") |
1769 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)") |
1949 apply(erule exE, simp add: fresh_prod) |
1770 apply(erule exE, simp add: fresh_prod) |
1950 apply(erule conjE)+ |
1771 apply(erule conjE)+ |
1951 apply(simp add: fresh_fun_simp_AndL2) |
1772 apply(simp add: fresh_fun_simp_AndL2) |
1952 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1773 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1953 apply(rule exists_fresh'(1)[OF fs_name1]) |
1774 apply(rule exists_fresh'(1)[OF fs_name1]) |
1954 done |
1775 done |
1955 next |
1776 next |
1956 case (AndR c1 M c2 M' c3) |
1777 case (AndR c1 M c2 M' c3) |
1957 then show ?case |
1778 then show ?case |
1958 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1779 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1959 next |
1780 next |
1960 case ImpR |
1781 case ImpR |
1961 then show ?case |
1782 then show ?case |
1962 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1783 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1963 next |
1784 next |
1964 case (ImpL d M y M' u) |
1785 case (ImpL d M y M' u) |
1965 then show ?case |
1786 then show ?case |
1966 apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1787 apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) |
1967 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{u:=<c>.([(c,a)]\<bullet>N)},M'{u:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,y,u)") |
1788 apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{u:=<c>.([(c,a)]\<bullet>N)},M'{u:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,y,u)") |
1968 apply(erule exE, simp add: fresh_prod) |
1789 apply(erule exE, simp add: fresh_prod) |
1969 apply(erule conjE)+ |
1790 apply(erule conjE)+ |
1970 apply(simp add: fresh_fun_simp_ImpL) |
1791 apply(simp add: fresh_fun_simp_ImpL) |
1971 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1792 apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) |
1972 apply(rule exists_fresh'(1)[OF fs_name1]) |
1793 apply(rule exists_fresh'(1)[OF fs_name1]) |
1973 done |
1794 done |
1974 next |
1795 next |
1975 case (Cut d M y M') |
1796 case (Cut d M y M') |
1976 then show ?case |
1797 then show ?case |
1977 by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) |
1798 by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) |
1978 qed |
1799 qed |
1979 |
1800 |
1980 lemma subst_rename5: |
1801 lemma subst_rename5: |
1981 assumes a: "c'\<sharp>(c,N)" "x'\<sharp>(x,M)" |
1802 assumes a: "c'\<sharp>(c,N)" "x'\<sharp>(x,M)" |
1982 shows "M{x:=<c>.N} = ([(x',x)]\<bullet>M){x':=<c'>.([(c',c)]\<bullet>N)}" |
1803 shows "M{x:=<c>.N} = ([(x',x)]\<bullet>M){x':=<c'>.([(c',c)]\<bullet>N)}" |
2003 (if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" |
1824 (if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" |
2004 proof - |
1825 proof - |
2005 obtain x'::"name" where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
1826 obtain x'::"name" where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
2006 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
1827 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
2007 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
1828 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
2008 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
1829 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
2009 have eq2: "(M=Ax y a) = (([(a',a)]\<bullet>M)=Ax y a')" |
1830 have eq2: "(M=Ax y a) = (([(a',a)]\<bullet>M)=Ax y a')" |
2010 apply(auto simp add: calc_atm) |
1831 apply(auto simp: calc_atm) |
2011 apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) |
1832 apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) |
2012 apply(simp add: calc_atm) |
1833 apply(simp add: calc_atm) |
2013 done |
1834 done |
2014 have "(Cut <a>.M (x).N){y:=<c>.P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){y:=<c>.P}" |
1835 have "(Cut <a>.M (x).N){y:=<c>.P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){y:=<c>.P}" |
2015 using eq1 by simp |
1836 using eq1 by simp |
2016 also have "\<dots> = (if ([(a',a)]\<bullet>M)=Ax y a' then Cut <c>.P (x').(([(x',x)]\<bullet>N){y:=<c>.P}) |
1837 also have "\<dots> = (if ([(a',a)]\<bullet>M)=Ax y a' then Cut <c>.P (x').(([(x',x)]\<bullet>N){y:=<c>.P}) |
2017 else Cut <a'>.(([(a',a)]\<bullet>M){y:=<c>.P}) (x').(([(x',x)]\<bullet>N){y:=<c>.P}))" |
1838 else Cut <a'>.(([(a',a)]\<bullet>M){y:=<c>.P}) (x').(([(x',x)]\<bullet>N){y:=<c>.P}))" |
2018 using fs1 fs2 by (auto simp add: fresh_prod fresh_left calc_atm fresh_atm) |
1839 using fs1 fs2 by (auto simp: fresh_prod fresh_left calc_atm fresh_atm) |
2019 also have "\<dots> =(if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" |
1840 also have "\<dots> =(if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" |
2020 using fs1 fs2 a |
1841 using fs1 fs2 a |
2021 apply - |
1842 apply - |
2022 apply(simp only: eq2[symmetric]) |
1843 apply(simp only: eq2[symmetric]) |
2023 apply(auto simp add: trm.inject) |
1844 apply(auto simp: trm.inject) |
2024 apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh) |
1845 apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh) |
2025 apply(simp_all add: eqvts perm_fresh_fresh calc_atm) |
1846 apply(simp_all add: eqvts perm_fresh_fresh calc_atm) |
2026 apply(auto) |
1847 apply(auto) |
2027 apply(rule subst_rename) |
1848 apply(rule subst_rename) |
2028 apply(simp add: fresh_prod fresh_atm) |
1849 apply(simp add: fresh_prod fresh_atm) |
2038 (if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" |
1859 (if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" |
2039 proof - |
1860 proof - |
2040 obtain x'::"name" where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
1861 obtain x'::"name" where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
2041 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
1862 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
2042 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
1863 have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))" |
2043 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
1864 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
2044 have eq2: "(N=Ax x c) = (([(x',x)]\<bullet>N)=Ax x' c)" |
1865 have eq2: "(N=Ax x c) = (([(x',x)]\<bullet>N)=Ax x' c)" |
2045 apply(auto simp add: calc_atm) |
1866 apply(auto simp: calc_atm) |
2046 apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) |
1867 apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) |
2047 apply(simp add: calc_atm) |
1868 apply(simp add: calc_atm) |
2048 done |
1869 done |
2049 have "(Cut <a>.M (x).N){c:=(y).P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){c:=(y).P}" |
1870 have "(Cut <a>.M (x).N){c:=(y).P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){c:=(y).P}" |
2050 using eq1 by simp |
1871 using eq1 by simp |
2053 using fs1 fs2 by (simp add: fresh_prod fresh_left calc_atm fresh_atm trm.inject) |
1874 using fs1 fs2 by (simp add: fresh_prod fresh_left calc_atm fresh_atm trm.inject) |
2054 also have "\<dots> =(if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" |
1875 also have "\<dots> =(if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" |
2055 using fs1 fs2 a |
1876 using fs1 fs2 a |
2056 apply - |
1877 apply - |
2057 apply(simp only: eq2[symmetric]) |
1878 apply(simp only: eq2[symmetric]) |
2058 apply(auto simp add: trm.inject) |
1879 apply(auto simp: trm.inject) |
2059 apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh) |
1880 apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh) |
2060 apply(simp_all add: eqvts perm_fresh_fresh calc_atm) |
1881 apply(simp_all add: eqvts perm_fresh_fresh calc_atm) |
2061 apply(auto) |
1882 apply(auto) |
2062 apply(rule subst_rename) |
1883 apply(rule subst_rename) |
2063 apply(simp add: fresh_prod fresh_atm) |
1884 apply(simp add: fresh_prod fresh_atm) |
2076 apply(subgoal_tac "Cut <a>.M (x).N = Cut <a>.M (ca).([(ca,x)]\<bullet>N)") |
1897 apply(subgoal_tac "Cut <a>.M (x).N = Cut <a>.M (ca).([(ca,x)]\<bullet>N)") |
2077 apply(simp) |
1898 apply(simp) |
2078 apply(subgoal_tac"y\<sharp>([(ca,x)]\<bullet>N)") |
1899 apply(subgoal_tac"y\<sharp>([(ca,x)]\<bullet>N)") |
2079 apply(simp add: forget) |
1900 apply(simp add: forget) |
2080 apply(simp add: trm.inject) |
1901 apply(simp add: trm.inject) |
2081 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] |
1902 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2082 apply(simp add: trm.inject) |
1903 apply(simp add: trm.inject) |
2083 apply(rule sym) |
1904 apply(rule sym) |
2084 apply(simp add: alpha fresh_prod fresh_atm) |
1905 apply(simp add: alpha fresh_prod fresh_atm) |
2085 done |
1906 done |
2086 |
1907 |
2089 shows "(NotR (x).M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.NotR (x).M a' (z).P)" |
1910 shows "(NotR (x).M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.NotR (x).M a' (z).P)" |
2090 using a |
1911 using a |
2091 apply - |
1912 apply - |
2092 apply(generate_fresh "name") |
1913 apply(generate_fresh "name") |
2093 apply(subgoal_tac "NotR (x).M d = NotR (c).([(c,x)]\<bullet>M) d") |
1914 apply(subgoal_tac "NotR (x).M d = NotR (c).([(c,x)]\<bullet>M) d") |
2094 apply(auto simp add: fresh_left calc_atm forget) |
1915 apply(auto simp: fresh_left calc_atm forget) |
2095 apply(generate_fresh "coname") |
1916 apply(generate_fresh "coname") |
2096 apply(rule_tac f="fresh_fun" in arg_cong) |
1917 apply(rule_tac f="fresh_fun" in arg_cong) |
2097 apply(simp add: fun_eq_iff) |
1918 apply(simp add: fun_eq_iff) |
2098 apply(rule allI) |
1919 apply(rule allI) |
2099 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
1920 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2105 shows "(NotL <a>.M y){y:=<c>.P} = fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')" |
1926 shows "(NotL <a>.M y){y:=<c>.P} = fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')" |
2106 using a |
1927 using a |
2107 apply - |
1928 apply - |
2108 apply(generate_fresh "coname") |
1929 apply(generate_fresh "coname") |
2109 apply(subgoal_tac "NotL <a>.M y = NotL <ca>.([(ca,a)]\<bullet>M) y") |
1930 apply(subgoal_tac "NotL <a>.M y = NotL <ca>.([(ca,a)]\<bullet>M) y") |
2110 apply(auto simp add: fresh_left calc_atm forget) |
1931 apply(auto simp: fresh_left calc_atm forget) |
2111 apply(generate_fresh "name") |
1932 apply(generate_fresh "name") |
2112 apply(rule_tac f="fresh_fun" in arg_cong) |
1933 apply(rule_tac f="fresh_fun" in arg_cong) |
2113 apply(simp add: fun_eq_iff) |
1934 apply(simp add: fun_eq_iff) |
2114 apply(rule allI) |
1935 apply(rule allI) |
2115 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
1936 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2121 shows "(AndL1 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')" |
1942 shows "(AndL1 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')" |
2122 using a |
1943 using a |
2123 apply - |
1944 apply - |
2124 apply(generate_fresh "name") |
1945 apply(generate_fresh "name") |
2125 apply(subgoal_tac "AndL1 (x).M y = AndL1 (ca).([(ca,x)]\<bullet>M) y") |
1946 apply(subgoal_tac "AndL1 (x).M y = AndL1 (ca).([(ca,x)]\<bullet>M) y") |
2126 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
1947 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2127 apply(generate_fresh "name") |
1948 apply(generate_fresh "name") |
2128 apply(rule_tac f="fresh_fun" in arg_cong) |
1949 apply(rule_tac f="fresh_fun" in arg_cong) |
2129 apply(simp add: fun_eq_iff) |
1950 apply(simp add: fun_eq_iff) |
2130 apply(rule allI) |
1951 apply(rule allI) |
2131 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
1952 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2146 shows "(AndL2 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')" |
1967 shows "(AndL2 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')" |
2147 using a |
1968 using a |
2148 apply - |
1969 apply - |
2149 apply(generate_fresh "name") |
1970 apply(generate_fresh "name") |
2150 apply(subgoal_tac "AndL2 (x).M y = AndL2 (ca).([(ca,x)]\<bullet>M) y") |
1971 apply(subgoal_tac "AndL2 (x).M y = AndL2 (ca).([(ca,x)]\<bullet>M) y") |
2151 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
1972 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2152 apply(generate_fresh "name") |
1973 apply(generate_fresh "name") |
2153 apply(rule_tac f="fresh_fun" in arg_cong) |
1974 apply(rule_tac f="fresh_fun" in arg_cong) |
2154 apply(simp add: fun_eq_iff) |
1975 apply(simp add: fun_eq_iff) |
2155 apply(rule allI) |
1976 apply(rule allI) |
2156 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
1977 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2172 using a |
1993 using a |
2173 apply - |
1994 apply - |
2174 apply(generate_fresh "coname") |
1995 apply(generate_fresh "coname") |
2175 apply(generate_fresh "coname") |
1996 apply(generate_fresh "coname") |
2176 apply(subgoal_tac "AndR <a>.M <b>.N c = AndR <ca>.([(ca,a)]\<bullet>M) <caa>.([(caa,b)]\<bullet>N) c") |
1997 apply(subgoal_tac "AndR <a>.M <b>.N c = AndR <ca>.([(ca,a)]\<bullet>M) <caa>.([(caa,b)]\<bullet>N) c") |
2177 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
1998 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2178 apply(rule trans) |
1999 apply(rule trans) |
2179 apply(rule substc.simps) |
2000 apply(rule substc.simps) |
2180 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2001 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2181 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2002 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2182 apply(auto simp add: fresh_prod fresh_atm)[1] |
2003 apply(auto simp: fresh_prod fresh_atm)[1] |
2183 apply(simp) |
2004 apply(simp) |
2184 apply(rule_tac f="fresh_fun" in arg_cong) |
2005 apply(rule_tac f="fresh_fun" in arg_cong) |
2185 apply(simp add: fun_eq_iff) |
2006 apply(simp add: fun_eq_iff) |
2186 apply(rule allI) |
2007 apply(rule allI) |
2187 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2008 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2188 apply(rule conjI) |
2009 apply(rule conjI) |
2189 apply(rule forget) |
2010 apply(rule forget) |
2190 apply(auto simp add: fresh_left calc_atm abs_fresh)[1] |
2011 apply(auto simp: fresh_left calc_atm abs_fresh)[1] |
2191 apply(rule forget) |
2012 apply(rule forget) |
2192 apply(auto simp add: fresh_left calc_atm abs_fresh)[1] |
2013 apply(auto simp: fresh_left calc_atm abs_fresh)[1] |
2193 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) |
2014 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) |
2194 apply(auto) |
2015 apply(auto) |
2195 done |
2016 done |
2196 |
2017 |
2197 lemma better_OrL_substn: |
2018 lemma better_OrL_substn: |
2200 using a |
2021 using a |
2201 apply - |
2022 apply - |
2202 apply(generate_fresh "name") |
2023 apply(generate_fresh "name") |
2203 apply(generate_fresh "name") |
2024 apply(generate_fresh "name") |
2204 apply(subgoal_tac "OrL (y).M (z).N x = OrL (ca).([(ca,y)]\<bullet>M) (caa).([(caa,z)]\<bullet>N) x") |
2025 apply(subgoal_tac "OrL (y).M (z).N x = OrL (ca).([(ca,y)]\<bullet>M) (caa).([(caa,z)]\<bullet>N) x") |
2205 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
2026 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2206 apply(rule trans) |
2027 apply(rule trans) |
2207 apply(rule substn.simps) |
2028 apply(rule substn.simps) |
2208 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2029 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2209 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2030 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] |
2210 apply(auto simp add: fresh_prod fresh_atm)[1] |
2031 apply(auto simp: fresh_prod fresh_atm)[1] |
2211 apply(simp) |
2032 apply(simp) |
2212 apply(rule_tac f="fresh_fun" in arg_cong) |
2033 apply(rule_tac f="fresh_fun" in arg_cong) |
2213 apply(simp add: fun_eq_iff) |
2034 apply(simp add: fun_eq_iff) |
2214 apply(rule allI) |
2035 apply(rule allI) |
2215 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2036 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2216 apply(rule conjI) |
2037 apply(rule conjI) |
2217 apply(rule forget) |
2038 apply(rule forget) |
2218 apply(auto simp add: fresh_left calc_atm abs_fresh)[1] |
2039 apply(auto simp: fresh_left calc_atm abs_fresh)[1] |
2219 apply(rule forget) |
2040 apply(rule forget) |
2220 apply(auto simp add: fresh_left calc_atm abs_fresh)[1] |
2041 apply(auto simp: fresh_left calc_atm abs_fresh)[1] |
2221 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) |
2042 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) |
2222 apply(auto) |
2043 apply(auto) |
2223 done |
2044 done |
2224 |
2045 |
2225 lemma better_OrR1_substc: |
2046 lemma better_OrR1_substc: |
2227 shows "(OrR1 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR1 <a>.M a' (z).P)" |
2048 shows "(OrR1 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR1 <a>.M a' (z).P)" |
2228 using a |
2049 using a |
2229 apply - |
2050 apply - |
2230 apply(generate_fresh "coname") |
2051 apply(generate_fresh "coname") |
2231 apply(subgoal_tac "OrR1 <a>.M d = OrR1 <c>.([(c,a)]\<bullet>M) d") |
2052 apply(subgoal_tac "OrR1 <a>.M d = OrR1 <c>.([(c,a)]\<bullet>M) d") |
2232 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
2053 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2233 apply(rule_tac f="fresh_fun" in arg_cong) |
2054 apply(rule_tac f="fresh_fun" in arg_cong) |
2234 apply(simp add: fun_eq_iff) |
2055 apply(simp add: fun_eq_iff) |
2235 apply(rule allI) |
2056 apply(rule allI) |
2236 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2057 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2237 apply(rule forget) |
2058 apply(rule forget) |
2251 shows "(OrR2 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR2 <a>.M a' (z).P)" |
2072 shows "(OrR2 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR2 <a>.M a' (z).P)" |
2252 using a |
2073 using a |
2253 apply - |
2074 apply - |
2254 apply(generate_fresh "coname") |
2075 apply(generate_fresh "coname") |
2255 apply(subgoal_tac "OrR2 <a>.M d = OrR2 <c>.([(c,a)]\<bullet>M) d") |
2076 apply(subgoal_tac "OrR2 <a>.M d = OrR2 <c>.([(c,a)]\<bullet>M) d") |
2256 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
2077 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2257 apply(rule_tac f="fresh_fun" in arg_cong) |
2078 apply(rule_tac f="fresh_fun" in arg_cong) |
2258 apply(simp add: fun_eq_iff) |
2079 apply(simp add: fun_eq_iff) |
2259 apply(rule allI) |
2080 apply(rule allI) |
2260 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2081 apply(simp add: trm.inject alpha fresh_prod fresh_atm) |
2261 apply(rule forget) |
2082 apply(rule forget) |
2276 using a |
2097 using a |
2277 apply - |
2098 apply - |
2278 apply(generate_fresh "coname") |
2099 apply(generate_fresh "coname") |
2279 apply(generate_fresh "name") |
2100 apply(generate_fresh "name") |
2280 apply(subgoal_tac "ImpR (x).<a>.M d = ImpR (ca).<c>.([(c,a)]\<bullet>[(ca,x)]\<bullet>M) d") |
2101 apply(subgoal_tac "ImpR (x).<a>.M d = ImpR (ca).<c>.([(c,a)]\<bullet>[(ca,x)]\<bullet>M) d") |
2281 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
2102 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2282 apply(rule_tac f="fresh_fun" in arg_cong) |
2103 apply(rule_tac f="fresh_fun" in arg_cong) |
2283 apply(simp add: fun_eq_iff) |
2104 apply(simp add: fun_eq_iff) |
2284 apply(rule allI) |
2105 apply(rule allI) |
2285 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) |
2106 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) |
2286 apply(rule forget) |
2107 apply(rule forget) |
2301 using a |
2122 using a |
2302 apply - |
2123 apply - |
2303 apply(generate_fresh "coname") |
2124 apply(generate_fresh "coname") |
2304 apply(generate_fresh "name") |
2125 apply(generate_fresh "name") |
2305 apply(subgoal_tac "ImpL <a>.M (x).N y = ImpL <ca>.([(ca,a)]\<bullet>M) (caa).([(caa,x)]\<bullet>N) y") |
2126 apply(subgoal_tac "ImpL <a>.M (x).N y = ImpL <ca>.([(ca,a)]\<bullet>M) (caa).([(caa,x)]\<bullet>N) y") |
2306 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] |
2127 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] |
2307 apply(rule_tac f="fresh_fun" in arg_cong) |
2128 apply(rule_tac f="fresh_fun" in arg_cong) |
2308 apply(simp add: fun_eq_iff) |
2129 apply(simp add: fun_eq_iff) |
2309 apply(rule allI) |
2130 apply(rule allI) |
2310 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) |
2131 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) |
2311 apply(rule forget) |
2132 apply(rule forget) |
2355 lemma substn_crename_comm: |
2176 lemma substn_crename_comm: |
2356 assumes a: "c\<noteq>a" "c\<noteq>b" |
2177 assumes a: "c\<noteq>a" "c\<noteq>b" |
2357 shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}" |
2178 shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}" |
2358 using a |
2179 using a |
2359 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) |
2180 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) |
2360 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2181 apply(auto simp: subst_fresh rename_fresh trm.inject) |
2361 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)") |
2182 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)") |
2362 apply(erule exE) |
2183 apply(erule exE) |
2363 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a") |
2184 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a") |
2364 apply(simp) |
2185 apply(simp) |
2365 apply(rule trans) |
2186 apply(rule trans) |
2379 apply(simp add: crename_id) |
2200 apply(simp add: crename_id) |
2380 apply(rule trans) |
2201 apply(rule trans) |
2381 apply(rule better_crename_Cut) |
2202 apply(rule better_crename_Cut) |
2382 apply(simp add: fresh_atm fresh_prod) |
2203 apply(simp add: fresh_atm fresh_prod) |
2383 apply(simp add: rename_fresh fresh_atm) |
2204 apply(simp add: rename_fresh fresh_atm) |
2384 apply(auto simp add: fresh_atm)[1] |
2205 apply(auto simp: fresh_atm)[1] |
2385 apply(rule trans) |
2206 apply(rule trans) |
2386 apply(rule better_crename_Cut) |
2207 apply(rule better_crename_Cut) |
2387 apply(simp add: fresh_atm) |
2208 apply(simp add: fresh_atm) |
2388 apply(auto simp add: fresh_atm)[1] |
2209 apply(auto simp: fresh_atm)[1] |
2389 apply(drule crename_ax) |
2210 apply(drule crename_ax) |
2390 apply(simp add: fresh_atm) |
2211 apply(simp add: fresh_atm) |
2391 apply(simp add: fresh_atm) |
2212 apply(simp add: fresh_atm) |
2392 apply(simp) |
2213 apply(simp) |
2393 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],x,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]})") |
2214 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],x,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]})") |
2447 lemma substc_crename_comm: |
2268 lemma substc_crename_comm: |
2448 assumes a: "c\<noteq>a" "c\<noteq>b" |
2269 assumes a: "c\<noteq>a" "c\<noteq>b" |
2449 shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}" |
2270 shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}" |
2450 using a |
2271 using a |
2451 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) |
2272 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) |
2452 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2273 apply(auto simp: subst_fresh rename_fresh trm.inject) |
2453 apply(rule trans) |
2274 apply(rule trans) |
2454 apply(rule better_crename_Cut) |
2275 apply(rule better_crename_Cut) |
2455 apply(simp add: fresh_atm fresh_prod) |
2276 apply(simp add: fresh_atm fresh_prod) |
2456 apply(simp add: rename_fresh fresh_atm) |
2277 apply(simp add: rename_fresh fresh_atm) |
2457 apply(rule trans) |
2278 apply(rule trans) |
2521 lemma substn_nrename_comm: |
2342 lemma substn_nrename_comm: |
2522 assumes a: "x\<noteq>y" "x\<noteq>z" |
2343 assumes a: "x\<noteq>y" "x\<noteq>z" |
2523 shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}" |
2344 shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}" |
2524 using a |
2345 using a |
2525 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) |
2346 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) |
2526 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2347 apply(auto simp: subst_fresh rename_fresh trm.inject) |
2527 apply(rule trans) |
2348 apply(rule trans) |
2528 apply(rule better_nrename_Cut) |
2349 apply(rule better_nrename_Cut) |
2529 apply(simp add: fresh_prod fresh_atm) |
2350 apply(simp add: fresh_prod fresh_atm) |
2530 apply(simp add: trm.inject) |
2351 apply(simp add: trm.inject) |
2531 apply(rule trans) |
2352 apply(rule trans) |
2593 lemma substc_nrename_comm: |
2414 lemma substc_nrename_comm: |
2594 assumes a: "x\<noteq>y" "x\<noteq>z" |
2415 assumes a: "x\<noteq>y" "x\<noteq>z" |
2595 shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}" |
2416 shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}" |
2596 using a |
2417 using a |
2597 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) |
2418 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) |
2598 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2419 apply(auto simp: subst_fresh rename_fresh trm.inject) |
2599 apply(rule trans) |
2420 apply(rule trans) |
2600 apply(rule better_nrename_Cut) |
2421 apply(rule better_nrename_Cut) |
2601 apply(simp add: fresh_atm fresh_prod) |
2422 apply(simp add: fresh_atm fresh_prod) |
2602 apply(simp add: rename_fresh fresh_atm) |
2423 apply(simp add: rename_fresh fresh_atm) |
2603 apply(rule trans) |
2424 apply(rule trans) |
2863 and x::"name" |
2684 and x::"name" |
2864 and \<Gamma>::"ctxtn" |
2685 and \<Gamma>::"ctxtn" |
2865 and \<Delta>::"ctxtc" |
2686 and \<Delta>::"ctxtc" |
2866 shows "a\<sharp>\<Gamma>" and "x\<sharp>\<Delta>" |
2687 shows "a\<sharp>\<Gamma>" and "x\<sharp>\<Delta>" |
2867 proof - |
2688 proof - |
2868 show "a\<sharp>\<Gamma>" by (induct \<Gamma>) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) |
2689 show "a\<sharp>\<Gamma>" by (induct \<Gamma>) (auto simp: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) |
2869 next |
2690 next |
2870 show "x\<sharp>\<Delta>" by (induct \<Delta>) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) |
2691 show "x\<sharp>\<Delta>" by (induct \<Delta>) (auto simp: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) |
2871 qed |
2692 qed |
2872 |
2693 |
2873 text \<open>cut-reductions\<close> |
2694 text \<open>cut-reductions\<close> |
2874 |
2695 |
2875 declare abs_perm[eqvt] |
2696 declare abs_perm[eqvt] |
2889 lemma fin_Ax_elim: |
2710 lemma fin_Ax_elim: |
2890 assumes a: "fin (Ax x a) y" |
2711 assumes a: "fin (Ax x a) y" |
2891 shows "x=y" |
2712 shows "x=y" |
2892 using a |
2713 using a |
2893 apply(erule_tac fin.cases) |
2714 apply(erule_tac fin.cases) |
2894 apply(auto simp add: trm.inject) |
2715 apply(auto simp: trm.inject) |
2895 done |
2716 done |
2896 |
2717 |
2897 lemma fin_NotL_elim: |
2718 lemma fin_NotL_elim: |
2898 assumes a: "fin (NotL <a>.M x) y" |
2719 assumes a: "fin (NotL <a>.M x) y" |
2899 shows "x=y \<and> x\<sharp>M" |
2720 shows "x=y \<and> x\<sharp>M" |
2900 using a |
2721 using a |
2901 apply(erule_tac fin.cases) |
2722 apply(erule_tac fin.cases) |
2902 apply(auto simp add: trm.inject) |
2723 apply(auto simp: trm.inject) |
2903 apply(subgoal_tac "y\<sharp>[aa].Ma") |
2724 apply(subgoal_tac "y\<sharp>[aa].Ma") |
2904 apply(drule sym) |
2725 apply(drule sym) |
2905 apply(simp_all add: abs_fresh) |
2726 apply(simp_all add: abs_fresh) |
2906 done |
2727 done |
2907 |
2728 |
2908 lemma fin_AndL1_elim: |
2729 lemma fin_AndL1_elim: |
2909 assumes a: "fin (AndL1 (x).M y) z" |
2730 assumes a: "fin (AndL1 (x).M y) z" |
2910 shows "z=y \<and> z\<sharp>[x].M" |
2731 shows "z=y \<and> z\<sharp>[x].M" |
2911 using a |
2732 using a |
2912 apply(erule_tac fin.cases) |
2733 apply(erule_tac fin.cases) |
2913 apply(auto simp add: trm.inject) |
2734 apply(auto simp: trm.inject) |
2914 done |
2735 done |
2915 |
2736 |
2916 lemma fin_AndL2_elim: |
2737 lemma fin_AndL2_elim: |
2917 assumes a: "fin (AndL2 (x).M y) z" |
2738 assumes a: "fin (AndL2 (x).M y) z" |
2918 shows "z=y \<and> z\<sharp>[x].M" |
2739 shows "z=y \<and> z\<sharp>[x].M" |
2919 using a |
2740 using a |
2920 apply(erule_tac fin.cases) |
2741 apply(erule_tac fin.cases) |
2921 apply(auto simp add: trm.inject) |
2742 apply(auto simp: trm.inject) |
2922 done |
2743 done |
2923 |
2744 |
2924 lemma fin_OrL_elim: |
2745 lemma fin_OrL_elim: |
2925 assumes a: "fin (OrL (x).M (y).N u) z" |
2746 assumes a: "fin (OrL (x).M (y).N u) z" |
2926 shows "z=u \<and> z\<sharp>[x].M \<and> z\<sharp>[y].N" |
2747 shows "z=u \<and> z\<sharp>[x].M \<and> z\<sharp>[y].N" |
2927 using a |
2748 using a |
2928 apply(erule_tac fin.cases) |
2749 apply(erule_tac fin.cases) |
2929 apply(auto simp add: trm.inject) |
2750 apply(auto simp: trm.inject) |
2930 done |
2751 done |
2931 |
2752 |
2932 lemma fin_ImpL_elim: |
2753 lemma fin_ImpL_elim: |
2933 assumes a: "fin (ImpL <a>.M (x).N z) y" |
2754 assumes a: "fin (ImpL <a>.M (x).N z) y" |
2934 shows "z=y \<and> z\<sharp>M \<and> z\<sharp>[x].N" |
2755 shows "z=y \<and> z\<sharp>M \<and> z\<sharp>[x].N" |
2935 using a |
2756 using a |
2936 apply(erule_tac fin.cases) |
2757 apply(erule_tac fin.cases) |
2937 apply(auto simp add: trm.inject) |
2758 apply(auto simp: trm.inject) |
2938 apply(subgoal_tac "y\<sharp>[aa].Ma") |
2759 apply(subgoal_tac "y\<sharp>[aa].Ma") |
2939 apply(drule sym) |
2760 apply(drule sym) |
2940 apply(simp_all add: abs_fresh) |
2761 apply(simp_all add: abs_fresh) |
2941 apply (metis abs_fresh(5)) |
2762 apply (metis abs_fresh(5)) |
2942 done |
2763 done |
2955 fin_ImpL_elim fin_rest_elims |
2776 fin_ImpL_elim fin_rest_elims |
2956 |
2777 |
2957 lemma fin_rename: |
2778 lemma fin_rename: |
2958 shows "fin M x \<Longrightarrow> fin ([(x',x)]\<bullet>M) x'" |
2779 shows "fin M x \<Longrightarrow> fin ([(x',x)]\<bullet>M) x'" |
2959 by (induct rule: fin.induct) |
2780 by (induct rule: fin.induct) |
2960 (auto simp add: calc_atm simp add: fresh_left abs_fresh) |
2781 (auto simp: calc_atm simp add: fresh_left abs_fresh) |
2961 |
2782 |
2962 lemma not_fin_subst1: |
2783 lemma not_fin_subst1: |
2963 assumes a: "\<not>(fin M x)" |
2784 assumes a: "\<not>(fin M x)" |
2964 shows "\<not>(fin (M{c:=(y).P}) x)" |
2785 shows "\<not>(fin (M{c:=(y).P}) x)" |
2965 using a [[simproc del: defined_all]] |
2786 using a [[simproc del: defined_all]] |
2993 apply(simp add: fresh_fun_simp_AndR) |
2814 apply(simp add: fresh_fun_simp_AndR) |
2994 apply(erule fin.cases, simp_all add: trm.inject) |
2815 apply(erule fin.cases, simp_all add: trm.inject) |
2995 apply(rule exists_fresh'(2)[OF fs_coname1]) |
2816 apply(rule exists_fresh'(2)[OF fs_coname1]) |
2996 apply(erule fin.cases, simp_all add: trm.inject) |
2817 apply(erule fin.cases, simp_all add: trm.inject) |
2997 apply(drule fin_AndL1_elim) |
2818 apply(drule fin_AndL1_elim) |
2998 apply(auto simp add: abs_fresh)[1] |
2819 apply(auto simp: abs_fresh)[1] |
2999 apply(drule freshn_after_substc) |
2820 apply(drule freshn_after_substc) |
3000 apply(subgoal_tac "name2\<sharp>[name1]. trm") |
2821 apply(subgoal_tac "name2\<sharp>[name1]. trm") |
3001 apply(simp add: fin.intros) |
2822 apply(simp add: fin.intros) |
3002 apply(simp add: abs_fresh) |
2823 apply(simp add: abs_fresh) |
3003 apply(drule fin_AndL2_elim) |
2824 apply(drule fin_AndL2_elim) |
3004 apply(auto simp add: abs_fresh)[1] |
2825 apply(auto simp: abs_fresh)[1] |
3005 apply(drule freshn_after_substc) |
2826 apply(drule freshn_after_substc) |
3006 apply(subgoal_tac "name2\<sharp>[name1].trm") |
2827 apply(subgoal_tac "name2\<sharp>[name1].trm") |
3007 apply(simp add: fin.intros) |
2828 apply(simp add: fin.intros) |
3008 apply(simp add: abs_fresh) |
2829 apply(simp add: abs_fresh) |
3009 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)") |
2830 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)") |
3021 apply(simp add: fresh_fun_simp_OrR2) |
2842 apply(simp add: fresh_fun_simp_OrR2) |
3022 apply(erule fin.cases, simp_all add: trm.inject) |
2843 apply(erule fin.cases, simp_all add: trm.inject) |
3023 apply(rule exists_fresh'(2)[OF fs_coname1]) |
2844 apply(rule exists_fresh'(2)[OF fs_coname1]) |
3024 apply(erule fin.cases, simp_all add: trm.inject) |
2845 apply(erule fin.cases, simp_all add: trm.inject) |
3025 apply(drule fin_OrL_elim) |
2846 apply(drule fin_OrL_elim) |
3026 apply(auto simp add: abs_fresh)[1] |
2847 apply(auto simp: abs_fresh)[1] |
3027 apply(drule freshn_after_substc)+ |
2848 apply(drule freshn_after_substc)+ |
3028 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2") |
2849 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2") |
3029 apply(simp add: fin.intros) |
2850 apply(simp add: fin.intros) |
3030 apply(simp add: abs_fresh) |
2851 apply(simp add: abs_fresh) |
3031 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)") |
2852 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)") |
3035 apply(simp add: fresh_fun_simp_ImpR) |
2856 apply(simp add: fresh_fun_simp_ImpR) |
3036 apply(erule fin.cases, simp_all add: trm.inject) |
2857 apply(erule fin.cases, simp_all add: trm.inject) |
3037 apply(rule exists_fresh'(2)[OF fs_coname1]) |
2858 apply(rule exists_fresh'(2)[OF fs_coname1]) |
3038 apply(erule fin.cases, simp_all add: trm.inject) |
2859 apply(erule fin.cases, simp_all add: trm.inject) |
3039 apply(drule fin_ImpL_elim) |
2860 apply(drule fin_ImpL_elim) |
3040 apply(auto simp add: abs_fresh)[1] |
2861 apply(auto simp: abs_fresh)[1] |
3041 apply(drule freshn_after_substc)+ |
2862 apply(drule freshn_after_substc)+ |
3042 apply(subgoal_tac "x\<sharp>[name1].trm2") |
2863 apply(subgoal_tac "x\<sharp>[name1].trm2") |
3043 apply(simp add: fin.intros) |
2864 apply(simp add: fin.intros) |
3044 apply(simp add: abs_fresh) |
2865 apply(simp add: abs_fresh) |
3045 done |
2866 done |
3073 apply(erule conjE)+ |
2894 apply(erule conjE)+ |
3074 apply(simp add: fresh_fun_simp_AndL1) |
2895 apply(simp add: fresh_fun_simp_AndL1) |
3075 apply(erule fin.cases, simp_all add: trm.inject) |
2896 apply(erule fin.cases, simp_all add: trm.inject) |
3076 apply(rule exists_fresh'(1)[OF fs_name1]) |
2897 apply(rule exists_fresh'(1)[OF fs_name1]) |
3077 apply(drule fin_AndL1_elim) |
2898 apply(drule fin_AndL1_elim) |
3078 apply(auto simp add: abs_fresh)[1] |
2899 apply(auto simp: abs_fresh)[1] |
3079 apply(drule freshn_after_substn) |
2900 apply(drule freshn_after_substn) |
3080 apply(simp) |
2901 apply(simp) |
3081 apply(subgoal_tac "name2\<sharp>[name1]. trm") |
2902 apply(subgoal_tac "name2\<sharp>[name1]. trm") |
3082 apply(simp add: fin.intros) |
2903 apply(simp add: fin.intros) |
3083 apply(simp add: abs_fresh) |
2904 apply(simp add: abs_fresh) |
3087 apply(erule conjE)+ |
2908 apply(erule conjE)+ |
3088 apply(simp add: fresh_fun_simp_AndL2) |
2909 apply(simp add: fresh_fun_simp_AndL2) |
3089 apply(erule fin.cases, simp_all add: trm.inject) |
2910 apply(erule fin.cases, simp_all add: trm.inject) |
3090 apply(rule exists_fresh'(1)[OF fs_name1]) |
2911 apply(rule exists_fresh'(1)[OF fs_name1]) |
3091 apply(drule fin_AndL2_elim) |
2912 apply(drule fin_AndL2_elim) |
3092 apply(auto simp add: abs_fresh)[1] |
2913 apply(auto simp: abs_fresh)[1] |
3093 apply(drule freshn_after_substn) |
2914 apply(drule freshn_after_substn) |
3094 apply(simp) |
2915 apply(simp) |
3095 apply(subgoal_tac "name2\<sharp>[name1].trm") |
2916 apply(subgoal_tac "name2\<sharp>[name1].trm") |
3096 apply(simp add: fin.intros) |
2917 apply(simp add: fin.intros) |
3097 apply(simp add: abs_fresh) |
2918 apply(simp add: abs_fresh) |
3103 apply(erule conjE)+ |
2924 apply(erule conjE)+ |
3104 apply(simp add: fresh_fun_simp_OrL) |
2925 apply(simp add: fresh_fun_simp_OrL) |
3105 apply(erule fin.cases, simp_all add: trm.inject) |
2926 apply(erule fin.cases, simp_all add: trm.inject) |
3106 apply(rule exists_fresh'(1)[OF fs_name1]) |
2927 apply(rule exists_fresh'(1)[OF fs_name1]) |
3107 apply(drule fin_OrL_elim) |
2928 apply(drule fin_OrL_elim) |
3108 apply(auto simp add: abs_fresh)[1] |
2929 apply(auto simp: abs_fresh)[1] |
3109 apply(drule freshn_after_substn) |
2930 apply(drule freshn_after_substn) |
3110 apply(simp) |
2931 apply(simp) |
3111 apply(drule freshn_after_substn) |
2932 apply(drule freshn_after_substn) |
3112 apply(simp) |
2933 apply(simp) |
3113 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2") |
2934 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2") |
3120 apply(erule conjE)+ |
2941 apply(erule conjE)+ |
3121 apply(simp add: fresh_fun_simp_ImpL) |
2942 apply(simp add: fresh_fun_simp_ImpL) |
3122 apply(erule fin.cases, simp_all add: trm.inject) |
2943 apply(erule fin.cases, simp_all add: trm.inject) |
3123 apply(rule exists_fresh'(1)[OF fs_name1]) |
2944 apply(rule exists_fresh'(1)[OF fs_name1]) |
3124 apply(drule fin_ImpL_elim) |
2945 apply(drule fin_ImpL_elim) |
3125 apply(auto simp add: abs_fresh)[1] |
2946 apply(auto simp: abs_fresh)[1] |
3126 apply(drule freshn_after_substn) |
2947 apply(drule freshn_after_substn) |
3127 apply(simp) |
2948 apply(simp) |
3128 apply(drule freshn_after_substn) |
2949 apply(drule freshn_after_substn) |
3129 apply(simp) |
2950 apply(simp) |
3130 apply(subgoal_tac "x\<sharp>[name1].trm2") |
2951 apply(subgoal_tac "x\<sharp>[name1].trm2") |
3313 lemma fic_Ax_elim: |
3134 lemma fic_Ax_elim: |
3314 assumes a: "fic (Ax x a) b" |
3135 assumes a: "fic (Ax x a) b" |
3315 shows "a=b" |
3136 shows "a=b" |
3316 using a |
3137 using a |
3317 apply(erule_tac fic.cases) |
3138 apply(erule_tac fic.cases) |
3318 apply(auto simp add: trm.inject) |
3139 apply(auto simp: trm.inject) |
3319 done |
3140 done |
3320 |
3141 |
3321 lemma fic_NotR_elim: |
3142 lemma fic_NotR_elim: |
3322 assumes a: "fic (NotR (x).M a) b" |
3143 assumes a: "fic (NotR (x).M a) b" |
3323 shows "a=b \<and> b\<sharp>M" |
3144 shows "a=b \<and> b\<sharp>M" |
3324 using a |
3145 using a |
3325 apply(erule_tac fic.cases) |
3146 apply(erule_tac fic.cases) |
3326 apply(auto simp add: trm.inject) |
3147 apply(auto simp: trm.inject) |
3327 apply(subgoal_tac "b\<sharp>[xa].Ma") |
3148 apply(subgoal_tac "b\<sharp>[xa].Ma") |
3328 apply(drule sym) |
3149 apply(drule sym) |
3329 apply(simp_all add: abs_fresh) |
3150 apply(simp_all add: abs_fresh) |
3330 done |
3151 done |
3331 |
3152 |
3332 lemma fic_OrR1_elim: |
3153 lemma fic_OrR1_elim: |
3333 assumes a: "fic (OrR1 <a>.M b) c" |
3154 assumes a: "fic (OrR1 <a>.M b) c" |
3334 shows "b=c \<and> c\<sharp>[a].M" |
3155 shows "b=c \<and> c\<sharp>[a].M" |
3335 using a |
3156 using a |
3336 apply(erule_tac fic.cases) |
3157 apply(erule_tac fic.cases) |
3337 apply(auto simp add: trm.inject) |
3158 apply(auto simp: trm.inject) |
3338 done |
3159 done |
3339 |
3160 |
3340 lemma fic_OrR2_elim: |
3161 lemma fic_OrR2_elim: |
3341 assumes a: "fic (OrR2 <a>.M b) c" |
3162 assumes a: "fic (OrR2 <a>.M b) c" |
3342 shows "b=c \<and> c\<sharp>[a].M" |
3163 shows "b=c \<and> c\<sharp>[a].M" |
3343 using a |
3164 using a |
3344 apply(erule_tac fic.cases) |
3165 apply(erule_tac fic.cases) |
3345 apply(auto simp add: trm.inject) |
3166 apply(auto simp: trm.inject) |
3346 done |
3167 done |
3347 |
3168 |
3348 lemma fic_AndR_elim: |
3169 lemma fic_AndR_elim: |
3349 assumes a: "fic (AndR <a>.M <b>.N c) d" |
3170 assumes a: "fic (AndR <a>.M <b>.N c) d" |
3350 shows "c=d \<and> d\<sharp>[a].M \<and> d\<sharp>[b].N" |
3171 shows "c=d \<and> d\<sharp>[a].M \<and> d\<sharp>[b].N" |
3351 using a |
3172 using a |
3352 apply(erule_tac fic.cases) |
3173 apply(erule_tac fic.cases) |
3353 apply(auto simp add: trm.inject) |
3174 apply(auto simp: trm.inject) |
3354 done |
3175 done |
3355 |
3176 |
3356 lemma fic_ImpR_elim: |
3177 lemma fic_ImpR_elim: |
3357 assumes a: "fic (ImpR (x).<a>.M b) c" |
3178 assumes a: "fic (ImpR (x).<a>.M b) c" |
3358 shows "b=c \<and> b\<sharp>[a].M" |
3179 shows "b=c \<and> b\<sharp>[a].M" |
3359 using a |
3180 using a |
3360 apply(erule_tac fic.cases) |
3181 apply(erule_tac fic.cases) |
3361 apply(auto simp add: trm.inject) |
3182 apply(auto simp: trm.inject) |
3362 apply(subgoal_tac "c\<sharp>[xa].[aa].Ma") |
3183 apply(subgoal_tac "c\<sharp>[xa].[aa].Ma") |
3363 apply(drule sym) |
3184 apply(drule sym) |
3364 apply(simp_all add: abs_fresh) |
3185 apply(simp_all add: abs_fresh) |
3365 done |
3186 done |
3366 |
3187 |
3377 fic_ImpR_elim fic_rest_elims |
3198 fic_ImpR_elim fic_rest_elims |
3378 |
3199 |
3379 lemma fic_rename: |
3200 lemma fic_rename: |
3380 shows "fic M a \<Longrightarrow> fic ([(a',a)]\<bullet>M) a'" |
3201 shows "fic M a \<Longrightarrow> fic ([(a',a)]\<bullet>M) a'" |
3381 by (induct rule: fic.induct) |
3202 by (induct rule: fic.induct) |
3382 (auto simp add: calc_atm simp add: fresh_left abs_fresh) |
3203 (auto simp: calc_atm simp add: fresh_left abs_fresh) |
3383 |
3204 |
3384 lemma not_fic_subst1: |
3205 lemma not_fic_subst1: |
3385 assumes a: "\<not>(fic M a)" |
3206 assumes a: "\<not>(fic M a)" |
3386 shows "\<not>(fic (M{y:=<c>.P}) a)" |
3207 shows "\<not>(fic (M{y:=<c>.P}) a)" |
3387 using a |
3208 using a |
3732 and a::"coname" |
3553 and a::"coname" |
3733 shows "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'" |
3554 shows "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'" |
3734 and "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> a\<sharp>M \<Longrightarrow> a\<sharp>M'" |
3555 and "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> a\<sharp>M \<Longrightarrow> a\<sharp>M'" |
3735 apply - |
3556 apply - |
3736 apply(induct rule: l_redu.induct) |
3557 apply(induct rule: l_redu.induct) |
3737 apply(auto simp add: abs_fresh rename_fresh) |
3558 apply(auto simp: abs_fresh rename_fresh) |
3738 apply(case_tac "xa=x") |
3559 apply(case_tac "xa=x") |
3739 apply(simp add: rename_fresh) |
3560 apply(simp add: rename_fresh) |
3740 apply(simp add: rename_fresh fresh_atm) |
3561 apply(simp add: rename_fresh fresh_atm) |
3741 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+ |
3562 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+ |
3742 apply(induct rule: l_redu.induct) |
3563 apply(induct rule: l_redu.induct) |
3743 apply(auto simp add: abs_fresh rename_fresh) |
3564 apply(auto simp: abs_fresh rename_fresh) |
3744 apply(case_tac "aa=a") |
3565 apply(case_tac "aa=a") |
3745 apply(simp add: rename_fresh) |
3566 apply(simp add: rename_fresh) |
3746 apply(simp add: rename_fresh fresh_atm) |
3567 apply(simp add: rename_fresh fresh_atm) |
3747 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+ |
3568 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+ |
3748 done |
3569 done |
3752 proof - |
3573 proof - |
3753 assume fin: "fic M a" |
3574 assume fin: "fic M a" |
3754 obtain x'::"name" where fs1: "x'\<sharp>(M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
3575 obtain x'::"name" where fs1: "x'\<sharp>(M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
3755 obtain a'::"coname" where fs2: "a'\<sharp>(a,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) |
3576 obtain a'::"coname" where fs2: "a'\<sharp>(a,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) |
3756 have "Cut <a>.M (x).(Ax x b) = Cut <a'>.([(a',a)]\<bullet>M) (x').(Ax x' b)" |
3577 have "Cut <a>.M (x).(Ax x b) = Cut <a'>.([(a',a)]\<bullet>M) (x').(Ax x' b)" |
3757 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3578 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3758 also have "\<dots> \<longrightarrow>\<^sub>l ([(a',a)]\<bullet>M)[a'\<turnstile>c>b]" using fs1 fs2 fin |
3579 also have "\<dots> \<longrightarrow>\<^sub>l ([(a',a)]\<bullet>M)[a'\<turnstile>c>b]" using fs1 fs2 fin |
3759 by (auto intro: l_redu.intros simp add: fresh_left calc_atm fic_rename) |
3580 by (auto intro: l_redu.intros simp add: fresh_left calc_atm fic_rename) |
3760 also have "\<dots> = M[a\<turnstile>c>b]" using fs1 fs2 by (simp add: crename_rename) |
3581 also have "\<dots> = M[a\<turnstile>c>b]" using fs1 fs2 by (simp add: crename_rename) |
3761 finally show ?thesis by simp |
3582 finally show ?thesis by simp |
3762 qed |
3583 qed |
3766 proof - |
3587 proof - |
3767 assume fin: "fin M x" |
3588 assume fin: "fin M x" |
3768 obtain x'::"name" where fs1: "x'\<sharp>(y,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
3589 obtain x'::"name" where fs1: "x'\<sharp>(y,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
3769 obtain a'::"coname" where fs2: "a'\<sharp>(a,M)" by (rule exists_fresh(2), rule fin_supp, blast) |
3590 obtain a'::"coname" where fs2: "a'\<sharp>(a,M)" by (rule exists_fresh(2), rule fin_supp, blast) |
3770 have "Cut <a>.(Ax y a) (x).M = Cut <a'>.(Ax y a') (x').([(x',x)]\<bullet>M)" |
3591 have "Cut <a>.(Ax y a) (x).M = Cut <a'>.(Ax y a') (x').([(x',x)]\<bullet>M)" |
3771 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3592 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3772 also have "\<dots> \<longrightarrow>\<^sub>l ([(x',x)]\<bullet>M)[x'\<turnstile>n>y]" using fs1 fs2 fin |
3593 also have "\<dots> \<longrightarrow>\<^sub>l ([(x',x)]\<bullet>M)[x'\<turnstile>n>y]" using fs1 fs2 fin |
3773 by (auto intro: l_redu.intros simp add: fresh_left calc_atm fin_rename) |
3594 by (auto intro: l_redu.intros simp add: fresh_left calc_atm fin_rename) |
3774 also have "\<dots> = M[x\<turnstile>n>y]" using fs1 fs2 by (simp add: nrename_rename) |
3595 also have "\<dots> = M[x\<turnstile>n>y]" using fs1 fs2 by (simp add: nrename_rename) |
3775 finally show ?thesis by simp |
3596 finally show ?thesis by simp |
3776 qed |
3597 qed |
3784 obtain a'::"coname" where f3: "a'\<sharp>(a,M,N,b)" by (rule exists_fresh(2), rule fin_supp, blast) |
3605 obtain a'::"coname" where f3: "a'\<sharp>(a,M,N,b)" by (rule exists_fresh(2), rule fin_supp, blast) |
3785 obtain b'::"coname" where f4: "b'\<sharp>(a,M,N,b,a')" by (rule exists_fresh(2), rule fin_supp, blast) |
3606 obtain b'::"coname" where f4: "b'\<sharp>(a,M,N,b,a')" by (rule exists_fresh(2), rule fin_supp, blast) |
3786 have "Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) |
3607 have "Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) |
3787 = Cut <a'>.(NotR (x).([(a',a)]\<bullet>M) a') (y').(NotL <b>.([(y',y)]\<bullet>N) y')" |
3608 = Cut <a'>.(NotR (x).([(a',a)]\<bullet>M) a') (y').(NotL <b>.([(y',y)]\<bullet>N) y')" |
3788 using f1 f2 f3 f4 |
3609 using f1 f2 f3 f4 |
3789 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm abs_fresh) |
3610 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm abs_fresh) |
3790 also have "\<dots> = Cut <a'>.(NotR (x).M a') (y').(NotL <b>.N y')" |
3611 also have "\<dots> = Cut <a'>.(NotR (x).M a') (y').(NotL <b>.N y')" |
3791 using f1 f2 f3 f4 fs by (perm_simp) |
3612 using f1 f2 f3 f4 fs by (perm_simp) |
3792 also have "\<dots> = Cut <a'>.(NotR (x').([(x',x)]\<bullet>M) a') (y').(NotL <b'>.([(b',b)]\<bullet>N) y')" |
3613 also have "\<dots> = Cut <a'>.(NotR (x').([(x',x)]\<bullet>M) a') (y').(NotL <b'>.([(b',b)]\<bullet>N) y')" |
3793 using f1 f2 f3 f4 |
3614 using f1 f2 f3 f4 |
3794 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3615 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3795 also have "\<dots> \<longrightarrow>\<^sub>l Cut <b'>.([(b',b)]\<bullet>N) (x').([(x',x)]\<bullet>M)" |
3616 also have "\<dots> \<longrightarrow>\<^sub>l Cut <b'>.([(b',b)]\<bullet>N) (x').([(x',x)]\<bullet>M)" |
3796 using f1 f2 f3 f4 fs |
3617 using f1 f2 f3 f4 fs |
3797 by (auto intro: l_redu.intros simp add: fresh_prod fresh_left calc_atm fresh_atm) |
3618 by (auto intro: l_redu.intros simp add: fresh_prod fresh_left calc_atm fresh_atm) |
3798 also have "\<dots> = Cut <b>.N (x).M" |
3619 also have "\<dots> = Cut <b>.N (x).M" |
3799 using f1 f2 f3 f4 by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3620 using f1 f2 f3 f4 by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3800 finally show ?thesis by simp |
3621 finally show ?thesis by simp |
3801 qed |
3622 qed |
3802 |
3623 |
3803 lemma better_LAnd1_intro[intro]: |
3624 lemma better_LAnd1_intro[intro]: |
3804 shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> |
3625 shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> |
3813 have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL1 (x).N y) |
3634 have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL1 (x).N y) |
3814 = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL1 (x).N y')" |
3635 = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL1 (x).N y')" |
3815 using f1 f2 f3 f4 fs |
3636 using f1 f2 f3 f4 fs |
3816 apply(rule_tac sym) |
3637 apply(rule_tac sym) |
3817 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3638 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3818 apply(auto simp add: perm_fresh_fresh) |
3639 apply(auto simp: perm_fresh_fresh) |
3819 done |
3640 done |
3820 also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') |
3641 also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') |
3821 (y').(AndL1 (x').([(x',x)]\<bullet>N) y')" |
3642 (y').(AndL1 (x').([(x',x)]\<bullet>N) y')" |
3822 using f1 f2 f3 f4 f5 fs |
3643 using f1 f2 f3 f4 f5 fs |
3823 apply(rule_tac sym) |
3644 apply(rule_tac sym) |
3825 done |
3646 done |
3826 also have "\<dots> \<longrightarrow>\<^sub>l Cut <b1'>.([(b1',b1)]\<bullet>M1) (x').([(x',x)]\<bullet>N)" |
3647 also have "\<dots> \<longrightarrow>\<^sub>l Cut <b1'>.([(b1',b1)]\<bullet>M1) (x').([(x',x)]\<bullet>N)" |
3827 using f1 f2 f3 f4 f5 fs |
3648 using f1 f2 f3 f4 f5 fs |
3828 apply - |
3649 apply - |
3829 apply(rule l_redu.intros) |
3650 apply(rule l_redu.intros) |
3830 apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3651 apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3831 done |
3652 done |
3832 also have "\<dots> = Cut <b1>.M1 (x).N" |
3653 also have "\<dots> = Cut <b1>.M1 (x).N" |
3833 using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3654 using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3834 finally show ?thesis by simp |
3655 finally show ?thesis by simp |
3835 qed |
3656 qed |
3836 |
3657 |
3837 lemma better_LAnd2_intro[intro]: |
3658 lemma better_LAnd2_intro[intro]: |
3838 shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> |
3659 shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> |
3847 have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL2 (x).N y) |
3668 have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL2 (x).N y) |
3848 = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL2 (x).N y')" |
3669 = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL2 (x).N y')" |
3849 using f1 f2 f3 f4 fs |
3670 using f1 f2 f3 f4 fs |
3850 apply(rule_tac sym) |
3671 apply(rule_tac sym) |
3851 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3672 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3852 apply(auto simp add: perm_fresh_fresh) |
3673 apply(auto simp: perm_fresh_fresh) |
3853 done |
3674 done |
3854 also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') |
3675 also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') |
3855 (y').(AndL2 (x').([(x',x)]\<bullet>N) y')" |
3676 (y').(AndL2 (x').([(x',x)]\<bullet>N) y')" |
3856 using f1 f2 f3 f4 f5 fs |
3677 using f1 f2 f3 f4 f5 fs |
3857 apply(rule_tac sym) |
3678 apply(rule_tac sym) |
3859 done |
3680 done |
3860 also have "\<dots> \<longrightarrow>\<^sub>l Cut <b2'>.([(b2',b2)]\<bullet>M2) (x').([(x',x)]\<bullet>N)" |
3681 also have "\<dots> \<longrightarrow>\<^sub>l Cut <b2'>.([(b2',b2)]\<bullet>M2) (x').([(x',x)]\<bullet>N)" |
3861 using f1 f2 f3 f4 f5 fs |
3682 using f1 f2 f3 f4 f5 fs |
3862 apply - |
3683 apply - |
3863 apply(rule l_redu.intros) |
3684 apply(rule l_redu.intros) |
3864 apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3685 apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3865 done |
3686 done |
3866 also have "\<dots> = Cut <b2>.M2 (x).N" |
3687 also have "\<dots> = Cut <b2>.M2 (x).N" |
3867 using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3688 using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3868 finally show ?thesis by simp |
3689 finally show ?thesis by simp |
3869 qed |
3690 qed |
3870 |
3691 |
3871 lemma better_LOr1_intro[intro]: |
3692 lemma better_LOr1_intro[intro]: |
3872 shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> |
3693 shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> |
3881 have "Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) |
3702 have "Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) |
3882 = Cut <b'>.(OrR1 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')" |
3703 = Cut <b'>.(OrR1 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')" |
3883 using f1 f2 f3 f4 f5 fs |
3704 using f1 f2 f3 f4 f5 fs |
3884 apply(rule_tac sym) |
3705 apply(rule_tac sym) |
3885 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3706 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3886 apply(auto simp add: perm_fresh_fresh) |
3707 apply(auto simp: perm_fresh_fresh) |
3887 done |
3708 done |
3888 also have "\<dots> = Cut <b'>.(OrR1 <a'>.([(a',a)]\<bullet>M) b') |
3709 also have "\<dots> = Cut <b'>.(OrR1 <a'>.([(a',a)]\<bullet>M) b') |
3889 (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')" |
3710 (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')" |
3890 using f1 f2 f3 f4 f5 fs |
3711 using f1 f2 f3 f4 f5 fs |
3891 apply(rule_tac sym) |
3712 apply(rule_tac sym) |
3893 done |
3714 done |
3894 also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x1').([(x1',x1)]\<bullet>N1)" |
3715 also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x1').([(x1',x1)]\<bullet>N1)" |
3895 using f1 f2 f3 f4 f5 fs |
3716 using f1 f2 f3 f4 f5 fs |
3896 apply - |
3717 apply - |
3897 apply(rule l_redu.intros) |
3718 apply(rule l_redu.intros) |
3898 apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3719 apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3899 done |
3720 done |
3900 also have "\<dots> = Cut <a>.M (x1).N1" |
3721 also have "\<dots> = Cut <a>.M (x1).N1" |
3901 using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3722 using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3902 finally show ?thesis by simp |
3723 finally show ?thesis by simp |
3903 qed |
3724 qed |
3904 |
3725 |
3905 lemma better_LOr2_intro[intro]: |
3726 lemma better_LOr2_intro[intro]: |
3906 shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> |
3727 shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> |
3915 have "Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) |
3736 have "Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) |
3916 = Cut <b'>.(OrR2 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')" |
3737 = Cut <b'>.(OrR2 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')" |
3917 using f1 f2 f3 f4 f5 fs |
3738 using f1 f2 f3 f4 f5 fs |
3918 apply(rule_tac sym) |
3739 apply(rule_tac sym) |
3919 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3740 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3920 apply(auto simp add: perm_fresh_fresh) |
3741 apply(auto simp: perm_fresh_fresh) |
3921 done |
3742 done |
3922 also have "\<dots> = Cut <b'>.(OrR2 <a'>.([(a',a)]\<bullet>M) b') |
3743 also have "\<dots> = Cut <b'>.(OrR2 <a'>.([(a',a)]\<bullet>M) b') |
3923 (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')" |
3744 (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')" |
3924 using f1 f2 f3 f4 f5 fs |
3745 using f1 f2 f3 f4 f5 fs |
3925 apply(rule_tac sym) |
3746 apply(rule_tac sym) |
3927 done |
3748 done |
3928 also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x2').([(x2',x2)]\<bullet>N2)" |
3749 also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x2').([(x2',x2)]\<bullet>N2)" |
3929 using f1 f2 f3 f4 f5 fs |
3750 using f1 f2 f3 f4 f5 fs |
3930 apply - |
3751 apply - |
3931 apply(rule l_redu.intros) |
3752 apply(rule l_redu.intros) |
3932 apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3753 apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3933 done |
3754 done |
3934 also have "\<dots> = Cut <a>.M (x2).N2" |
3755 also have "\<dots> = Cut <a>.M (x2).N2" |
3935 using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3756 using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
3936 finally show ?thesis by simp |
3757 finally show ?thesis by simp |
3937 qed |
3758 qed |
3938 |
3759 |
3939 lemma better_LImp_intro[intro]: |
3760 lemma better_LImp_intro[intro]: |
3940 shows "\<lbrakk>z\<sharp>(N,[y].P); b\<sharp>[a].M; a\<sharp>N\<rbrakk> |
3761 shows "\<lbrakk>z\<sharp>(N,[y].P); b\<sharp>[a].M; a\<sharp>N\<rbrakk> |
3950 have " Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z) |
3771 have " Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z) |
3951 = Cut <b'>.(ImpR (x).<a>.M b') (z').(ImpL <c>.N (y).P z')" |
3772 = Cut <b'>.(ImpR (x).<a>.M b') (z').(ImpL <c>.N (y).P z')" |
3952 using f1 f2 f3 f4 f5 fs |
3773 using f1 f2 f3 f4 f5 fs |
3953 apply(rule_tac sym) |
3774 apply(rule_tac sym) |
3954 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3775 apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) |
3955 apply(auto simp add: perm_fresh_fresh) |
3776 apply(auto simp: perm_fresh_fresh) |
3956 done |
3777 done |
3957 also have "\<dots> = Cut <b'>.(ImpR (x').<a'>.([(a',a)]\<bullet>([(x',x)]\<bullet>M)) b') |
3778 also have "\<dots> = Cut <b'>.(ImpR (x').<a'>.([(a',a)]\<bullet>([(x',x)]\<bullet>M)) b') |
3958 (z').(ImpL <c'>.([(c',c)]\<bullet>N) (y').([(y',y)]\<bullet>P) z')" |
3779 (z').(ImpL <c'>.([(c',c)]\<bullet>N) (y').([(y',y)]\<bullet>P) z')" |
3959 using f1 f2 f3 f4 f5 f6 fs |
3780 using f1 f2 f3 f4 f5 f6 fs |
3960 apply(rule_tac sym) |
3781 apply(rule_tac sym) |
3971 done |
3792 done |
3972 also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.(Cut <c'>.([(c',c)]\<bullet>N) (x').([(a',a)]\<bullet>[(x',x)]\<bullet>M)) (y').([(y',y)]\<bullet>P)" |
3793 also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.(Cut <c'>.([(c',c)]\<bullet>N) (x').([(a',a)]\<bullet>[(x',x)]\<bullet>M)) (y').([(y',y)]\<bullet>P)" |
3973 using f1 f2 f3 f4 f5 f6 fs |
3794 using f1 f2 f3 f4 f5 f6 fs |
3974 apply - |
3795 apply - |
3975 apply(rule l_redu.intros) |
3796 apply(rule l_redu.intros) |
3976 apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3797 apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) |
3977 done |
3798 done |
3978 also have "\<dots> = Cut <a>.(Cut <c>.N (x).M) (y).P" |
3799 also have "\<dots> = Cut <a>.(Cut <c>.N (x).M) (y).P" |
3979 using f1 f2 f3 f4 f5 f6 fs |
3800 using f1 f2 f3 f4 f5 f6 fs |
3980 apply(simp add: trm.inject) |
3801 apply(simp add: trm.inject) |
3981 apply(rule conjI) |
3802 apply(rule conjI) |
3984 apply(simp add: trm.inject) |
3805 apply(simp add: trm.inject) |
3985 apply(rule conjI) |
3806 apply(rule conjI) |
3986 apply(simp add: fresh_prod fresh_atm) |
3807 apply(simp add: fresh_prod fresh_atm) |
3987 apply(rule conjI) |
3808 apply(rule conjI) |
3988 apply(perm_simp add: calc_atm) |
3809 apply(perm_simp add: calc_atm) |
3989 apply(auto simp add: fresh_prod fresh_atm)[1] |
3810 apply(auto simp: fresh_prod fresh_atm)[1] |
3990 apply(perm_simp add: alpha) |
3811 apply(perm_simp add: alpha) |
3991 apply(perm_simp add: alpha) |
3812 apply(perm_simp add: alpha) |
3992 apply(perm_simp add: alpha) |
3813 apply(perm_simp add: alpha) |
3993 apply(rule conjI) |
3814 apply(rule conjI) |
3994 apply(perm_simp add: calc_atm) |
3815 apply(perm_simp add: calc_atm) |
4005 fixes M::"trm" |
3826 fixes M::"trm" |
4006 and a::"coname" |
3827 and a::"coname" |
4007 assumes a: "[a].M = [b].N" "c\<sharp>(a,b,M,N)" |
3828 assumes a: "[a].M = [b].N" "c\<sharp>(a,b,M,N)" |
4008 shows "M = [(a,c)]\<bullet>[(b,c)]\<bullet>N" |
3829 shows "M = [(a,c)]\<bullet>[(b,c)]\<bullet>N" |
4009 using a |
3830 using a |
4010 apply(auto simp add: alpha_fresh fresh_prod fresh_atm) |
3831 apply(auto simp: alpha_fresh fresh_prod fresh_atm) |
4011 apply(drule sym) |
3832 apply(drule sym) |
4012 apply(perm_simp) |
3833 apply(perm_simp) |
4013 done |
3834 done |
4014 |
3835 |
4015 lemma alpha_name: |
3836 lemma alpha_name: |
4016 fixes M::"trm" |
3837 fixes M::"trm" |
4017 and x::"name" |
3838 and x::"name" |
4018 assumes a: "[x].M = [y].N" "z\<sharp>(x,y,M,N)" |
3839 assumes a: "[x].M = [y].N" "z\<sharp>(x,y,M,N)" |
4019 shows "M = [(x,z)]\<bullet>[(y,z)]\<bullet>N" |
3840 shows "M = [(x,z)]\<bullet>[(y,z)]\<bullet>N" |
4020 using a |
3841 using a |
4021 apply(auto simp add: alpha_fresh fresh_prod fresh_atm) |
3842 apply(auto simp: alpha_fresh fresh_prod fresh_atm) |
4022 apply(drule sym) |
3843 apply(drule sym) |
4023 apply(perm_simp) |
3844 apply(perm_simp) |
4024 done |
3845 done |
4025 |
3846 |
4026 lemma alpha_name_coname: |
3847 lemma alpha_name_coname: |
4028 and x::"name" |
3849 and x::"name" |
4029 and a::"coname" |
3850 and a::"coname" |
4030 assumes a: "[x].[b].M = [y].[c].N" "z\<sharp>(x,y,M,N)" "a\<sharp>(b,c,M,N)" |
3851 assumes a: "[x].[b].M = [y].[c].N" "z\<sharp>(x,y,M,N)" "a\<sharp>(b,c,M,N)" |
4031 shows "M = [(x,z)]\<bullet>[(b,a)]\<bullet>[(c,a)]\<bullet>[(y,z)]\<bullet>N" |
3852 shows "M = [(x,z)]\<bullet>[(b,a)]\<bullet>[(c,a)]\<bullet>[(y,z)]\<bullet>N" |
4032 using a |
3853 using a |
4033 apply(auto simp add: alpha_fresh fresh_prod fresh_atm |
3854 apply(auto simp: alpha_fresh fresh_prod fresh_atm |
4034 abs_supp fin_supp abs_fresh abs_perm fresh_left calc_atm) |
3855 abs_supp fin_supp abs_fresh abs_perm fresh_left calc_atm) |
4035 apply(drule sym) |
3856 apply(drule sym) |
4036 apply(simp) |
3857 apply(simp) |
4037 apply(perm_simp) |
3858 apply(perm_simp) |
4038 done |
3859 done |
4097 apply(simp add: fresh_prod fresh_atm abs_fresh) |
3918 apply(simp add: fresh_prod fresh_atm abs_fresh) |
4098 apply(simp add: calc_atm) |
3919 apply(simp add: calc_atm) |
4099 apply(rule exI)+ |
3920 apply(rule exI)+ |
4100 apply(rule conjI) |
3921 apply(rule conjI) |
4101 apply(rule refl) |
3922 apply(rule refl) |
4102 apply(auto simp add: calc_atm abs_fresh fresh_left)[1] |
3923 apply(auto simp: calc_atm abs_fresh fresh_left)[1] |
4103 apply(case_tac "y=x") |
3924 apply(case_tac "y=x") |
4104 apply(perm_simp) |
3925 apply(perm_simp) |
4105 apply(perm_simp) |
3926 apply(perm_simp) |
4106 apply(case_tac "aa=a") |
3927 apply(case_tac "aa=a") |
4107 apply(perm_simp) |
3928 apply(perm_simp) |
4134 apply(rule exI)+ |
3955 apply(rule exI)+ |
4135 apply(rule conjI) |
3956 apply(rule conjI) |
4136 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
3957 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4137 apply(simp add: calc_atm) |
3958 apply(simp add: calc_atm) |
4138 apply(rule refl) |
3959 apply(rule refl) |
4139 apply(auto simp add: fresh_left calc_atm abs_fresh split: if_splits)[1] |
3960 apply(auto simp: fresh_left calc_atm abs_fresh split: if_splits)[1] |
4140 apply(generate_fresh "name") |
3961 apply(generate_fresh "name") |
4141 apply(simp add: abs_fresh fresh_prod fresh_atm) |
3962 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4142 apply(auto)[1] |
3963 apply(auto)[1] |
4143 apply(drule_tac z="cb" in alpha_name) |
3964 apply(drule_tac z="cb" in alpha_name) |
4144 apply(simp add: fresh_prod fresh_atm abs_fresh) |
3965 apply(simp add: fresh_prod fresh_atm abs_fresh) |
4146 apply(rule exI)+ |
3967 apply(rule exI)+ |
4147 apply(rule conjI) |
3968 apply(rule conjI) |
4148 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
3969 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4149 apply(simp add: calc_atm) |
3970 apply(simp add: calc_atm) |
4150 apply(rule refl) |
3971 apply(rule refl) |
4151 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
3972 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4152 apply(perm_simp)+ |
3973 apply(perm_simp)+ |
4153 apply(generate_fresh "name") |
3974 apply(generate_fresh "name") |
4154 apply(simp add: abs_fresh fresh_prod fresh_atm) |
3975 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4155 apply(auto)[1] |
3976 apply(auto)[1] |
4156 apply(drule_tac z="cb" in alpha_name) |
3977 apply(drule_tac z="cb" in alpha_name) |
4159 apply(rule exI)+ |
3980 apply(rule exI)+ |
4160 apply(rule conjI) |
3981 apply(rule conjI) |
4161 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
3982 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4162 apply(simp add: calc_atm) |
3983 apply(simp add: calc_atm) |
4163 apply(rule refl) |
3984 apply(rule refl) |
4164 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
3985 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4165 apply(perm_simp)+ |
3986 apply(perm_simp)+ |
4166 apply(generate_fresh "name") |
3987 apply(generate_fresh "name") |
4167 apply(simp add: abs_fresh fresh_prod fresh_atm) |
3988 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4168 apply(auto)[1] |
3989 apply(auto)[1] |
4169 apply(drule_tac z="cb" in alpha_name) |
3990 apply(drule_tac z="cb" in alpha_name) |
4172 apply(rule exI)+ |
3993 apply(rule exI)+ |
4173 apply(rule conjI) |
3994 apply(rule conjI) |
4174 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
3995 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4175 apply(simp add: calc_atm) |
3996 apply(simp add: calc_atm) |
4176 apply(rule refl) |
3997 apply(rule refl) |
4177 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
3998 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4178 apply(perm_simp)+ |
3999 apply(perm_simp)+ |
4179 (* and2 case *) |
4000 (* and2 case *) |
4180 apply(rule disjI2) |
4001 apply(rule disjI2) |
4181 apply(rule disjI2) |
4002 apply(rule disjI2) |
4182 apply(rule disjI2) |
4003 apply(rule disjI2) |
4204 apply(rule exI)+ |
4025 apply(rule exI)+ |
4205 apply(rule conjI) |
4026 apply(rule conjI) |
4206 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4027 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4207 apply(simp add: calc_atm) |
4028 apply(simp add: calc_atm) |
4208 apply(rule refl) |
4029 apply(rule refl) |
4209 apply(auto simp add: fresh_left calc_atm abs_fresh split: if_splits)[1] |
4030 apply(auto simp: fresh_left calc_atm abs_fresh split: if_splits)[1] |
4210 apply(generate_fresh "name") |
4031 apply(generate_fresh "name") |
4211 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4032 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4212 apply(auto)[1] |
4033 apply(auto)[1] |
4213 apply(drule_tac z="cb" in alpha_name) |
4034 apply(drule_tac z="cb" in alpha_name) |
4214 apply(simp add: fresh_prod fresh_atm abs_fresh) |
4035 apply(simp add: fresh_prod fresh_atm abs_fresh) |
4216 apply(rule exI)+ |
4037 apply(rule exI)+ |
4217 apply(rule conjI) |
4038 apply(rule conjI) |
4218 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4039 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4219 apply(simp add: calc_atm) |
4040 apply(simp add: calc_atm) |
4220 apply(rule refl) |
4041 apply(rule refl) |
4221 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4042 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4222 apply(perm_simp)+ |
4043 apply(perm_simp)+ |
4223 apply(generate_fresh "name") |
4044 apply(generate_fresh "name") |
4224 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4045 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4225 apply(auto)[1] |
4046 apply(auto)[1] |
4226 apply(drule_tac z="cb" in alpha_name) |
4047 apply(drule_tac z="cb" in alpha_name) |
4229 apply(rule exI)+ |
4050 apply(rule exI)+ |
4230 apply(rule conjI) |
4051 apply(rule conjI) |
4231 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4052 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4232 apply(simp add: calc_atm) |
4053 apply(simp add: calc_atm) |
4233 apply(rule refl) |
4054 apply(rule refl) |
4234 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4055 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4235 apply(perm_simp)+ |
4056 apply(perm_simp)+ |
4236 apply(generate_fresh "name") |
4057 apply(generate_fresh "name") |
4237 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4058 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4238 apply(auto)[1] |
4059 apply(auto)[1] |
4239 apply(drule_tac z="cb" in alpha_name) |
4060 apply(drule_tac z="cb" in alpha_name) |
4242 apply(rule exI)+ |
4063 apply(rule exI)+ |
4243 apply(rule conjI) |
4064 apply(rule conjI) |
4244 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4065 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4245 apply(simp add: calc_atm) |
4066 apply(simp add: calc_atm) |
4246 apply(rule refl) |
4067 apply(rule refl) |
4247 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4068 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4248 apply(perm_simp)+ |
4069 apply(perm_simp)+ |
4249 (* or1 case *) |
4070 (* or1 case *) |
4250 apply(rule disjI2) |
4071 apply(rule disjI2) |
4251 apply(rule disjI2) |
4072 apply(rule disjI2) |
4252 apply(rule disjI2) |
4073 apply(rule disjI2) |
4276 apply(rule conjI) |
4097 apply(rule conjI) |
4277 apply(rule exI)+ |
4098 apply(rule exI)+ |
4278 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4099 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4279 apply(simp add: calc_atm) |
4100 apply(simp add: calc_atm) |
4280 apply(rule refl) |
4101 apply(rule refl) |
4281 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4102 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4282 apply(perm_simp)+ |
4103 apply(perm_simp)+ |
4283 apply(generate_fresh "name") |
4104 apply(generate_fresh "name") |
4284 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4105 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4285 apply(auto)[1] |
4106 apply(auto)[1] |
4286 apply(drule_tac z="cb" in alpha_name) |
4107 apply(drule_tac z="cb" in alpha_name) |
4290 apply(rule conjI) |
4111 apply(rule conjI) |
4291 apply(rule exI)+ |
4112 apply(rule exI)+ |
4292 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4113 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4293 apply(simp add: calc_atm) |
4114 apply(simp add: calc_atm) |
4294 apply(rule refl) |
4115 apply(rule refl) |
4295 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4116 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4296 apply(perm_simp)+ |
4117 apply(perm_simp)+ |
4297 (* or2 case *) |
4118 (* or2 case *) |
4298 apply(rule disjI2) |
4119 apply(rule disjI2) |
4299 apply(rule disjI2) |
4120 apply(rule disjI2) |
4300 apply(rule disjI2) |
4121 apply(rule disjI2) |
4324 apply(rule exI)+ |
4145 apply(rule exI)+ |
4325 apply(rule conjI) |
4146 apply(rule conjI) |
4326 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4147 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst) |
4327 apply(simp add: calc_atm) |
4148 apply(simp add: calc_atm) |
4328 apply(rule refl) |
4149 apply(rule refl) |
4329 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4150 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4330 apply(perm_simp)+ |
4151 apply(perm_simp)+ |
4331 apply(generate_fresh "name") |
4152 apply(generate_fresh "name") |
4332 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4153 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4333 apply(auto)[1] |
4154 apply(auto)[1] |
4334 apply(drule_tac z="cb" in alpha_name) |
4155 apply(drule_tac z="cb" in alpha_name) |
4337 apply(rule exI)+ |
4158 apply(rule exI)+ |
4338 apply(rule conjI) |
4159 apply(rule conjI) |
4339 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4160 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst) |
4340 apply(simp add: calc_atm) |
4161 apply(simp add: calc_atm) |
4341 apply(rule refl) |
4162 apply(rule refl) |
4342 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4163 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4343 apply(perm_simp)+ |
4164 apply(perm_simp)+ |
4344 (* imp-case *) |
4165 (* imp-case *) |
4345 apply(rule disjI2) |
4166 apply(rule disjI2) |
4346 apply(rule disjI2) |
4167 apply(rule disjI2) |
4347 apply(rule disjI2) |
4168 apply(rule disjI2) |
4371 apply(rule exI)+ |
4192 apply(rule exI)+ |
4372 apply(rule conjI) |
4193 apply(rule conjI) |
4373 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(z,cb)]\<bullet>z" in subst) |
4194 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(z,cb)]\<bullet>z" in subst) |
4374 apply(simp add: calc_atm) |
4195 apply(simp add: calc_atm) |
4375 apply(rule refl) |
4196 apply(rule refl) |
4376 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4197 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4377 apply(perm_simp)+ |
4198 apply(perm_simp)+ |
4378 apply(generate_fresh "name") |
4199 apply(generate_fresh "name") |
4379 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4200 apply(simp add: abs_fresh fresh_prod fresh_atm) |
4380 apply(auto)[1] |
4201 apply(auto)[1] |
4381 apply(drule_tac z="cc" in alpha_name) |
4202 apply(drule_tac z="cc" in alpha_name) |
4384 apply(rule exI)+ |
4205 apply(rule exI)+ |
4385 apply(rule conjI) |
4206 apply(rule conjI) |
4386 apply(rule_tac s="x" and t="[(x,cc)]\<bullet>[(z,cc)]\<bullet>z" in subst) |
4207 apply(rule_tac s="x" and t="[(x,cc)]\<bullet>[(z,cc)]\<bullet>z" in subst) |
4387 apply(simp add: calc_atm) |
4208 apply(simp add: calc_atm) |
4388 apply(rule refl) |
4209 apply(rule refl) |
4389 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4210 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] |
4390 apply(perm_simp)+ |
4211 apply(perm_simp)+ |
4391 done |
4212 done |
4392 |
4213 |
4393 inductive |
4214 inductive |
4394 c_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>c _" [100,100] 100) |
4215 c_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>c _" [100,100] 100) |
4406 proof - |
4227 proof - |
4407 assume not_fic: "\<not>fic M a" |
4228 assume not_fic: "\<not>fic M a" |
4408 obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4229 obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4409 obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) |
4230 obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) |
4410 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4231 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4411 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4232 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4412 also have "\<dots> \<longrightarrow>\<^sub>c ([(a',a)]\<bullet>M){a':=(x').([(x',x)]\<bullet>N)}" using fs1 fs2 not_fic |
4233 also have "\<dots> \<longrightarrow>\<^sub>c ([(a',a)]\<bullet>M){a':=(x').([(x',x)]\<bullet>N)}" using fs1 fs2 not_fic |
4413 apply - |
4234 apply - |
4414 apply(rule left) |
4235 apply(rule left) |
4415 apply(clarify) |
4236 apply(clarify) |
4416 apply(drule_tac a'="a" in fic_rename) |
4237 apply(drule_tac a'="a" in fic_rename) |
4427 proof - |
4248 proof - |
4428 assume not_fin: "\<not>fin N x" |
4249 assume not_fin: "\<not>fin N x" |
4429 obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4250 obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4430 obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) |
4251 obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) |
4431 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4252 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4432 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4253 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4433 also have "\<dots> \<longrightarrow>\<^sub>c ([(x',x)]\<bullet>N){x':=<a'>.([(a',a)]\<bullet>M)}" using fs1 fs2 not_fin |
4254 also have "\<dots> \<longrightarrow>\<^sub>c ([(x',x)]\<bullet>N){x':=<a'>.([(a',a)]\<bullet>M)}" using fs1 fs2 not_fin |
4434 apply - |
4255 apply - |
4435 apply(rule right) |
4256 apply(rule right) |
4436 apply(clarify) |
4257 apply(clarify) |
4437 apply(drule_tac x'="x" in fin_rename) |
4258 apply(drule_tac x'="x" in fin_rename) |
4448 and c::"coname" |
4269 and c::"coname" |
4449 shows "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'" |
4270 shows "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'" |
4450 and "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'" |
4271 and "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'" |
4451 apply - |
4272 apply - |
4452 apply(induct rule: c_redu.induct) |
4273 apply(induct rule: c_redu.induct) |
4453 apply(auto simp add: abs_fresh rename_fresh subst_fresh) |
4274 apply(auto simp: abs_fresh rename_fresh subst_fresh) |
4454 apply(induct rule: c_redu.induct) |
4275 apply(induct rule: c_redu.induct) |
4455 apply(auto simp add: abs_fresh rename_fresh subst_fresh) |
4276 apply(auto simp: abs_fresh rename_fresh subst_fresh) |
4456 done |
4277 done |
4457 |
4278 |
4458 inductive |
4279 inductive |
4459 a_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>a _" [100,100] 100) |
4280 a_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>a _" [100,100] 100) |
4460 where |
4281 where |
4483 and "M \<longrightarrow>\<^sub>a M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'" |
4304 and "M \<longrightarrow>\<^sub>a M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'" |
4484 apply - |
4305 apply - |
4485 apply(induct rule: a_redu.induct) |
4306 apply(induct rule: a_redu.induct) |
4486 apply(simp add: fresh_l_redu) |
4307 apply(simp add: fresh_l_redu) |
4487 apply(simp add: fresh_c_redu) |
4308 apply(simp add: fresh_c_redu) |
4488 apply(auto simp add: abs_fresh abs_supp fin_supp) |
4309 apply(auto simp: abs_fresh abs_supp fin_supp) |
4489 apply(induct rule: a_redu.induct) |
4310 apply(induct rule: a_redu.induct) |
4490 apply(simp add: fresh_l_redu) |
4311 apply(simp add: fresh_l_redu) |
4491 apply(simp add: fresh_c_redu) |
4312 apply(simp add: fresh_c_redu) |
4492 apply(auto simp add: abs_fresh abs_supp fin_supp) |
4313 apply(auto simp: abs_fresh abs_supp fin_supp) |
4493 done |
4314 done |
4494 |
4315 |
4495 equivariance a_redu |
4316 equivariance a_redu |
4496 |
4317 |
4497 nominal_inductive a_redu |
4318 nominal_inductive a_redu |
4502 proof - |
4323 proof - |
4503 assume red: "M\<longrightarrow>\<^sub>a M'" |
4324 assume red: "M\<longrightarrow>\<^sub>a M'" |
4504 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4325 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4505 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4326 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4506 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4327 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4507 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4328 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4508 also have "\<dots> \<longrightarrow>\<^sub>a Cut <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N)" using fs1 fs2 red |
4329 also have "\<dots> \<longrightarrow>\<^sub>a Cut <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N)" using fs1 fs2 red |
4509 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt) |
4330 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt) |
4510 also have "\<dots> = Cut <a>.M' (x).N" |
4331 also have "\<dots> = Cut <a>.M' (x).N" |
4511 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4332 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4512 finally show ?thesis by simp |
4333 finally show ?thesis by simp |
4513 qed |
4334 qed |
4514 |
4335 |
4515 lemma better_CutR_intro[intro]: |
4336 lemma better_CutR_intro[intro]: |
4516 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> Cut <a>.M (x).N \<longrightarrow>\<^sub>a Cut <a>.M (x).N'" |
4337 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> Cut <a>.M (x).N \<longrightarrow>\<^sub>a Cut <a>.M (x).N'" |
4517 proof - |
4338 proof - |
4518 assume red: "N\<longrightarrow>\<^sub>a N'" |
4339 assume red: "N\<longrightarrow>\<^sub>a N'" |
4519 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4340 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4520 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4341 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4521 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4342 have "Cut <a>.M (x).N = Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)" |
4522 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4343 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4523 also have "\<dots> \<longrightarrow>\<^sub>a Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N')" using fs1 fs2 red |
4344 also have "\<dots> \<longrightarrow>\<^sub>a Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N')" using fs1 fs2 red |
4524 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt) |
4345 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt) |
4525 also have "\<dots> = Cut <a>.M (x).N'" |
4346 also have "\<dots> = Cut <a>.M (x).N'" |
4526 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4347 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4527 finally show ?thesis by simp |
4348 finally show ?thesis by simp |
4528 qed |
4349 qed |
4529 |
4350 |
4530 lemma better_AndRL_intro[intro]: |
4351 lemma better_AndRL_intro[intro]: |
4531 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M' <b>.N c" |
4352 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M' <b>.N c" |
4532 proof - |
4353 proof - |
4533 assume red: "M\<longrightarrow>\<^sub>a M'" |
4354 assume red: "M\<longrightarrow>\<^sub>a M'" |
4534 obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) |
4355 obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) |
4535 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) |
4356 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) |
4536 have "AndR <a>.M <b>.N c = AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c" |
4357 have "AndR <a>.M <b>.N c = AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c" |
4537 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4358 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4538 also have "\<dots> \<longrightarrow>\<^sub>a AndR <a'>.([(a',a)]\<bullet>M') <b'>.([(b',b)]\<bullet>N) c" using fs1 fs2 red |
4359 also have "\<dots> \<longrightarrow>\<^sub>a AndR <a'>.([(a',a)]\<bullet>M') <b'>.([(b',b)]\<bullet>N) c" using fs1 fs2 red |
4539 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4360 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4540 also have "\<dots> = AndR <a>.M' <b>.N c" |
4361 also have "\<dots> = AndR <a>.M' <b>.N c" |
4541 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4362 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4542 finally show ?thesis by simp |
4363 finally show ?thesis by simp |
4543 qed |
4364 qed |
4544 |
4365 |
4545 lemma better_AndRR_intro[intro]: |
4366 lemma better_AndRR_intro[intro]: |
4546 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M <b>.N' c" |
4367 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M <b>.N' c" |
4547 proof - |
4368 proof - |
4548 assume red: "N\<longrightarrow>\<^sub>a N'" |
4369 assume red: "N\<longrightarrow>\<^sub>a N'" |
4549 obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) |
4370 obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) |
4550 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) |
4371 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) |
4551 have "AndR <a>.M <b>.N c = AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c" |
4372 have "AndR <a>.M <b>.N c = AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c" |
4552 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4373 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4553 also have "\<dots> \<longrightarrow>\<^sub>a AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N') c" using fs1 fs2 red |
4374 also have "\<dots> \<longrightarrow>\<^sub>a AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N') c" using fs1 fs2 red |
4554 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4375 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4555 also have "\<dots> = AndR <a>.M <b>.N' c" |
4376 also have "\<dots> = AndR <a>.M <b>.N' c" |
4556 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4377 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4557 finally show ?thesis by simp |
4378 finally show ?thesis by simp |
4558 qed |
4379 qed |
4559 |
4380 |
4560 lemma better_AndL1_intro[intro]: |
4381 lemma better_AndL1_intro[intro]: |
4561 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL1 (x).M y \<longrightarrow>\<^sub>a AndL1 (x).M' y" |
4382 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL1 (x).M y \<longrightarrow>\<^sub>a AndL1 (x).M' y" |
4562 proof - |
4383 proof - |
4563 assume red: "M\<longrightarrow>\<^sub>a M'" |
4384 assume red: "M\<longrightarrow>\<^sub>a M'" |
4564 obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4385 obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4565 have "AndL1 (x).M y = AndL1 (x').([(x',x)]\<bullet>M) y" |
4386 have "AndL1 (x).M y = AndL1 (x').([(x',x)]\<bullet>M) y" |
4566 using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4387 using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4567 also have "\<dots> \<longrightarrow>\<^sub>a AndL1 (x').([(x',x)]\<bullet>M') y" using fs1 red |
4388 also have "\<dots> \<longrightarrow>\<^sub>a AndL1 (x').([(x',x)]\<bullet>M') y" using fs1 red |
4568 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4389 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4569 also have "\<dots> = AndL1 (x).M' y" |
4390 also have "\<dots> = AndL1 (x).M' y" |
4570 using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4391 using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4571 finally show ?thesis by simp |
4392 finally show ?thesis by simp |
4572 qed |
4393 qed |
4573 |
4394 |
4574 lemma better_AndL2_intro[intro]: |
4395 lemma better_AndL2_intro[intro]: |
4575 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL2 (x).M y \<longrightarrow>\<^sub>a AndL2 (x).M' y" |
4396 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL2 (x).M y \<longrightarrow>\<^sub>a AndL2 (x).M' y" |
4576 proof - |
4397 proof - |
4577 assume red: "M\<longrightarrow>\<^sub>a M'" |
4398 assume red: "M\<longrightarrow>\<^sub>a M'" |
4578 obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4399 obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast) |
4579 have "AndL2 (x).M y = AndL2 (x').([(x',x)]\<bullet>M) y" |
4400 have "AndL2 (x).M y = AndL2 (x').([(x',x)]\<bullet>M) y" |
4580 using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4401 using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4581 also have "\<dots> \<longrightarrow>\<^sub>a AndL2 (x').([(x',x)]\<bullet>M') y" using fs1 red |
4402 also have "\<dots> \<longrightarrow>\<^sub>a AndL2 (x').([(x',x)]\<bullet>M') y" using fs1 red |
4582 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4403 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4583 also have "\<dots> = AndL2 (x).M' y" |
4404 also have "\<dots> = AndL2 (x).M' y" |
4584 using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4405 using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4585 finally show ?thesis by simp |
4406 finally show ?thesis by simp |
4586 qed |
4407 qed |
4587 |
4408 |
4588 lemma better_OrLL_intro[intro]: |
4409 lemma better_OrLL_intro[intro]: |
4589 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M' (y).N z" |
4410 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M' (y).N z" |
4590 proof - |
4411 proof - |
4591 assume red: "M\<longrightarrow>\<^sub>a M'" |
4412 assume red: "M\<longrightarrow>\<^sub>a M'" |
4592 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) |
4413 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) |
4593 obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast) |
4414 obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast) |
4594 have "OrL (x).M (y).N z = OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z" |
4415 have "OrL (x).M (y).N z = OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z" |
4595 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4416 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4596 also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M') (y').([(y',y)]\<bullet>N) z" using fs1 fs2 red |
4417 also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M') (y').([(y',y)]\<bullet>N) z" using fs1 fs2 red |
4597 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4418 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4598 also have "\<dots> = OrL (x).M' (y).N z" |
4419 also have "\<dots> = OrL (x).M' (y).N z" |
4599 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4420 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4600 finally show ?thesis by simp |
4421 finally show ?thesis by simp |
4601 qed |
4422 qed |
4602 |
4423 |
4603 lemma better_OrLR_intro[intro]: |
4424 lemma better_OrLR_intro[intro]: |
4604 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M (y).N' z" |
4425 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M (y).N' z" |
4605 proof - |
4426 proof - |
4606 assume red: "N\<longrightarrow>\<^sub>a N'" |
4427 assume red: "N\<longrightarrow>\<^sub>a N'" |
4607 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) |
4428 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) |
4608 obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast) |
4429 obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast) |
4609 have "OrL (x).M (y).N z = OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z" |
4430 have "OrL (x).M (y).N z = OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z" |
4610 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4431 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4611 also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N') z" using fs1 fs2 red |
4432 also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N') z" using fs1 fs2 red |
4612 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4433 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4613 also have "\<dots> = OrL (x).M (y).N' z" |
4434 also have "\<dots> = OrL (x).M (y).N' z" |
4614 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4435 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4615 finally show ?thesis by simp |
4436 finally show ?thesis by simp |
4616 qed |
4437 qed |
4617 |
4438 |
4618 lemma better_OrR1_intro[intro]: |
4439 lemma better_OrR1_intro[intro]: |
4619 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR1 <a>.M b \<longrightarrow>\<^sub>a OrR1 <a>.M' b" |
4440 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR1 <a>.M b \<longrightarrow>\<^sub>a OrR1 <a>.M' b" |
4620 proof - |
4441 proof - |
4621 assume red: "M\<longrightarrow>\<^sub>a M'" |
4442 assume red: "M\<longrightarrow>\<^sub>a M'" |
4622 obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4443 obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4623 have "OrR1 <a>.M b = OrR1 <a'>.([(a',a)]\<bullet>M) b" |
4444 have "OrR1 <a>.M b = OrR1 <a'>.([(a',a)]\<bullet>M) b" |
4624 using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4445 using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4625 also have "\<dots> \<longrightarrow>\<^sub>a OrR1 <a'>.([(a',a)]\<bullet>M') b" using fs1 red |
4446 also have "\<dots> \<longrightarrow>\<^sub>a OrR1 <a'>.([(a',a)]\<bullet>M') b" using fs1 red |
4626 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4447 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4627 also have "\<dots> = OrR1 <a>.M' b" |
4448 also have "\<dots> = OrR1 <a>.M' b" |
4628 using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4449 using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4629 finally show ?thesis by simp |
4450 finally show ?thesis by simp |
4630 qed |
4451 qed |
4631 |
4452 |
4632 lemma better_OrR2_intro[intro]: |
4453 lemma better_OrR2_intro[intro]: |
4633 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR2 <a>.M b \<longrightarrow>\<^sub>a OrR2 <a>.M' b" |
4454 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR2 <a>.M b \<longrightarrow>\<^sub>a OrR2 <a>.M' b" |
4634 proof - |
4455 proof - |
4635 assume red: "M\<longrightarrow>\<^sub>a M'" |
4456 assume red: "M\<longrightarrow>\<^sub>a M'" |
4636 obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4457 obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4637 have "OrR2 <a>.M b = OrR2 <a'>.([(a',a)]\<bullet>M) b" |
4458 have "OrR2 <a>.M b = OrR2 <a'>.([(a',a)]\<bullet>M) b" |
4638 using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4459 using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4639 also have "\<dots> \<longrightarrow>\<^sub>a OrR2 <a'>.([(a',a)]\<bullet>M') b" using fs1 red |
4460 also have "\<dots> \<longrightarrow>\<^sub>a OrR2 <a'>.([(a',a)]\<bullet>M') b" using fs1 red |
4640 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4461 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4641 also have "\<dots> = OrR2 <a>.M' b" |
4462 also have "\<dots> = OrR2 <a>.M' b" |
4642 using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4463 using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4643 finally show ?thesis by simp |
4464 finally show ?thesis by simp |
4644 qed |
4465 qed |
4645 |
4466 |
4646 lemma better_ImpLL_intro[intro]: |
4467 lemma better_ImpLL_intro[intro]: |
4647 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M' (x).N y" |
4468 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M' (x).N y" |
4648 proof - |
4469 proof - |
4649 assume red: "M\<longrightarrow>\<^sub>a M'" |
4470 assume red: "M\<longrightarrow>\<^sub>a M'" |
4650 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
4471 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
4651 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4472 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4652 have "ImpL <a>.M (x).N y = ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y" |
4473 have "ImpL <a>.M (x).N y = ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y" |
4653 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4474 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4654 also have "\<dots> \<longrightarrow>\<^sub>a ImpL <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N) y" using fs1 fs2 red |
4475 also have "\<dots> \<longrightarrow>\<^sub>a ImpL <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N) y" using fs1 fs2 red |
4655 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4476 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4656 also have "\<dots> = ImpL <a>.M' (x).N y" |
4477 also have "\<dots> = ImpL <a>.M' (x).N y" |
4657 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4478 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4658 finally show ?thesis by simp |
4479 finally show ?thesis by simp |
4659 qed |
4480 qed |
4660 |
4481 |
4661 lemma better_ImpLR_intro[intro]: |
4482 lemma better_ImpLR_intro[intro]: |
4662 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M (x).N' y" |
4483 shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M (x).N' y" |
4663 proof - |
4484 proof - |
4664 assume red: "N\<longrightarrow>\<^sub>a N'" |
4485 assume red: "N\<longrightarrow>\<^sub>a N'" |
4665 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
4486 obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) |
4666 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4487 obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) |
4667 have "ImpL <a>.M (x).N y = ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y" |
4488 have "ImpL <a>.M (x).N y = ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y" |
4668 using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4489 using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4669 also have "\<dots> \<longrightarrow>\<^sub>a ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N') y" using fs1 fs2 red |
4490 also have "\<dots> \<longrightarrow>\<^sub>a ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N') y" using fs1 fs2 red |
4670 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4491 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4671 also have "\<dots> = ImpL <a>.M (x).N' y" |
4492 also have "\<dots> = ImpL <a>.M (x).N' y" |
4672 using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4493 using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4673 finally show ?thesis by simp |
4494 finally show ?thesis by simp |
4674 qed |
4495 qed |
4675 |
4496 |
4676 lemma better_ImpR_intro[intro]: |
4497 lemma better_ImpR_intro[intro]: |
4677 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpR (x).<a>.M b \<longrightarrow>\<^sub>a ImpR (x).<a>.M' b" |
4498 shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpR (x).<a>.M b \<longrightarrow>\<^sub>a ImpR (x).<a>.M' b" |
4678 proof - |
4499 proof - |
4679 assume red: "M\<longrightarrow>\<^sub>a M'" |
4500 assume red: "M\<longrightarrow>\<^sub>a M'" |
4680 obtain a'::"coname" where fs2: "a'\<sharp>(M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) |
4501 obtain a'::"coname" where fs2: "a'\<sharp>(M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) |
4681 have "ImpR (x).<a>.M b = ImpR (x).<a'>.([(a',a)]\<bullet>M) b" |
4502 have "ImpR (x).<a>.M b = ImpR (x).<a'>.([(a',a)]\<bullet>M) b" |
4682 using fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4503 using fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) |
4683 also have "\<dots> \<longrightarrow>\<^sub>a ImpR (x).<a'>.([(a',a)]\<bullet>M') b" using fs2 red |
4504 also have "\<dots> \<longrightarrow>\<^sub>a ImpR (x).<a'>.([(a',a)]\<bullet>M') b" using fs2 red |
4684 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4505 by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) |
4685 also have "\<dots> = ImpR (x).<a>.M' b" |
4506 also have "\<dots> = ImpR (x).<a>.M' b" |
4686 using fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4507 using fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) |
4687 finally show ?thesis by simp |
4508 finally show ?thesis by simp |
4688 qed |
4509 qed |
4689 |
4510 |
4690 text \<open>axioms do not reduce\<close> |
4511 text \<open>axioms do not reduce\<close> |
4691 |
4512 |
4698 by (erule_tac c_redu.cases) (simp_all add: trm.inject) |
4519 by (erule_tac c_redu.cases) (simp_all add: trm.inject) |
4699 |
4520 |
4700 lemma ax_do_not_a_reduce: |
4521 lemma ax_do_not_a_reduce: |
4701 shows "Ax x a \<longrightarrow>\<^sub>a M \<Longrightarrow> False" |
4522 shows "Ax x a \<longrightarrow>\<^sub>a M \<Longrightarrow> False" |
4702 apply(erule_tac a_redu.cases) |
4523 apply(erule_tac a_redu.cases) |
4703 apply(auto simp add: trm.inject) |
4524 apply(auto simp: trm.inject) |
4704 apply(drule ax_do_not_l_reduce) |
4525 apply(drule ax_do_not_l_reduce) |
4705 apply(simp) |
4526 apply(simp) |
4706 apply(drule ax_do_not_c_reduce) |
4527 apply(drule ax_do_not_c_reduce) |
4707 apply(simp) |
4528 apply(simp) |
4708 done |
4529 done |
4717 apply(auto) |
4538 apply(auto) |
4718 apply(rotate_tac 2) |
4539 apply(rotate_tac 2) |
4719 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4540 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4720 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4541 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4721 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4542 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4722 apply(auto simp add: alpha a_redu.eqvt) |
4543 apply(auto simp: alpha a_redu.eqvt) |
4723 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4544 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4724 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4545 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4725 apply(simp add: perm_swap) |
4546 apply(simp add: perm_swap) |
4726 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4547 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4727 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4548 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4728 apply(simp add: perm_swap) |
4549 apply(simp add: perm_swap) |
4729 done |
4550 done |
4730 |
4551 |
4731 lemma a_redu_NotR_elim: |
4552 lemma a_redu_NotR_elim: |
4732 assumes a: "NotR (x).M a \<longrightarrow>\<^sub>a R" |
4553 assumes a: "NotR (x).M a \<longrightarrow>\<^sub>a R" |
4738 apply(auto) |
4559 apply(auto) |
4739 apply(rotate_tac 2) |
4560 apply(rotate_tac 2) |
4740 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4561 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4741 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4562 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4742 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4563 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4743 apply(auto simp add: alpha a_redu.eqvt) |
4564 apply(auto simp: alpha a_redu.eqvt) |
4744 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4565 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4745 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4566 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4746 apply(simp add: perm_swap) |
4567 apply(simp add: perm_swap) |
4747 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4568 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4748 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4569 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4749 apply(simp add: perm_swap) |
4570 apply(simp add: perm_swap) |
4750 done |
4571 done |
4751 |
4572 |
4752 lemma a_redu_AndR_elim: |
4573 lemma a_redu_AndR_elim: |
4753 assumes a: "AndR <a>.M <b>.N c\<longrightarrow>\<^sub>a R" |
4574 assumes a: "AndR <a>.M <b>.N c\<longrightarrow>\<^sub>a R" |
4759 apply(rotate_tac 6) |
4580 apply(rotate_tac 6) |
4760 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4581 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4761 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4582 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4762 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4583 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4763 apply(rule disjI1) |
4584 apply(rule disjI1) |
4764 apply(auto simp add: alpha a_redu.eqvt)[1] |
4585 apply(auto simp: alpha a_redu.eqvt)[1] |
4765 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4586 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4766 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4587 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4767 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4588 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4768 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4589 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4769 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4590 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4770 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4591 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4771 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4592 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4772 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4593 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4773 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4594 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4774 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4595 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4775 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4596 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4776 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4597 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4777 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4598 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4778 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4599 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4779 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4600 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4780 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4601 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4781 apply(rule disjI2) |
4602 apply(rule disjI2) |
4782 apply(auto simp add: alpha a_redu.eqvt)[1] |
4603 apply(auto simp: alpha a_redu.eqvt)[1] |
4783 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4604 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4784 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4605 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4785 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4606 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4786 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4607 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4787 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4608 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4788 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4609 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4789 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4610 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4790 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4611 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4791 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4612 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4792 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4613 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4793 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4614 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4794 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4615 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4795 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4616 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) |
4796 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4617 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4797 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4618 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI) |
4798 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4619 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4799 apply(rotate_tac 6) |
4620 apply(rotate_tac 6) |
4800 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4621 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4801 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4622 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4802 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4623 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4803 apply(rule disjI1) |
4624 apply(rule disjI1) |
4804 apply(auto simp add: alpha a_redu.eqvt)[1] |
4625 apply(auto simp: alpha a_redu.eqvt)[1] |
4805 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4626 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4806 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4627 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4807 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4628 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4808 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4629 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4809 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4630 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4810 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4631 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4811 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4632 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4812 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4633 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4813 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4634 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4814 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4635 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4815 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4636 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4816 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4637 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4817 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4638 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4818 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4639 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4819 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4640 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4820 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4641 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4821 apply(rule disjI2) |
4642 apply(rule disjI2) |
4822 apply(auto simp add: alpha a_redu.eqvt)[1] |
4643 apply(auto simp: alpha a_redu.eqvt)[1] |
4823 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4644 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4824 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4645 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4825 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4646 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4826 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4647 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4827 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4648 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4828 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4649 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4829 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4650 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) |
4830 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4651 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4831 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4652 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4832 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4653 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4833 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4654 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4834 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4655 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4835 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4656 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4836 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4657 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4837 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4658 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI) |
4838 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4659 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4839 done |
4660 done |
4840 |
4661 |
4841 lemma a_redu_AndL1_elim: |
4662 lemma a_redu_AndL1_elim: |
4842 assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a R" |
4663 assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a R" |
4843 shows "\<exists>M'. R = AndL1 (x).M' y \<and> M\<longrightarrow>\<^sub>aM'" |
4664 shows "\<exists>M'. R = AndL1 (x).M' y \<and> M\<longrightarrow>\<^sub>aM'" |
4848 apply(auto) |
4669 apply(auto) |
4849 apply(rotate_tac 3) |
4670 apply(rotate_tac 3) |
4850 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4671 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4851 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4672 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4852 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4673 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4853 apply(auto simp add: alpha a_redu.eqvt) |
4674 apply(auto simp: alpha a_redu.eqvt) |
4854 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4675 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4855 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4676 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4856 apply(simp add: perm_swap) |
4677 apply(simp add: perm_swap) |
4857 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4678 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4858 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4679 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4859 apply(simp add: perm_swap) |
4680 apply(simp add: perm_swap) |
4860 done |
4681 done |
4861 |
4682 |
4862 lemma a_redu_AndL2_elim: |
4683 lemma a_redu_AndL2_elim: |
4863 assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a R" |
4684 assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a R" |
4869 apply(auto) |
4690 apply(auto) |
4870 apply(rotate_tac 3) |
4691 apply(rotate_tac 3) |
4871 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4692 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4872 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4693 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4873 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4694 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4874 apply(auto simp add: alpha a_redu.eqvt) |
4695 apply(auto simp: alpha a_redu.eqvt) |
4875 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4696 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4876 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4697 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4877 apply(simp add: perm_swap) |
4698 apply(simp add: perm_swap) |
4878 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4699 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4879 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4700 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4880 apply(simp add: perm_swap) |
4701 apply(simp add: perm_swap) |
4881 done |
4702 done |
4882 |
4703 |
4883 lemma a_redu_OrL_elim: |
4704 lemma a_redu_OrL_elim: |
4884 assumes a: "OrL (x).M (y).N z\<longrightarrow>\<^sub>a R" |
4705 assumes a: "OrL (x).M (y).N z\<longrightarrow>\<^sub>a R" |
4890 apply(rotate_tac 6) |
4711 apply(rotate_tac 6) |
4891 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4712 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4892 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4713 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4893 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4714 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4894 apply(rule disjI1) |
4715 apply(rule disjI1) |
4895 apply(auto simp add: alpha a_redu.eqvt)[1] |
4716 apply(auto simp: alpha a_redu.eqvt)[1] |
4896 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4717 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4897 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4718 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4898 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4719 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4899 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4720 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4900 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4721 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4901 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4722 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4902 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4723 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4903 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4724 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4904 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4725 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4905 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4726 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4906 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4727 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4907 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4728 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4908 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4729 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4909 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4730 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4910 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4731 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4911 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4732 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4912 apply(rule disjI2) |
4733 apply(rule disjI2) |
4913 apply(auto simp add: alpha a_redu.eqvt)[1] |
4734 apply(auto simp: alpha a_redu.eqvt)[1] |
4914 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4735 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4915 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4736 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4916 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4737 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4917 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4738 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4918 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4739 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4919 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4740 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4920 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4741 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4921 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4742 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4922 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4743 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4923 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4744 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4924 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4745 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4925 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4746 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4926 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4747 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) |
4927 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4748 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4928 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4749 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI) |
4929 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4750 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4930 apply(rotate_tac 6) |
4751 apply(rotate_tac 6) |
4931 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4752 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4932 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4753 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4933 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4754 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4934 apply(rule disjI1) |
4755 apply(rule disjI1) |
4935 apply(auto simp add: alpha a_redu.eqvt)[1] |
4756 apply(auto simp: alpha a_redu.eqvt)[1] |
4936 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4757 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4937 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4758 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4938 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4759 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4939 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4760 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4940 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4761 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4941 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4762 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4942 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4763 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) |
4943 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4764 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4944 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4765 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4945 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4766 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4946 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4767 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4947 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4768 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4948 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4769 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4949 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4770 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4950 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4771 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI) |
4951 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4772 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4952 apply(rule disjI2) |
4773 apply(rule disjI2) |
4953 apply(auto simp add: alpha a_redu.eqvt)[1] |
4774 apply(auto simp: alpha a_redu.eqvt)[1] |
4954 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4775 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4955 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4776 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4956 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4777 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4957 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4778 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4958 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4779 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4959 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4780 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4960 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4781 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) |
4961 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4782 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4962 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4783 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4963 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4784 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4964 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4785 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4965 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4786 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4966 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4787 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4967 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4788 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4968 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4789 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI) |
4969 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4790 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4970 done |
4791 done |
4971 |
4792 |
4972 lemma a_redu_OrR1_elim: |
4793 lemma a_redu_OrR1_elim: |
4973 assumes a: "OrR1 <a>.M b \<longrightarrow>\<^sub>a R" |
4794 assumes a: "OrR1 <a>.M b \<longrightarrow>\<^sub>a R" |
4974 shows "\<exists>M'. R = OrR1 <a>.M' b \<and> M\<longrightarrow>\<^sub>aM'" |
4795 shows "\<exists>M'. R = OrR1 <a>.M' b \<and> M\<longrightarrow>\<^sub>aM'" |
4979 apply(auto) |
4800 apply(auto) |
4980 apply(rotate_tac 3) |
4801 apply(rotate_tac 3) |
4981 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4802 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4982 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4803 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4983 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4804 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4984 apply(auto simp add: alpha a_redu.eqvt) |
4805 apply(auto simp: alpha a_redu.eqvt) |
4985 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4806 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4986 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4807 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4987 apply(simp add: perm_swap) |
4808 apply(simp add: perm_swap) |
4988 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4809 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4989 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4810 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4990 apply(simp add: perm_swap) |
4811 apply(simp add: perm_swap) |
4991 done |
4812 done |
4992 |
4813 |
4993 lemma a_redu_OrR2_elim: |
4814 lemma a_redu_OrR2_elim: |
4994 assumes a: "OrR2 <a>.M b \<longrightarrow>\<^sub>a R" |
4815 assumes a: "OrR2 <a>.M b \<longrightarrow>\<^sub>a R" |
5000 apply(auto) |
4821 apply(auto) |
5001 apply(rotate_tac 3) |
4822 apply(rotate_tac 3) |
5002 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4823 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
5003 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4824 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
5004 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4825 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
5005 apply(auto simp add: alpha a_redu.eqvt) |
4826 apply(auto simp: alpha a_redu.eqvt) |
5006 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4827 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5007 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4828 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
5008 apply(simp add: perm_swap) |
4829 apply(simp add: perm_swap) |
5009 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4830 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5010 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
4831 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) |
5011 apply(simp add: perm_swap) |
4832 apply(simp add: perm_swap) |
5012 done |
4833 done |
5013 |
4834 |
5014 lemma a_redu_ImpL_elim: |
4835 lemma a_redu_ImpL_elim: |
5015 assumes a: "ImpL <a>.M (y).N z\<longrightarrow>\<^sub>a R" |
4836 assumes a: "ImpL <a>.M (y).N z\<longrightarrow>\<^sub>a R" |
5021 apply(rotate_tac 5) |
4842 apply(rotate_tac 5) |
5022 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4843 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
5023 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4844 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
5024 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4845 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
5025 apply(rule disjI1) |
4846 apply(rule disjI1) |
5026 apply(auto simp add: alpha a_redu.eqvt)[1] |
4847 apply(auto simp: alpha a_redu.eqvt)[1] |
5027 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4848 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5028 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4849 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5029 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4850 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5030 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4851 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5031 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4852 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5032 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4853 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5033 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4854 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5034 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4855 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5035 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4856 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5036 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4857 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5037 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4858 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5038 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4859 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5039 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4860 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5040 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4861 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5041 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4862 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5042 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4863 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5043 apply(rule disjI2) |
4864 apply(rule disjI2) |
5044 apply(auto simp add: alpha a_redu.eqvt)[1] |
4865 apply(auto simp: alpha a_redu.eqvt)[1] |
5045 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4866 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5046 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4867 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5047 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4868 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5048 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4869 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5049 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4870 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5050 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4871 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5051 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4872 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5052 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4873 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5053 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4874 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5054 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4875 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5055 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4876 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5056 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4877 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5057 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4878 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5058 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4879 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5059 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
4880 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) |
5060 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4881 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5061 apply(rotate_tac 5) |
4882 apply(rotate_tac 5) |
5062 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4883 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
5063 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4884 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
5064 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4885 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
5065 apply(rule disjI1) |
4886 apply(rule disjI1) |
5066 apply(auto simp add: alpha a_redu.eqvt)[1] |
4887 apply(auto simp: alpha a_redu.eqvt)[1] |
5067 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4888 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
5068 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4889 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5069 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4890 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
5070 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4891 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5071 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4892 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
5072 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4893 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5073 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
4894 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) |
5074 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4895 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5075 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4896 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
5076 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4897 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5077 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4898 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
5078 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4899 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5079 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4900 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
5080 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4901 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5081 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
4902 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI) |
5082 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4903 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5083 apply(rule disjI2) |
4904 apply(rule disjI2) |
5084 apply(auto simp add: alpha a_redu.eqvt)[1] |
4905 apply(auto simp: alpha a_redu.eqvt)[1] |
5085 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4906 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5086 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4907 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5087 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4908 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5088 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4909 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5089 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4910 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5090 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4911 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5091 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4912 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5092 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4913 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5093 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4914 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5094 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4915 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5095 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4916 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5096 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4917 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5097 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4918 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5098 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4919 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5099 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
4920 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) |
5100 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
4921 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] |
5101 done |
4922 done |
5102 |
4923 |
5103 lemma a_redu_ImpR_elim: |
4924 lemma a_redu_ImpR_elim: |
5104 assumes a: "ImpR (x).<a>.M b \<longrightarrow>\<^sub>a R" |
4925 assumes a: "ImpR (x).<a>.M b \<longrightarrow>\<^sub>a R" |
5105 shows "\<exists>M'. R = ImpR (x).<a>.M' b \<and> M\<longrightarrow>\<^sub>aM'" |
4926 shows "\<exists>M'. R = ImpR (x).<a>.M' b \<and> M\<longrightarrow>\<^sub>aM'" |
5110 apply(auto) |
4931 apply(auto) |
5111 apply(rotate_tac 3) |
4932 apply(rotate_tac 3) |
5112 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
4933 apply(erule_tac a_redu.cases, simp_all add: trm.inject) |
5113 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
4934 apply(erule_tac l_redu.cases, simp_all add: trm.inject) |
5114 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
4935 apply(erule_tac c_redu.cases, simp_all add: trm.inject) |
5115 apply(auto simp add: alpha a_redu.eqvt abs_perm abs_fresh) |
4936 apply(auto simp: alpha a_redu.eqvt abs_perm abs_fresh) |
5116 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4937 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5117 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4938 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5118 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4939 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5119 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4940 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5120 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
4941 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) |
5121 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4942 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5122 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
4943 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI) |
5123 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4944 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5124 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4945 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
5125 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4946 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5126 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
4947 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) |
5127 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4948 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5128 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI) |
4949 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI) |
5129 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4950 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5130 apply(rule sym) |
4951 apply(rule sym) |
5131 apply(rule trans) |
4952 apply(rule trans) |
5132 apply(rule perm_compose) |
4953 apply(rule perm_compose) |
5133 apply(simp add: calc_atm perm_swap) |
4954 apply(simp add: calc_atm perm_swap) |
5134 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI) |
4955 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI) |
5135 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4956 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5136 apply(rule sym) |
4957 apply(rule sym) |
5137 apply(rule trans) |
4958 apply(rule trans) |
5138 apply(rule perm_compose) |
4959 apply(rule perm_compose) |
5139 apply(simp add: calc_atm perm_swap) |
4960 apply(simp add: calc_atm perm_swap) |
5140 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4961 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
5141 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4962 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5142 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
4963 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI) |
5143 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4964 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5144 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI) |
4965 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI) |
5145 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4966 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5146 apply(rule sym) |
4967 apply(rule sym) |
5147 apply(rule trans) |
4968 apply(rule trans) |
5148 apply(rule perm_compose) |
4969 apply(rule perm_compose) |
5149 apply(simp add: calc_atm perm_swap) |
4970 apply(simp add: calc_atm perm_swap) |
5150 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI) |
4971 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI) |
5151 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
4972 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) |
5152 apply(rule sym) |
4973 apply(rule sym) |
5153 apply(rule trans) |
4974 apply(rule trans) |
5154 apply(rule perm_compose) |
4975 apply(rule perm_compose) |
5155 apply(simp add: calc_atm perm_swap) |
4976 apply(simp add: calc_atm perm_swap) |
5156 done |
4977 done |
5299 shows "(\<exists>M' N'. R = AndR <a>.M' <b>.N' c \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')" |
5120 shows "(\<exists>M' N'. R = AndR <a>.M' <b>.N' c \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')" |
5300 using a |
5121 using a |
5301 apply(induct set: rtranclp) |
5122 apply(induct set: rtranclp) |
5302 apply(auto) |
5123 apply(auto) |
5303 apply(drule a_redu_AndR_elim) |
5124 apply(drule a_redu_AndR_elim) |
5304 apply(auto simp add: alpha trm.inject) |
5125 apply(auto simp: alpha trm.inject) |
5305 done |
5126 done |
5306 |
5127 |
5307 lemma a_star_redu_AndL1_elim: |
5128 lemma a_star_redu_AndL1_elim: |
5308 assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a* R" |
5129 assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a* R" |
5309 shows "\<exists>M'. R = AndL1 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5130 shows "\<exists>M'. R = AndL1 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5310 using a |
5131 using a |
5311 apply(induct set: rtranclp) |
5132 apply(induct set: rtranclp) |
5312 apply(auto) |
5133 apply(auto) |
5313 apply(drule a_redu_AndL1_elim) |
5134 apply(drule a_redu_AndL1_elim) |
5314 apply(auto simp add: alpha trm.inject) |
5135 apply(auto simp: alpha trm.inject) |
5315 done |
5136 done |
5316 |
5137 |
5317 lemma a_star_redu_AndL2_elim: |
5138 lemma a_star_redu_AndL2_elim: |
5318 assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a* R" |
5139 assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a* R" |
5319 shows "\<exists>M'. R = AndL2 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5140 shows "\<exists>M'. R = AndL2 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5320 using a |
5141 using a |
5321 apply(induct set: rtranclp) |
5142 apply(induct set: rtranclp) |
5322 apply(auto) |
5143 apply(auto) |
5323 apply(drule a_redu_AndL2_elim) |
5144 apply(drule a_redu_AndL2_elim) |
5324 apply(auto simp add: alpha trm.inject) |
5145 apply(auto simp: alpha trm.inject) |
5325 done |
5146 done |
5326 |
5147 |
5327 lemma a_star_redu_OrL_elim: |
5148 lemma a_star_redu_OrL_elim: |
5328 assumes a: "OrL (x).M (y).N z \<longrightarrow>\<^sub>a* R" |
5149 assumes a: "OrL (x).M (y).N z \<longrightarrow>\<^sub>a* R" |
5329 shows "(\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')" |
5150 shows "(\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')" |
5330 using a |
5151 using a |
5331 apply(induct set: rtranclp) |
5152 apply(induct set: rtranclp) |
5332 apply(auto) |
5153 apply(auto) |
5333 apply(drule a_redu_OrL_elim) |
5154 apply(drule a_redu_OrL_elim) |
5334 apply(auto simp add: alpha trm.inject) |
5155 apply(auto simp: alpha trm.inject) |
5335 done |
5156 done |
5336 |
5157 |
5337 lemma a_star_redu_OrR1_elim: |
5158 lemma a_star_redu_OrR1_elim: |
5338 assumes a: "OrR1 <a>.M y \<longrightarrow>\<^sub>a* R" |
5159 assumes a: "OrR1 <a>.M y \<longrightarrow>\<^sub>a* R" |
5339 shows "\<exists>M'. R = OrR1 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5160 shows "\<exists>M'. R = OrR1 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5340 using a |
5161 using a |
5341 apply(induct set: rtranclp) |
5162 apply(induct set: rtranclp) |
5342 apply(auto) |
5163 apply(auto) |
5343 apply(drule a_redu_OrR1_elim) |
5164 apply(drule a_redu_OrR1_elim) |
5344 apply(auto simp add: alpha trm.inject) |
5165 apply(auto simp: alpha trm.inject) |
5345 done |
5166 done |
5346 |
5167 |
5347 lemma a_star_redu_OrR2_elim: |
5168 lemma a_star_redu_OrR2_elim: |
5348 assumes a: "OrR2 <a>.M y \<longrightarrow>\<^sub>a* R" |
5169 assumes a: "OrR2 <a>.M y \<longrightarrow>\<^sub>a* R" |
5349 shows "\<exists>M'. R = OrR2 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5170 shows "\<exists>M'. R = OrR2 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5350 using a |
5171 using a |
5351 apply(induct set: rtranclp) |
5172 apply(induct set: rtranclp) |
5352 apply(auto) |
5173 apply(auto) |
5353 apply(drule a_redu_OrR2_elim) |
5174 apply(drule a_redu_OrR2_elim) |
5354 apply(auto simp add: alpha trm.inject) |
5175 apply(auto simp: alpha trm.inject) |
5355 done |
5176 done |
5356 |
5177 |
5357 lemma a_star_redu_ImpR_elim: |
5178 lemma a_star_redu_ImpR_elim: |
5358 assumes a: "ImpR (x).<a>.M y \<longrightarrow>\<^sub>a* R" |
5179 assumes a: "ImpR (x).<a>.M y \<longrightarrow>\<^sub>a* R" |
5359 shows "\<exists>M'. R = ImpR (x).<a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5180 shows "\<exists>M'. R = ImpR (x).<a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'" |
5360 using a |
5181 using a |
5361 apply(induct set: rtranclp) |
5182 apply(induct set: rtranclp) |
5362 apply(auto) |
5183 apply(auto) |
5363 apply(drule a_redu_ImpR_elim) |
5184 apply(drule a_redu_ImpR_elim) |
5364 apply(auto simp add: alpha trm.inject) |
5185 apply(auto simp: alpha trm.inject) |
5365 done |
5186 done |
5366 |
5187 |
5367 lemma a_star_redu_ImpL_elim: |
5188 lemma a_star_redu_ImpL_elim: |
5368 assumes a: "ImpL <a>.M (y).N z \<longrightarrow>\<^sub>a* R" |
5189 assumes a: "ImpL <a>.M (y).N z \<longrightarrow>\<^sub>a* R" |
5369 shows "(\<exists>M' N'. R = ImpL <a>.M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')" |
5190 shows "(\<exists>M' N'. R = ImpL <a>.M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')" |
5370 using a |
5191 using a |
5371 apply(induct set: rtranclp) |
5192 apply(induct set: rtranclp) |
5372 apply(auto) |
5193 apply(auto) |
5373 apply(drule a_redu_ImpL_elim) |
5194 apply(drule a_redu_ImpL_elim) |
5374 apply(auto simp add: alpha trm.inject) |
5195 apply(auto simp: alpha trm.inject) |
5375 done |
5196 done |
5376 |
5197 |
5377 text \<open>Substitution\<close> |
5198 text \<open>Substitution\<close> |
5378 |
5199 |
5379 lemma subst_not_fin1: |
5200 lemma subst_not_fin1: |
5699 assumes a: "fin M x" |
5520 assumes a: "fin M x" |
5700 and b: "M \<longrightarrow>\<^sub>a* M'" |
5521 and b: "M \<longrightarrow>\<^sub>a* M'" |
5701 shows "fin M' x" |
5522 shows "fin M' x" |
5702 using b a |
5523 using b a |
5703 apply(induct set: rtranclp) |
5524 apply(induct set: rtranclp) |
5704 apply(auto simp add: fin_a_reduce) |
5525 apply(auto simp: fin_a_reduce) |
5705 done |
5526 done |
5706 |
5527 |
5707 lemma fic_l_reduce: |
5528 lemma fic_l_reduce: |
5708 assumes a: "fic M x" |
5529 assumes a: "fic M x" |
5709 and b: "M \<longrightarrow>\<^sub>l M'" |
5530 and b: "M \<longrightarrow>\<^sub>l M'" |
5765 assumes a: "fic M x" |
5586 assumes a: "fic M x" |
5766 and b: "M \<longrightarrow>\<^sub>a* M'" |
5587 and b: "M \<longrightarrow>\<^sub>a* M'" |
5767 shows "fic M' x" |
5588 shows "fic M' x" |
5768 using b a |
5589 using b a |
5769 apply(induct set: rtranclp) |
5590 apply(induct set: rtranclp) |
5770 apply(auto simp add: fic_a_reduce) |
5591 apply(auto simp: fic_a_reduce) |
5771 done |
5592 done |
5772 |
5593 |
5773 text \<open>substitution properties\<close> |
5594 text \<open>substitution properties\<close> |
5774 |
5595 |
5775 lemma subst_with_ax1: |
5596 lemma subst_with_ax1: |
5880 apply(rule better_LAxL_intro) |
5701 apply(rule better_LAxL_intro) |
5881 apply(rule fin.intros) |
5702 apply(rule fin.intros) |
5882 apply(simp add: abs_fresh) |
5703 apply(simp add: abs_fresh) |
5883 done |
5704 done |
5884 also have "\<dots> = AndL1 (u).(M{x:=<a>.Ax y a}) y" using fs new |
5705 also have "\<dots> = AndL1 (u).(M{x:=<a>.Ax y a}) y" using fs new |
5885 by (auto simp add: fresh_prod fresh_atm nrename_fresh) |
5706 by (auto simp: fresh_prod fresh_atm nrename_fresh) |
5886 also have "\<dots> \<longrightarrow>\<^sub>a* AndL1 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) |
5707 also have "\<dots> \<longrightarrow>\<^sub>a* AndL1 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) |
5887 also have "\<dots> = (AndL1 (u).M v)[x\<turnstile>n>y]" using eq fs by simp |
5708 also have "\<dots> = (AndL1 (u).M v)[x\<turnstile>n>y]" using eq fs by simp |
5888 finally show "(AndL1 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL1 (u).M v)[x\<turnstile>n>y]" by simp |
5709 finally show "(AndL1 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL1 (u).M v)[x\<turnstile>n>y]" by simp |
5889 next |
5710 next |
5890 case False |
5711 case False |
5914 apply(rule better_LAxL_intro) |
5735 apply(rule better_LAxL_intro) |
5915 apply(rule fin.intros) |
5736 apply(rule fin.intros) |
5916 apply(simp add: abs_fresh) |
5737 apply(simp add: abs_fresh) |
5917 done |
5738 done |
5918 also have "\<dots> = AndL2 (u).(M{x:=<a>.Ax y a}) y" using fs new |
5739 also have "\<dots> = AndL2 (u).(M{x:=<a>.Ax y a}) y" using fs new |
5919 by (auto simp add: fresh_prod fresh_atm nrename_fresh) |
5740 by (auto simp: fresh_prod fresh_atm nrename_fresh) |
5920 also have "\<dots> \<longrightarrow>\<^sub>a* AndL2 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) |
5741 also have "\<dots> \<longrightarrow>\<^sub>a* AndL2 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) |
5921 also have "\<dots> = (AndL2 (u).M v)[x\<turnstile>n>y]" using eq fs by simp |
5742 also have "\<dots> = (AndL2 (u).M v)[x\<turnstile>n>y]" using eq fs by simp |
5922 finally show "(AndL2 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL2 (u).M v)[x\<turnstile>n>y]" by simp |
5743 finally show "(AndL2 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL2 (u).M v)[x\<turnstile>n>y]" by simp |
5923 next |
5744 next |
5924 case False |
5745 case False |
5964 apply(rule better_LAxL_intro) |
5785 apply(rule better_LAxL_intro) |
5965 apply(rule fin.intros) |
5786 apply(rule fin.intros) |
5966 apply(simp_all add: abs_fresh) |
5787 apply(simp_all add: abs_fresh) |
5967 done |
5788 done |
5968 also have "\<dots> = OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) y" using fs new |
5789 also have "\<dots> = OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) y" using fs new |
5969 by (auto simp add: fresh_prod fresh_atm nrename_fresh subst_fresh) |
5790 by (auto simp: fresh_prod fresh_atm nrename_fresh subst_fresh) |
5970 also have "\<dots> \<longrightarrow>\<^sub>a* OrL (u).(M[x\<turnstile>n>y]) (v).(N[x\<turnstile>n>y]) y" |
5791 also have "\<dots> \<longrightarrow>\<^sub>a* OrL (u).(M[x\<turnstile>n>y]) (v).(N[x\<turnstile>n>y]) y" |
5971 using ih1 ih2 by (auto intro: a_star_congs) |
5792 using ih1 ih2 by (auto intro: a_star_congs) |
5972 also have "\<dots> = (OrL (u).M (v).N z)[x\<turnstile>n>y]" using eq fs by simp |
5793 also have "\<dots> = (OrL (u).M (v).N z)[x\<turnstile>n>y]" using eq fs by simp |
5973 finally show "(OrL (u).M (v).N z){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" by simp |
5794 finally show "(OrL (u).M (v).N z){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" by simp |
5974 next |
5795 next |
6010 apply(rule better_LAxL_intro) |
5831 apply(rule better_LAxL_intro) |
6011 apply(rule fin.intros) |
5832 apply(rule fin.intros) |
6012 apply(simp_all add: abs_fresh) |
5833 apply(simp_all add: abs_fresh) |
6013 done |
5834 done |
6014 also have "\<dots> = ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) y" using fs new |
5835 also have "\<dots> = ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) y" using fs new |
6015 by (auto simp add: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh) |
5836 by (auto simp: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh) |
6016 also have "\<dots> \<longrightarrow>\<^sub>a* ImpL <c>.(M[x\<turnstile>n>y]) (u).(N[x\<turnstile>n>y]) y" |
5837 also have "\<dots> \<longrightarrow>\<^sub>a* ImpL <c>.(M[x\<turnstile>n>y]) (u).(N[x\<turnstile>n>y]) y" |
6017 using ih1 ih2 by (auto intro: a_star_congs) |
5838 using ih1 ih2 by (auto intro: a_star_congs) |
6018 also have "\<dots> = (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using eq fs by simp |
5839 also have "\<dots> = (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using eq fs by simp |
6019 finally show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using fs by simp |
5840 finally show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using fs by simp |
6020 next |
5841 next |
6130 apply(rule better_LAxR_intro) |
5951 apply(rule better_LAxR_intro) |
6131 apply(rule fic.intros) |
5952 apply(rule fic.intros) |
6132 apply(simp_all add: abs_fresh) |
5953 apply(simp_all add: abs_fresh) |
6133 done |
5954 done |
6134 also have "\<dots> = AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) a" using fs new |
5955 also have "\<dots> = AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) a" using fs new |
6135 by (auto simp add: fresh_prod fresh_atm subst_fresh crename_fresh) |
5956 by (auto simp: fresh_prod fresh_atm subst_fresh crename_fresh) |
6136 also have "\<dots> \<longrightarrow>\<^sub>a* AndR <c>.(M[b\<turnstile>c>a]) <d>.(N[b\<turnstile>c>a]) a" using ih1 ih2 by (auto intro: a_star_congs) |
5957 also have "\<dots> \<longrightarrow>\<^sub>a* AndR <c>.(M[b\<turnstile>c>a]) <d>.(N[b\<turnstile>c>a]) a" using ih1 ih2 by (auto intro: a_star_congs) |
6137 also have "\<dots> = (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" using eq fs by simp |
5958 also have "\<dots> = (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" using eq fs by simp |
6138 finally show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" by simp |
5959 finally show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" by simp |
6139 next |
5960 next |
6140 case False |
5961 case False |
6180 apply(rule better_LAxR_intro) |
6001 apply(rule better_LAxR_intro) |
6181 apply(rule fic.intros) |
6002 apply(rule fic.intros) |
6182 apply(simp_all add: abs_fresh) |
6003 apply(simp_all add: abs_fresh) |
6183 done |
6004 done |
6184 also have "\<dots> = OrR1 <c>.M{b:=(x).Ax x a} a" using fs new |
6005 also have "\<dots> = OrR1 <c>.M{b:=(x).Ax x a} a" using fs new |
6185 by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh) |
6006 by (auto simp: fresh_prod fresh_atm crename_fresh subst_fresh) |
6186 also have "\<dots> \<longrightarrow>\<^sub>a* OrR1 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) |
6007 also have "\<dots> \<longrightarrow>\<^sub>a* OrR1 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) |
6187 also have "\<dots> = (OrR1 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp |
6008 also have "\<dots> = (OrR1 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp |
6188 finally show "(OrR1 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR1 <c>.M d)[b\<turnstile>c>a]" by simp |
6009 finally show "(OrR1 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR1 <c>.M d)[b\<turnstile>c>a]" by simp |
6189 next |
6010 next |
6190 case False |
6011 case False |
6214 apply(rule better_LAxR_intro) |
6035 apply(rule better_LAxR_intro) |
6215 apply(rule fic.intros) |
6036 apply(rule fic.intros) |
6216 apply(simp_all add: abs_fresh) |
6037 apply(simp_all add: abs_fresh) |
6217 done |
6038 done |
6218 also have "\<dots> = OrR2 <c>.M{b:=(x).Ax x a} a" using fs new |
6039 also have "\<dots> = OrR2 <c>.M{b:=(x).Ax x a} a" using fs new |
6219 by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh) |
6040 by (auto simp: fresh_prod fresh_atm crename_fresh subst_fresh) |
6220 also have "\<dots> \<longrightarrow>\<^sub>a* OrR2 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) |
6041 also have "\<dots> \<longrightarrow>\<^sub>a* OrR2 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) |
6221 also have "\<dots> = (OrR2 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp |
6042 also have "\<dots> = (OrR2 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp |
6222 finally show "(OrR2 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR2 <c>.M d)[b\<turnstile>c>a]" by simp |
6043 finally show "(OrR2 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR2 <c>.M d)[b\<turnstile>c>a]" by simp |
6223 next |
6044 next |
6224 case False |
6045 case False |
6257 apply(rule better_LAxR_intro) |
6078 apply(rule better_LAxR_intro) |
6258 apply(rule fic.intros) |
6079 apply(rule fic.intros) |
6259 apply(simp_all add: abs_fresh) |
6080 apply(simp_all add: abs_fresh) |
6260 done |
6081 done |
6261 also have "\<dots> = ImpR z.<c>.M{b:=(x).Ax x a} a" using fs new |
6082 also have "\<dots> = ImpR z.<c>.M{b:=(x).Ax x a} a" using fs new |
6262 by (auto simp add: fresh_prod crename_fresh subst_fresh fresh_atm) |
6083 by (auto simp: fresh_prod crename_fresh subst_fresh fresh_atm) |
6263 also have "\<dots> \<longrightarrow>\<^sub>a* ImpR z.<c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) |
6084 also have "\<dots> \<longrightarrow>\<^sub>a* ImpR z.<c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) |
6264 also have "\<dots> = (ImpR z.<c>.M b)[b\<turnstile>c>a]" using eq fs by simp |
6085 also have "\<dots> = (ImpR z.<c>.M b)[b\<turnstile>c>a]" using eq fs by simp |
6265 finally show "(ImpR (z).<c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" using eq by simp |
6086 finally show "(ImpR (z).<c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" using eq by simp |
6266 next |
6087 next |
6267 case False |
6088 case False |
6286 text \<open>substitution lemmas\<close> |
6107 text \<open>substitution lemmas\<close> |
6287 |
6108 |
6288 lemma not_Ax1: |
6109 lemma not_Ax1: |
6289 shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a" |
6110 shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a" |
6290 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) |
6111 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) |
6291 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
6112 apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
6292 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)") |
6113 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)") |
6293 apply(erule exE) |
6114 apply(erule exE) |
6294 apply(simp add: fresh_prod) |
6115 apply(simp add: fresh_prod) |
6295 apply(erule conjE)+ |
6116 apply(erule conjE)+ |
6296 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) |
6117 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) |
6358 done |
6179 done |
6359 |
6180 |
6360 lemma not_Ax2: |
6181 lemma not_Ax2: |
6361 shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a" |
6182 shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a" |
6362 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) |
6183 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) |
6363 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
6184 apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp) |
6364 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)") |
6185 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)") |
6365 apply(erule exE) |
6186 apply(erule exE) |
6366 apply(simp add: fresh_prod) |
6187 apply(simp add: fresh_prod) |
6367 apply(erule conjE)+ |
6188 apply(erule conjE)+ |
6368 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) |
6189 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) |
6440 shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}" |
6261 shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}" |
6441 using a |
6262 using a |
6442 proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct) |
6263 proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct) |
6443 case Ax |
6264 case Ax |
6444 then show ?case |
6265 then show ?case |
6445 by (auto simp add: abs_fresh fresh_atm forget trm.inject) |
6266 by (auto simp: abs_fresh fresh_atm forget trm.inject) |
6446 next |
6267 next |
6447 case (Cut d M u M' x' y' c P) |
6268 case (Cut d M u M' x' y' c P) |
6448 with assms show ?case |
6269 with assms show ?case |
6449 apply(simp) |
6270 apply(simp) |
6450 apply(auto) |
6271 apply(auto) |
6527 apply(simp add: not_Ax2) |
6348 apply(simp add: not_Ax2) |
6528 done |
6349 done |
6529 next |
6350 next |
6530 case NotR |
6351 case NotR |
6531 then show ?case |
6352 then show ?case |
6532 by (auto simp add: abs_fresh fresh_atm forget) |
6353 by (auto simp: abs_fresh fresh_atm forget) |
6533 next |
6354 next |
6534 case (NotL d M u) |
6355 case (NotL d M u) |
6535 then show ?case |
6356 then show ?case |
6536 apply (auto simp add: abs_fresh fresh_atm forget) |
6357 apply (auto simp: abs_fresh fresh_atm forget) |
6537 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},y,x)") |
6358 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},y,x)") |
6538 apply(erule exE, simp add: fresh_prod) |
6359 apply(erule exE, simp add: fresh_prod) |
6539 apply(erule conjE)+ |
6360 apply(erule conjE)+ |
6540 apply(simp add: fresh_fun_simp_NotL) |
6361 apply(simp add: fresh_fun_simp_NotL) |
6541 apply(rule trans) |
6362 apply(rule trans) |
6542 apply(rule better_Cut_substn) |
6363 apply(rule better_Cut_substn) |
6543 apply(simp add: abs_fresh) |
6364 apply(simp add: abs_fresh) |
6544 apply(simp) |
6365 apply(simp) |
6545 apply(simp) |
6366 apply(simp) |
6546 apply(auto simp add: fresh_atm) |
6367 apply(auto simp: fresh_atm) |
6547 apply(simp add: trm.inject alpha forget) |
6368 apply(simp add: trm.inject alpha forget) |
6548 apply(rule exists_fresh'(1)[OF fs_name1]) |
6369 apply(rule exists_fresh'(1)[OF fs_name1]) |
6549 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},Ax y c,y,x)") |
6370 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},Ax y c,y,x)") |
6550 apply(erule exE, simp only: fresh_prod) |
6371 apply(erule exE, simp only: fresh_prod) |
6551 apply(erule conjE)+ |
6372 apply(erule conjE)+ |
6564 apply(rule exists_fresh'(1)[OF fs_name1]) |
6385 apply(rule exists_fresh'(1)[OF fs_name1]) |
6565 done |
6386 done |
6566 next |
6387 next |
6567 case (AndR d1 M d2 M' d3) |
6388 case (AndR d1 M d2 M' d3) |
6568 then show ?case |
6389 then show ?case |
6569 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6390 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6570 next |
6391 next |
6571 case (AndL1 u M d) |
6392 case (AndL1 u M d) |
6572 then show ?case |
6393 then show ?case |
6573 apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6394 apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6574 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6395 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6575 apply(erule exE, simp add: fresh_prod) |
6396 apply(erule exE, simp add: fresh_prod) |
6576 apply(erule conjE)+ |
6397 apply(erule conjE)+ |
6577 apply(simp add: fresh_fun_simp_AndL1) |
6398 apply(simp add: fresh_fun_simp_AndL1) |
6578 apply(rule trans) |
6399 apply(rule trans) |
6579 apply(rule better_Cut_substn) |
6400 apply(rule better_Cut_substn) |
6580 apply(simp add: abs_fresh) |
6401 apply(simp add: abs_fresh) |
6581 apply(simp) |
6402 apply(simp) |
6582 apply(simp) |
6403 apply(simp) |
6583 apply(auto simp add: fresh_atm) |
6404 apply(auto simp: fresh_atm) |
6584 apply(simp add: trm.inject alpha forget) |
6405 apply(simp add: trm.inject alpha forget) |
6585 apply(rule exists_fresh'(1)[OF fs_name1]) |
6406 apply(rule exists_fresh'(1)[OF fs_name1]) |
6586 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6407 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6587 apply(erule exE, simp only: fresh_prod) |
6408 apply(erule exE, simp only: fresh_prod) |
6588 apply(erule conjE)+ |
6409 apply(erule conjE)+ |
6591 apply(rule trans) |
6412 apply(rule trans) |
6592 apply(rule better_Cut_substn) |
6413 apply(rule better_Cut_substn) |
6593 apply(simp add: abs_fresh) |
6414 apply(simp add: abs_fresh) |
6594 apply(simp) |
6415 apply(simp) |
6595 apply(simp) |
6416 apply(simp) |
6596 apply(auto simp add: fresh_atm) |
6417 apply(auto simp: fresh_atm) |
6597 apply(rule exists_fresh'(1)[OF fs_name1]) |
6418 apply(rule exists_fresh'(1)[OF fs_name1]) |
6598 done |
6419 done |
6599 next |
6420 next |
6600 case (AndL2 u M d) |
6421 case (AndL2 u M d) |
6601 then show ?case |
6422 then show ?case |
6602 apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6423 apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6603 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6424 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6604 apply(erule exE, simp add: fresh_prod) |
6425 apply(erule exE, simp add: fresh_prod) |
6605 apply(erule conjE)+ |
6426 apply(erule conjE)+ |
6606 apply(simp add: fresh_fun_simp_AndL2) |
6427 apply(simp add: fresh_fun_simp_AndL2) |
6607 apply(rule trans) |
6428 apply(rule trans) |
6608 apply(rule better_Cut_substn) |
6429 apply(rule better_Cut_substn) |
6609 apply(simp add: abs_fresh) |
6430 apply(simp add: abs_fresh) |
6610 apply(simp) |
6431 apply(simp) |
6611 apply(simp) |
6432 apply(simp) |
6612 apply(auto simp add: fresh_atm) |
6433 apply(auto simp: fresh_atm) |
6613 apply(simp add: trm.inject alpha forget) |
6434 apply(simp add: trm.inject alpha forget) |
6614 apply(rule exists_fresh'(1)[OF fs_name1]) |
6435 apply(rule exists_fresh'(1)[OF fs_name1]) |
6615 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6436 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") |
6616 apply(erule exE, simp only: fresh_prod) |
6437 apply(erule exE, simp only: fresh_prod) |
6617 apply(erule conjE)+ |
6438 apply(erule conjE)+ |
6620 apply(rule trans) |
6441 apply(rule trans) |
6621 apply(rule better_Cut_substn) |
6442 apply(rule better_Cut_substn) |
6622 apply(simp add: abs_fresh) |
6443 apply(simp add: abs_fresh) |
6623 apply(simp) |
6444 apply(simp) |
6624 apply(simp) |
6445 apply(simp) |
6625 apply(auto simp add: fresh_atm) |
6446 apply(auto simp: fresh_atm) |
6626 apply(rule exists_fresh'(1)[OF fs_name1]) |
6447 apply(rule exists_fresh'(1)[OF fs_name1]) |
6627 done |
6448 done |
6628 next |
6449 next |
6629 case OrR1 |
6450 case OrR1 |
6630 then show ?case |
6451 then show ?case |
6631 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6452 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6632 next |
6453 next |
6633 case OrR2 |
6454 case OrR2 |
6634 then show ?case |
6455 then show ?case |
6635 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6456 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6636 next |
6457 next |
6637 case (OrL x1 M x2 M' x3) |
6458 case (OrL x1 M x2 M' x3) |
6638 then show ?case |
6459 then show ?case |
6639 apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6460 apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6640 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P}, |
6461 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P}, |
6641 M'{y:=<c>.P},M'{x:=<c>.Ax y c}{y:=<c>.P},x1,x2,x3,y,x)") |
6462 M'{y:=<c>.P},M'{x:=<c>.Ax y c}{y:=<c>.P},x1,x2,x3,y,x)") |
6642 apply(erule exE, simp add: fresh_prod) |
6463 apply(erule exE, simp add: fresh_prod) |
6643 apply(erule conjE)+ |
6464 apply(erule conjE)+ |
6644 apply(simp add: fresh_fun_simp_OrL) |
6465 apply(simp add: fresh_fun_simp_OrL) |
6645 apply(rule trans) |
6466 apply(rule trans) |
6646 apply(rule better_Cut_substn) |
6467 apply(rule better_Cut_substn) |
6647 apply(simp add: abs_fresh) |
6468 apply(simp add: abs_fresh) |
6648 apply(simp) |
6469 apply(simp) |
6649 apply(simp) |
6470 apply(simp) |
6650 apply(auto simp add: fresh_atm) |
6471 apply(auto simp: fresh_atm) |
6651 apply(simp add: trm.inject alpha forget) |
6472 apply(simp add: trm.inject alpha forget) |
6652 apply(rule trans) |
6473 apply(rule trans) |
6653 apply(rule substn.simps) |
6474 apply(rule substn.simps) |
6654 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6475 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6655 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6476 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6672 apply(rule substn.simps) |
6493 apply(rule substn.simps) |
6673 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6494 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6674 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6495 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6675 apply(force) |
6496 apply(force) |
6676 apply(simp) |
6497 apply(simp) |
6677 apply(auto simp add: fresh_atm) |
6498 apply(auto simp: fresh_atm) |
6678 apply(rule exists_fresh'(1)[OF fs_name1]) |
6499 apply(rule exists_fresh'(1)[OF fs_name1]) |
6679 done |
6500 done |
6680 next |
6501 next |
6681 case ImpR |
6502 case ImpR |
6682 then show ?case |
6503 then show ?case |
6683 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6504 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6684 next |
6505 next |
6685 case (ImpL a M x1 M' x2) |
6506 case (ImpL a M x1 M' x2) |
6686 then show ?case |
6507 then show ?case |
6687 apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6508 apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6688 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x2:=<c>.P},M{x:=<c>.Ax x2 c}{x2:=<c>.P}, |
6509 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x2:=<c>.P},M{x:=<c>.Ax x2 c}{x2:=<c>.P}, |
6689 M'{x2:=<c>.P},M'{x:=<c>.Ax x2 c}{x2:=<c>.P},x1,y,x)") |
6510 M'{x2:=<c>.P},M'{x:=<c>.Ax x2 c}{x2:=<c>.P},x1,y,x)") |
6690 apply(erule exE, simp add: fresh_prod) |
6511 apply(erule exE, simp add: fresh_prod) |
6691 apply(erule conjE)+ |
6512 apply(erule conjE)+ |
6692 apply(simp add: fresh_fun_simp_ImpL) |
6513 apply(simp add: fresh_fun_simp_ImpL) |
6693 apply(rule trans) |
6514 apply(rule trans) |
6694 apply(rule better_Cut_substn) |
6515 apply(rule better_Cut_substn) |
6695 apply(simp add: abs_fresh) |
6516 apply(simp add: abs_fresh) |
6696 apply(simp) |
6517 apply(simp) |
6697 apply(simp) |
6518 apply(simp) |
6698 apply(auto simp add: fresh_atm) |
6519 apply(auto simp: fresh_atm) |
6699 apply(simp add: trm.inject alpha forget) |
6520 apply(simp add: trm.inject alpha forget) |
6700 apply(rule trans) |
6521 apply(rule trans) |
6701 apply(rule substn.simps) |
6522 apply(rule substn.simps) |
6702 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6523 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6703 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6524 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6718 apply(rule trans) |
6539 apply(rule trans) |
6719 apply(rule substn.simps) |
6540 apply(rule substn.simps) |
6720 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6541 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6721 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6542 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6722 apply(simp) |
6543 apply(simp) |
6723 apply(auto simp add: fresh_atm) |
6544 apply(auto simp: fresh_atm) |
6724 apply(rule exists_fresh'(1)[OF fs_name1]) |
6545 apply(rule exists_fresh'(1)[OF fs_name1]) |
6725 done |
6546 done |
6726 qed |
6547 qed |
6727 |
6548 |
6728 lemma interesting_subst1': |
6549 lemma interesting_subst1': |
6748 shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}" |
6569 shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}" |
6749 using a |
6570 using a |
6750 proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct) |
6571 proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct) |
6751 case Ax |
6572 case Ax |
6752 then show ?case |
6573 then show ?case |
6753 by (auto simp add: abs_fresh fresh_atm forget trm.inject) |
6574 by (auto simp: abs_fresh fresh_atm forget trm.inject) |
6754 next |
6575 next |
6755 case (Cut d M u M' x' y' c P) |
6576 case (Cut d M u M' x' y' c P) |
6756 with assms show ?case |
6577 with assms show ?case |
6757 apply(simp) |
6578 apply(simp) |
6758 apply(auto simp add: trm.inject) |
6579 apply(auto simp: trm.inject) |
6759 apply(rule trans) |
6580 apply(rule trans) |
6760 apply(rule better_Cut_substc) |
6581 apply(rule better_Cut_substc) |
6761 apply(simp) |
6582 apply(simp) |
6762 apply(simp add: abs_fresh) |
6583 apply(simp add: abs_fresh) |
6763 apply(simp add: forget) |
6584 apply(simp add: forget) |
6813 apply(simp add: not_Ax1) |
6634 apply(simp add: not_Ax1) |
6814 done |
6635 done |
6815 next |
6636 next |
6816 case NotL |
6637 case NotL |
6817 then show ?case |
6638 then show ?case |
6818 by (auto simp add: abs_fresh fresh_atm forget) |
6639 by (auto simp: abs_fresh fresh_atm forget) |
6819 next |
6640 next |
6820 case (NotR u M d) |
6641 case (NotR u M d) |
6821 then show ?case |
6642 then show ?case |
6822 apply (auto simp add: abs_fresh fresh_atm forget) |
6643 apply (auto simp: abs_fresh fresh_atm forget) |
6823 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P},u,y)") |
6644 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P},u,y)") |
6824 apply(erule exE, simp add: fresh_prod) |
6645 apply(erule exE, simp add: fresh_prod) |
6825 apply(erule conjE)+ |
6646 apply(erule conjE)+ |
6826 apply(simp add: fresh_fun_simp_NotR) |
6647 apply(simp add: fresh_fun_simp_NotR) |
6827 apply(rule trans) |
6648 apply(rule trans) |
6828 apply(rule better_Cut_substc) |
6649 apply(rule better_Cut_substc) |
6829 apply(simp add: abs_fresh) |
6650 apply(simp add: abs_fresh) |
6830 apply(simp add: abs_fresh) |
6651 apply(simp add: abs_fresh) |
6831 apply(simp) |
6652 apply(simp) |
6832 apply(auto simp add: fresh_atm) |
6653 apply(auto simp: fresh_atm) |
6833 apply(simp add: trm.inject alpha forget) |
6654 apply(simp add: trm.inject alpha forget) |
6834 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6655 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6835 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P},Ax y a,y,d)") |
6656 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P},Ax y a,y,d)") |
6836 apply(erule exE, simp only: fresh_prod) |
6657 apply(erule exE, simp only: fresh_prod) |
6837 apply(erule conjE)+ |
6658 apply(erule conjE)+ |
6850 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6671 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6851 done |
6672 done |
6852 next |
6673 next |
6853 case (AndR d1 M d2 M' d3) |
6674 case (AndR d1 M d2 M' d3) |
6854 then show ?case |
6675 then show ?case |
6855 apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6676 apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6856 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d3:=(y).P},M{b:=(y).Ax y d3}{d3:=(y).P}, |
6677 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d3:=(y).P},M{b:=(y).Ax y d3}{d3:=(y).P}, |
6857 M'{d3:=(y).P},M'{b:=(y).Ax y d3}{d3:=(y).P},d1,d2,d3,b,y)") |
6678 M'{d3:=(y).P},M'{b:=(y).Ax y d3}{d3:=(y).P},d1,d2,d3,b,y)") |
6858 apply(erule exE, simp add: fresh_prod) |
6679 apply(erule exE, simp add: fresh_prod) |
6859 apply(erule conjE)+ |
6680 apply(erule conjE)+ |
6860 apply(simp add: fresh_fun_simp_AndR) |
6681 apply(simp add: fresh_fun_simp_AndR) |
6861 apply(rule trans) |
6682 apply(rule trans) |
6862 apply(rule better_Cut_substc) |
6683 apply(rule better_Cut_substc) |
6863 apply(simp add: abs_fresh fresh_atm) |
6684 apply(simp add: abs_fresh fresh_atm) |
6864 apply(simp add: abs_fresh fresh_atm) |
6685 apply(simp add: abs_fresh fresh_atm) |
6865 apply(simp) |
6686 apply(simp) |
6866 apply(auto simp add: fresh_atm) |
6687 apply(auto simp: fresh_atm) |
6867 apply(simp add: trm.inject alpha forget) |
6688 apply(simp add: trm.inject alpha forget) |
6868 apply(rule trans) |
6689 apply(rule trans) |
6869 apply(rule substc.simps) |
6690 apply(rule substc.simps) |
6870 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6691 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6871 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6692 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6888 apply(rule substc.simps) |
6709 apply(rule substc.simps) |
6889 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6710 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6890 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6711 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6891 apply(force) |
6712 apply(force) |
6892 apply(simp) |
6713 apply(simp) |
6893 apply(auto simp add: fresh_atm) |
6714 apply(auto simp: fresh_atm) |
6894 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6715 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6895 done |
6716 done |
6896 next |
6717 next |
6897 case (AndL1 u M d) |
6718 case (AndL1 u M d) |
6898 then show ?case |
6719 then show ?case |
6899 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6720 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6900 next |
6721 next |
6901 case (AndL2 u M d) |
6722 case (AndL2 u M d) |
6902 then show ?case |
6723 then show ?case |
6903 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6724 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6904 next |
6725 next |
6905 case (OrR1 d M e) |
6726 case (OrR1 d M e) |
6906 then show ?case |
6727 then show ?case |
6907 apply (auto simp add: abs_fresh fresh_atm forget) |
6728 apply (auto simp: abs_fresh fresh_atm forget) |
6908 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)") |
6729 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)") |
6909 apply(erule exE, simp add: fresh_prod) |
6730 apply(erule exE, simp add: fresh_prod) |
6910 apply(erule conjE)+ |
6731 apply(erule conjE)+ |
6911 apply(simp add: fresh_fun_simp_OrR1) |
6732 apply(simp add: fresh_fun_simp_OrR1) |
6912 apply(rule trans) |
6733 apply(rule trans) |
6913 apply(rule better_Cut_substc) |
6734 apply(rule better_Cut_substc) |
6914 apply(simp add: abs_fresh) |
6735 apply(simp add: abs_fresh) |
6915 apply(simp add: abs_fresh) |
6736 apply(simp add: abs_fresh) |
6916 apply(simp) |
6737 apply(simp) |
6917 apply(auto simp add: fresh_atm) |
6738 apply(auto simp: fresh_atm) |
6918 apply(simp add: trm.inject alpha forget) |
6739 apply(simp add: trm.inject alpha forget) |
6919 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6740 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6920 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") |
6741 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") |
6921 apply(erule exE, simp only: fresh_prod) |
6742 apply(erule exE, simp only: fresh_prod) |
6922 apply(erule conjE)+ |
6743 apply(erule conjE)+ |
6935 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6756 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6936 done |
6757 done |
6937 next |
6758 next |
6938 case (OrR2 d M e) |
6759 case (OrR2 d M e) |
6939 then show ?case |
6760 then show ?case |
6940 apply (auto simp add: abs_fresh fresh_atm forget) |
6761 apply (auto simp: abs_fresh fresh_atm forget) |
6941 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)") |
6762 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)") |
6942 apply(erule exE, simp add: fresh_prod) |
6763 apply(erule exE, simp add: fresh_prod) |
6943 apply(erule conjE)+ |
6764 apply(erule conjE)+ |
6944 apply(simp add: fresh_fun_simp_OrR2) |
6765 apply(simp add: fresh_fun_simp_OrR2) |
6945 apply(rule trans) |
6766 apply(rule trans) |
6946 apply(rule better_Cut_substc) |
6767 apply(rule better_Cut_substc) |
6947 apply(simp add: abs_fresh) |
6768 apply(simp add: abs_fresh) |
6948 apply(simp add: abs_fresh) |
6769 apply(simp add: abs_fresh) |
6949 apply(simp) |
6770 apply(simp) |
6950 apply(auto simp add: fresh_atm) |
6771 apply(auto simp: fresh_atm) |
6951 apply(simp add: trm.inject alpha forget) |
6772 apply(simp add: trm.inject alpha forget) |
6952 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6773 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6953 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") |
6774 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") |
6954 apply(erule exE, simp only: fresh_prod) |
6775 apply(erule exE, simp only: fresh_prod) |
6955 apply(erule conjE)+ |
6776 apply(erule conjE)+ |
6968 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6789 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6969 done |
6790 done |
6970 next |
6791 next |
6971 case (OrL x1 M x2 M' x3) |
6792 case (OrL x1 M x2 M' x3) |
6972 then show ?case |
6793 then show ?case |
6973 by(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6794 by(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6974 next |
6795 next |
6975 case ImpL |
6796 case ImpL |
6976 then show ?case |
6797 then show ?case |
6977 by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6798 by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6978 next |
6799 next |
6979 case (ImpR u e M d) |
6800 case (ImpR u e M d) |
6980 then show ?case |
6801 then show ?case |
6981 apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6802 apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) |
6982 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,e,d,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P})") |
6803 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,e,d,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P})") |
6983 apply(erule exE, simp add: fresh_prod) |
6804 apply(erule exE, simp add: fresh_prod) |
6984 apply(erule conjE)+ |
6805 apply(erule conjE)+ |
6985 apply(simp add: fresh_fun_simp_ImpR) |
6806 apply(simp add: fresh_fun_simp_ImpR) |
6986 apply(rule trans) |
6807 apply(rule trans) |
6987 apply(rule better_Cut_substc) |
6808 apply(rule better_Cut_substc) |
6988 apply(simp add: abs_fresh) |
6809 apply(simp add: abs_fresh) |
6989 apply(simp add: abs_fresh) |
6810 apply(simp add: abs_fresh) |
6990 apply(simp) |
6811 apply(simp) |
6991 apply(auto simp add: fresh_atm) |
6812 apply(auto simp: fresh_atm) |
6992 apply(simp add: trm.inject alpha forget) |
6813 apply(simp add: trm.inject alpha forget) |
6993 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6814 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6994 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(e,d,P,Ax y a,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P})") |
6815 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(e,d,P,Ax y a,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P})") |
6995 apply(erule exE, simp only: fresh_prod) |
6816 apply(erule exE, simp only: fresh_prod) |
6996 apply(erule conjE)+ |
6817 apply(erule conjE)+ |
7005 apply(rule trans) |
6826 apply(rule trans) |
7006 apply(rule substc.simps) |
6827 apply(rule substc.simps) |
7007 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6828 apply(simp add: abs_fresh subst_fresh fresh_atm) |
7008 apply(simp add: abs_fresh subst_fresh fresh_atm) |
6829 apply(simp add: abs_fresh subst_fresh fresh_atm) |
7009 apply(simp) |
6830 apply(simp) |
7010 apply(auto simp add: fresh_atm) |
6831 apply(auto simp: fresh_atm) |
7011 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6832 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7012 done |
6833 done |
7013 qed |
6834 qed |
7014 |
6835 |
7015 lemma interesting_subst2': |
6836 lemma interesting_subst2': |
7041 have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp |
6862 have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp |
7042 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" |
6863 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" |
7043 using fs by (simp_all add: fresh_prod fresh_atm) |
6864 using fs by (simp_all add: fresh_prod fresh_atm) |
7044 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using fs by (simp add: forget) |
6865 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using fs by (simp add: forget) |
7045 also have "\<dots> = (Cut <b>.Ax x b (y).Q){x:=<a>.(P{b:=(y).Q})}" |
6866 also have "\<dots> = (Cut <b>.Ax x b (y).Q){x:=<a>.(P{b:=(y).Q})}" |
7046 using fs asm by (auto simp add: fresh_prod fresh_atm subst_fresh) |
6867 using fs asm by (auto simp: fresh_prod fresh_atm subst_fresh) |
7047 also have "\<dots> = (Ax x b){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using fs by simp |
6868 also have "\<dots> = (Ax x b){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using fs by simp |
7048 finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
6869 finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
7049 using asm by simp |
6870 using asm by simp |
7050 } |
6871 } |
7051 moreover |
6872 moreover |
7053 have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}" using asm by simp |
6874 have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}" using asm by simp |
7054 also have "\<dots> = Cut <b>.Ax z c (y).Q" using fs asm by simp |
6875 also have "\<dots> = Cut <b>.Ax z c (y).Q" using fs asm by simp |
7055 also have "\<dots> = Cut <b>.(Ax z c{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" |
6876 also have "\<dots> = Cut <b>.(Ax z c{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" |
7056 using fs asm by (simp add: forget) |
6877 using fs asm by (simp add: forget) |
7057 also have "\<dots> = (Cut <b>.Ax z c (y).Q){x:=<a>.(P{b:=(y).Q})}" using asm fs |
6878 also have "\<dots> = (Cut <b>.Ax z c (y).Q){x:=<a>.(P{b:=(y).Q})}" using asm fs |
7058 by (auto simp add: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh) |
6879 by (auto simp: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh) |
7059 also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm fs by simp |
6880 also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm fs by simp |
7060 finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp |
6881 finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp |
7061 } |
6882 } |
7062 moreover |
6883 moreover |
7063 { assume asm: "z=x \<and> c\<noteq>b" |
6884 { assume asm: "z=x \<and> c\<noteq>b" |
7064 have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax z c){b:=(y).Q}" using fs asm by simp |
6885 have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax z c){b:=(y).Q}" using fs asm by simp |
7065 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp add: trm.inject abs_fresh) |
6886 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp: trm.inject abs_fresh) |
7066 also have "\<dots> = (Ax z c){x:=<a>.(P{b:=(y).Q})}" using fs asm by simp |
6887 also have "\<dots> = (Ax z c){x:=<a>.(P{b:=(y).Q})}" using fs asm by simp |
7067 also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm by auto |
6888 also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm by auto |
7068 finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp |
6889 finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp |
7069 } |
6890 } |
7070 moreover |
6891 moreover |
7076 case (Cut c M z N) |
6897 case (Cut c M z N) |
7077 { assume asm: "M = Ax x c \<and> N = Ax z b" |
6898 { assume asm: "M = Ax x c \<and> N = Ax z b" |
7078 have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (z).(N{x:=<a>.P})){b:=(y).Q}" |
6899 have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (z).(N{x:=<a>.P})){b:=(y).Q}" |
7079 using Cut asm by simp |
6900 using Cut asm by simp |
7080 also have "\<dots> = (Cut <a>.P (z).N){b:=(y).Q}" using Cut asm by (simp add: fresh_atm) |
6901 also have "\<dots> = (Cut <a>.P (z).N){b:=(y).Q}" using Cut asm by (simp add: fresh_atm) |
7081 also have "\<dots> = (Cut <a>.(P{b:=(y).Q}) (y).Q)" using Cut asm by (auto simp add: fresh_prod fresh_atm) |
6902 also have "\<dots> = (Cut <a>.(P{b:=(y).Q}) (y).Q)" using Cut asm by (auto simp: fresh_prod fresh_atm) |
7082 finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.(P{b:=(y).Q}) (y).Q)" by simp |
6903 finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.(P{b:=(y).Q}) (y).Q)" by simp |
7083 have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.M (y).Q){x:=<a>.(P{b:=(y).Q})}" |
6904 have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.M (y).Q){x:=<a>.(P{b:=(y).Q})}" |
7084 using Cut asm by (simp add: fresh_atm) |
6905 using Cut asm by (simp add: fresh_atm) |
7085 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using Cut asm |
6906 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using Cut asm |
7086 by (auto simp add: fresh_prod fresh_atm subst_fresh) |
6907 by (auto simp: fresh_prod fresh_atm subst_fresh) |
7087 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" using Cut asm by (simp add: forget) |
6908 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" using Cut asm by (simp add: forget) |
7088 finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <a>.(P{b:=(y).Q}) (y).Q" |
6909 finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <a>.(P{b:=(y).Q}) (y).Q" |
7089 by simp |
6910 by simp |
7090 have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
6911 have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
7091 using eq1 eq2 by simp |
6912 using eq1 eq2 by simp |
7107 have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <c>.(M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}}) (y).Q" |
6928 have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <c>.(M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}}) (y).Q" |
7108 by simp |
6929 by simp |
7109 have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = |
6930 have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = |
7110 (Cut <c>.(M{b:=(y).Q}) (y).Q){x:=<a>.(P{b:=(y).Q})}" using Cut asm by simp |
6931 (Cut <c>.(M{b:=(y).Q}) (y).Q){x:=<a>.(P{b:=(y).Q})}" using Cut asm by simp |
7111 also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" |
6932 also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" |
7112 using Cut asm neq by (auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh) |
6933 using Cut asm neq by (auto simp: fresh_prod fresh_atm subst_fresh abs_fresh) |
7113 also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" using Cut asm by (simp add: forget) |
6934 also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" using Cut asm by (simp add: forget) |
7114 finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} |
6935 finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} |
7115 = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" by simp |
6936 = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" by simp |
7116 have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
6937 have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
7117 using eq1 eq2 by simp |
6938 using eq1 eq2 by simp |
7133 = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp |
6954 = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp |
7134 have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} |
6955 have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} |
7135 = (Cut <c>.(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" |
6956 = (Cut <c>.(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" |
7136 using Cut asm by auto |
6957 using Cut asm by auto |
7137 also have "\<dots> = (Cut <c>.M (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" |
6958 also have "\<dots> = (Cut <c>.M (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" |
7138 using Cut asm by (auto simp add: fresh_atm) |
6959 using Cut asm by (auto simp: fresh_atm) |
7139 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" |
6960 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" |
7140 using Cut asm by (simp add: fresh_prod fresh_atm subst_fresh) |
6961 using Cut asm by (simp add: fresh_prod fresh_atm subst_fresh) |
7141 finally |
6962 finally |
7142 have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} |
6963 have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} |
7143 = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp |
6964 = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp |
7177 } |
6998 } |
7178 ultimately show ?case by blast |
6999 ultimately show ?case by blast |
7179 next |
7000 next |
7180 case (NotR z M c) |
7001 case (NotR z M c) |
7181 then show ?case |
7002 then show ?case |
7182 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7003 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7183 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(M{c:=(y).Q},M{c:=(y).Q}{x:=<a>.P{c:=(y).Q}},Q,a,P,c,y)") |
7004 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(M{c:=(y).Q},M{c:=(y).Q}{x:=<a>.P{c:=(y).Q}},Q,a,P,c,y)") |
7184 apply(erule exE) |
7005 apply(erule exE) |
7185 apply(simp add: fresh_prod) |
7006 apply(simp add: fresh_prod) |
7186 apply(erule conjE)+ |
7007 apply(erule conjE)+ |
7187 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) |
7008 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) |
7195 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7016 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7196 done |
7017 done |
7197 next |
7018 next |
7198 case (NotL c M z) |
7019 case (NotL c M z) |
7199 then show ?case |
7020 then show ?case |
7200 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7021 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7201 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},y,Q)") |
7022 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},y,Q)") |
7202 apply(erule exE) |
7023 apply(erule exE) |
7203 apply(simp add: fresh_prod) |
7024 apply(simp add: fresh_prod) |
7204 apply(erule conjE)+ |
7025 apply(erule conjE)+ |
7205 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) |
7026 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) |
7206 apply(rule exists_fresh'(1)[OF fs_name1]) |
7027 apply(rule exists_fresh'(1)[OF fs_name1]) |
7207 done |
7028 done |
7208 next |
7029 next |
7209 case (AndR c1 M c2 N c3) |
7030 case (AndR c1 M c2 N c3) |
7210 then show ?case |
7031 then show ?case |
7211 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7032 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7212 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c3:=(y).Q},M{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c2,c3,a, |
7033 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c3:=(y).Q},M{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c2,c3,a, |
7213 P{c3:=(y).Q},N{c3:=(y).Q},N{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c1)") |
7034 P{c3:=(y).Q},N{c3:=(y).Q},N{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c1)") |
7214 apply(erule exE) |
7035 apply(erule exE) |
7215 apply(simp add: fresh_prod) |
7036 apply(simp add: fresh_prod) |
7216 apply(erule conjE)+ |
7037 apply(erule conjE)+ |
7223 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7044 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7224 done |
7045 done |
7225 next |
7046 next |
7226 case (AndL1 z1 M z2) |
7047 case (AndL1 z1 M z2) |
7227 then show ?case |
7048 then show ?case |
7228 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7049 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7229 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})") |
7050 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})") |
7230 apply(erule exE) |
7051 apply(erule exE) |
7231 apply(simp add: fresh_prod) |
7052 apply(simp add: fresh_prod) |
7232 apply(erule conjE)+ |
7053 apply(erule conjE)+ |
7233 apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) |
7054 apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) |
7234 apply(rule exists_fresh'(1)[OF fs_name1]) |
7055 apply(rule exists_fresh'(1)[OF fs_name1]) |
7235 done |
7056 done |
7236 next |
7057 next |
7237 case (AndL2 z1 M z2) |
7058 case (AndL2 z1 M z2) |
7238 then show ?case |
7059 then show ?case |
7239 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7060 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7240 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})") |
7061 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})") |
7241 apply(erule exE) |
7062 apply(erule exE) |
7242 apply(simp add: fresh_prod) |
7063 apply(simp add: fresh_prod) |
7243 apply(erule conjE)+ |
7064 apply(erule conjE)+ |
7244 apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) |
7065 apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) |
7245 apply(rule exists_fresh'(1)[OF fs_name1]) |
7066 apply(rule exists_fresh'(1)[OF fs_name1]) |
7246 done |
7067 done |
7247 next |
7068 next |
7248 case (OrL z1 M z2 N z3) |
7069 case (OrL z1 M z2 N z3) |
7249 then show ?case |
7070 then show ?case |
7250 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7071 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7251 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z2,z3,a,y,Q, |
7072 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z2,z3,a,y,Q, |
7252 P{b:=(y).Q},N{x:=<a>.P},N{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z1)") |
7073 P{b:=(y).Q},N{x:=<a>.P},N{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z1)") |
7253 apply(erule exE) |
7074 apply(erule exE) |
7254 apply(simp add: fresh_prod) |
7075 apply(simp add: fresh_prod) |
7255 apply(erule conjE)+ |
7076 apply(erule conjE)+ |
7261 apply(rule exists_fresh'(1)[OF fs_name1]) |
7082 apply(rule exists_fresh'(1)[OF fs_name1]) |
7262 done |
7083 done |
7263 next |
7084 next |
7264 case (OrR1 c1 M c2) |
7085 case (OrR1 c1 M c2) |
7265 then show ?case |
7086 then show ?case |
7266 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7087 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7267 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, |
7088 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, |
7268 M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})") |
7089 M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})") |
7269 apply(erule exE) |
7090 apply(erule exE) |
7270 apply(simp add: fresh_prod) |
7091 apply(simp add: fresh_prod) |
7271 apply(erule conjE)+ |
7092 apply(erule conjE)+ |
7275 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7096 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7276 done |
7097 done |
7277 next |
7098 next |
7278 case (OrR2 c1 M c2) |
7099 case (OrR2 c1 M c2) |
7279 then show ?case |
7100 then show ?case |
7280 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7101 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7281 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, |
7102 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, |
7282 M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})") |
7103 M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})") |
7283 apply(erule exE) |
7104 apply(erule exE) |
7284 apply(simp add: fresh_prod) |
7105 apply(simp add: fresh_prod) |
7285 apply(erule conjE)+ |
7106 apply(erule conjE)+ |
7289 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7110 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7290 done |
7111 done |
7291 next |
7112 next |
7292 case (ImpR z c M d) |
7113 case (ImpR z c M d) |
7293 then show ?case |
7114 then show ?case |
7294 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7115 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7295 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{d:=(y).Q},a,P{d:=(y).Q},c, |
7116 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{d:=(y).Q},a,P{d:=(y).Q},c, |
7296 M{d:=(y).Q}{x:=<a>.P{d:=(y).Q}})") |
7117 M{d:=(y).Q}{x:=<a>.P{d:=(y).Q}})") |
7297 apply(erule exE) |
7118 apply(erule exE) |
7298 apply(simp add: fresh_prod) |
7119 apply(simp add: fresh_prod) |
7299 apply(erule conjE)+ |
7120 apply(erule conjE)+ |
7302 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7123 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7303 done |
7124 done |
7304 next |
7125 next |
7305 case (ImpL c M z N u) |
7126 case (ImpL c M z N u) |
7306 then show ?case |
7127 then show ?case |
7307 apply(auto simp add: fresh_prod fresh_atm subst_fresh) |
7128 apply(auto simp: fresh_prod fresh_atm subst_fresh) |
7308 apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,P{b:=(y).Q},M{u:=<a>.P},N{u:=<a>.P},y,Q, |
7129 apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,P{b:=(y).Q},M{u:=<a>.P},N{u:=<a>.P},y,Q, |
7309 M{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},N{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},z)") |
7130 M{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},N{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},z)") |
7310 apply(erule exE) |
7131 apply(erule exE) |
7311 apply(simp add: fresh_prod) |
7132 apply(simp add: fresh_prod) |
7312 apply(erule conjE)+ |
7133 apply(erule conjE)+ |
7324 shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}" |
7145 shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}" |
7325 using a |
7146 using a |
7326 proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct) |
7147 proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct) |
7327 case (Ax z c) |
7148 case (Ax z c) |
7328 then show ?case |
7149 then show ?case |
7329 by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7150 by (auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7330 next |
7151 next |
7331 case (Cut d M' u M'') |
7152 case (Cut d M' u M'') |
7332 then show ?case |
7153 then show ?case |
7333 apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) |
7154 apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) |
7334 apply(auto) |
7155 apply(auto) |
7383 apply(simp add: not_Ax2) |
7204 apply(simp add: not_Ax2) |
7384 done |
7205 done |
7385 next |
7206 next |
7386 case (NotR z M' d) |
7207 case (NotR z M' d) |
7387 then show ?case |
7208 then show ?case |
7388 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7209 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7389 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(y,P,N,N{y:=<b>.P},M'{d:=(x).N},M'{y:=<b>.P}{d:=(x).N{y:=<b>.P}})") |
7210 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(y,P,N,N{y:=<b>.P},M'{d:=(x).N},M'{y:=<b>.P}{d:=(x).N{y:=<b>.P}})") |
7390 apply(erule exE, simp add: fresh_prod) |
7211 apply(erule exE, simp add: fresh_prod) |
7391 apply(erule conjE)+ |
7212 apply(erule conjE)+ |
7392 apply(simp add: fresh_fun_simp_NotR) |
7213 apply(simp add: fresh_fun_simp_NotR) |
7393 apply(rule trans) |
7214 apply(rule trans) |
7403 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7224 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7404 done |
7225 done |
7405 next |
7226 next |
7406 case (NotL d M' z) |
7227 case (NotL d M' z) |
7407 then show ?case |
7228 then show ?case |
7408 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7229 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7409 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(z,y,P,N,N{y:=<b>.P},M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7230 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(z,y,P,N,N{y:=<b>.P},M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7410 apply(erule exE, simp add: fresh_prod) |
7231 apply(erule exE, simp add: fresh_prod) |
7411 apply(erule conjE)+ |
7232 apply(erule conjE)+ |
7412 apply(simp add: fresh_fun_simp_NotL) |
7233 apply(simp add: fresh_fun_simp_NotL) |
7413 apply(rule sym) |
7234 apply(rule sym) |
7425 apply(rule exists_fresh'(1)[OF fs_name1]) |
7246 apply(rule exists_fresh'(1)[OF fs_name1]) |
7426 done |
7247 done |
7427 next |
7248 next |
7428 case (AndR d M' e M'' f) |
7249 case (AndR d M' e M'' f) |
7429 then show ?case |
7250 then show ?case |
7430 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7251 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7431 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,b,d,e,N,N{y:=<b>.P},M'{f:=(x).N},M''{f:=(x).N}, |
7252 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,b,d,e,N,N{y:=<b>.P},M'{f:=(x).N},M''{f:=(x).N}, |
7432 M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7253 M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7433 apply(erule exE, simp add: fresh_prod) |
7254 apply(erule exE, simp add: fresh_prod) |
7434 apply(erule conjE)+ |
7255 apply(erule conjE)+ |
7435 apply(simp add: fresh_fun_simp_AndR) |
7256 apply(simp add: fresh_fun_simp_AndR) |
7448 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7269 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7449 done |
7270 done |
7450 next |
7271 next |
7451 case (AndL1 z M' u) |
7272 case (AndL1 z M' u) |
7452 then show ?case |
7273 then show ?case |
7453 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7274 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7454 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7275 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7455 apply(erule exE, simp add: fresh_prod) |
7276 apply(erule exE, simp add: fresh_prod) |
7456 apply(erule conjE)+ |
7277 apply(erule conjE)+ |
7457 apply(simp add: fresh_fun_simp_AndL1) |
7278 apply(simp add: fresh_fun_simp_AndL1) |
7458 apply(rule sym) |
7279 apply(rule sym) |
7469 apply(rule exists_fresh'(1)[OF fs_name1]) |
7290 apply(rule exists_fresh'(1)[OF fs_name1]) |
7470 done |
7291 done |
7471 next |
7292 next |
7472 case (AndL2 z M' u) |
7293 case (AndL2 z M' u) |
7473 then show ?case |
7294 then show ?case |
7474 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7295 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7475 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7296 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7476 apply(erule exE, simp add: fresh_prod) |
7297 apply(erule exE, simp add: fresh_prod) |
7477 apply(erule conjE)+ |
7298 apply(erule conjE)+ |
7478 apply(simp add: fresh_fun_simp_AndL2) |
7299 apply(simp add: fresh_fun_simp_AndL2) |
7479 apply(rule sym) |
7300 apply(rule sym) |
7490 apply(rule exists_fresh'(1)[OF fs_name1]) |
7311 apply(rule exists_fresh'(1)[OF fs_name1]) |
7491 done |
7312 done |
7492 next |
7313 next |
7493 case (OrL u M' v M'' w) |
7314 case (OrL u M' v M'' w) |
7494 then show ?case |
7315 then show ?case |
7495 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7316 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7496 apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,u,w,v,N,N{y:=<b>.P},M'{y:=<b>.P},M''{y:=<b>.P}, |
7317 apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,u,w,v,N,N{y:=<b>.P},M'{y:=<b>.P},M''{y:=<b>.P}, |
7497 M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7318 M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") |
7498 apply(erule exE, simp add: fresh_prod) |
7319 apply(erule exE, simp add: fresh_prod) |
7499 apply(erule conjE)+ |
7320 apply(erule conjE)+ |
7500 apply(simp add: fresh_fun_simp_OrL) |
7321 apply(simp add: fresh_fun_simp_OrL) |
7514 apply(rule exists_fresh'(1)[OF fs_name1]) |
7335 apply(rule exists_fresh'(1)[OF fs_name1]) |
7515 done |
7336 done |
7516 next |
7337 next |
7517 case (OrR1 e M' f) |
7338 case (OrR1 e M' f) |
7518 then show ?case |
7339 then show ?case |
7519 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7340 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7520 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, |
7341 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, |
7521 M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7342 M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7522 apply(erule exE, simp add: fresh_prod) |
7343 apply(erule exE, simp add: fresh_prod) |
7523 apply(erule conjE)+ |
7344 apply(erule conjE)+ |
7524 apply(simp add: fresh_fun_simp_OrR1) |
7345 apply(simp add: fresh_fun_simp_OrR1) |
7535 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7356 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7536 done |
7357 done |
7537 next |
7358 next |
7538 case (OrR2 e M' f) |
7359 case (OrR2 e M' f) |
7539 then show ?case |
7360 then show ?case |
7540 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7361 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7541 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, |
7362 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, |
7542 M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7363 M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7543 apply(erule exE, simp add: fresh_prod) |
7364 apply(erule exE, simp add: fresh_prod) |
7544 apply(erule conjE)+ |
7365 apply(erule conjE)+ |
7545 apply(simp add: fresh_fun_simp_OrR2) |
7366 apply(simp add: fresh_fun_simp_OrR2) |
7556 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7377 apply(rule exists_fresh'(2)[OF fs_coname1]) |
7557 done |
7378 done |
7558 next |
7379 next |
7559 case (ImpR x e M' f) |
7380 case (ImpR x e M' f) |
7560 then show ?case |
7381 then show ?case |
7561 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7382 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7562 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, |
7383 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, |
7563 M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7384 M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})") |
7564 apply(erule exE, simp add: fresh_prod) |
7385 apply(erule exE, simp add: fresh_prod) |
7565 apply(erule conjE)+ |
7386 apply(erule conjE)+ |
7566 apply(simp add: fresh_fun_simp_ImpR) |
7387 apply(simp add: fresh_fun_simp_ImpR) |
7579 apply(simp add: fresh_atm trm.inject alpha abs_fresh fin_supp abs_supp) |
7400 apply(simp add: fresh_atm trm.inject alpha abs_fresh fin_supp abs_supp) |
7580 done |
7401 done |
7581 next |
7402 next |
7582 case (ImpL e M' v M'' w) |
7403 case (ImpL e M' v M'' w) |
7583 then show ?case |
7404 then show ?case |
7584 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7405 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7585 apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,e,w,v,N,N{y:=<b>.P},M'{w:=<b>.P},M''{w:=<b>.P}, |
7406 apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,e,w,v,N,N{y:=<b>.P},M'{w:=<b>.P},M''{w:=<b>.P}, |
7586 M'{w:=<b>.P}{a:=(x).N{w:=<b>.P}},M''{w:=<b>.P}{a:=(x).N{w:=<b>.P}})") |
7407 M'{w:=<b>.P}{a:=(x).N{w:=<b>.P}},M''{w:=<b>.P}{a:=(x).N{w:=<b>.P}})") |
7587 apply(erule exE, simp add: fresh_prod) |
7408 apply(erule exE, simp add: fresh_prod) |
7588 apply(erule conjE)+ |
7409 apply(erule conjE)+ |
7589 apply(simp add: fresh_fun_simp_ImpL) |
7410 apply(simp add: fresh_fun_simp_ImpL) |
7608 shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}" |
7429 shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}" |
7609 using a |
7430 using a |
7610 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) |
7431 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) |
7611 case (Ax z c) |
7432 case (Ax z c) |
7612 then show ?case |
7433 then show ?case |
7613 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7434 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7614 next |
7435 next |
7615 case (Cut d M' u M'') |
7436 case (Cut d M' u M'') |
7616 then show ?case |
7437 then show ?case |
7617 apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) |
7438 apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) |
7618 apply(auto) |
7439 apply(auto) |
7648 apply(simp add: not_Ax2) |
7469 apply(simp add: not_Ax2) |
7649 done |
7470 done |
7650 next |
7471 next |
7651 case NotR |
7472 case NotR |
7652 then show ?case |
7473 then show ?case |
7653 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7474 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7654 next |
7475 next |
7655 case (NotL d M' u) |
7476 case (NotL d M' u) |
7656 then show ?case |
7477 then show ?case |
7657 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7478 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7658 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7479 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7659 apply(erule exE, simp add: fresh_prod) |
7480 apply(erule exE, simp add: fresh_prod) |
7660 apply(erule conjE)+ |
7481 apply(erule conjE)+ |
7661 apply(simp add: fresh_fun_simp_NotL) |
7482 apply(simp add: fresh_fun_simp_NotL) |
7662 apply(rule trans) |
7483 apply(rule trans) |
7691 apply(rule exists_fresh'(1)[OF fs_name1]) |
7512 apply(rule exists_fresh'(1)[OF fs_name1]) |
7692 done |
7513 done |
7693 next |
7514 next |
7694 case AndR |
7515 case AndR |
7695 then show ?case |
7516 then show ?case |
7696 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7517 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7697 next |
7518 next |
7698 case (AndL1 u M' v) |
7519 case (AndL1 u M' v) |
7699 then show ?case |
7520 then show ?case |
7700 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7521 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7701 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7522 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7702 apply(erule exE, simp add: fresh_prod) |
7523 apply(erule exE, simp add: fresh_prod) |
7703 apply(erule conjE)+ |
7524 apply(erule conjE)+ |
7704 apply(simp add: fresh_fun_simp_AndL1) |
7525 apply(simp add: fresh_fun_simp_AndL1) |
7705 apply(rule trans) |
7526 apply(rule trans) |
7734 apply(rule exists_fresh'(1)[OF fs_name1]) |
7555 apply(rule exists_fresh'(1)[OF fs_name1]) |
7735 done |
7556 done |
7736 next |
7557 next |
7737 case (AndL2 u M' v) |
7558 case (AndL2 u M' v) |
7738 then show ?case |
7559 then show ?case |
7739 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7560 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7740 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7561 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7741 apply(erule exE, simp add: fresh_prod) |
7562 apply(erule exE, simp add: fresh_prod) |
7742 apply(erule conjE)+ |
7563 apply(erule conjE)+ |
7743 apply(simp add: fresh_fun_simp_AndL2) |
7564 apply(simp add: fresh_fun_simp_AndL2) |
7744 apply(rule trans) |
7565 apply(rule trans) |
7773 apply(rule exists_fresh'(1)[OF fs_name1]) |
7594 apply(rule exists_fresh'(1)[OF fs_name1]) |
7774 done |
7595 done |
7775 next |
7596 next |
7776 case OrR1 |
7597 case OrR1 |
7777 then show ?case |
7598 then show ?case |
7778 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7599 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7779 next |
7600 next |
7780 case OrR2 |
7601 case OrR2 |
7781 then show ?case |
7602 then show ?case |
7782 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7603 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7783 next |
7604 next |
7784 case (OrL x1 M' x2 M'' x3) |
7605 case (OrL x1 M' x2 M'' x3) |
7785 then show ?case |
7606 then show ?case |
7786 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7607 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7787 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}}, |
7608 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}}, |
7788 x1,x2,x3,M''{x:=<a>.M},M''{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7609 x1,x2,x3,M''{x:=<a>.M},M''{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") |
7789 apply(erule exE, simp add: fresh_prod) |
7610 apply(erule exE, simp add: fresh_prod) |
7790 apply(erule conjE)+ |
7611 apply(erule conjE)+ |
7791 apply(simp add: fresh_fun_simp_OrL) |
7612 apply(simp add: fresh_fun_simp_OrL) |
7825 apply(rule exists_fresh'(1)[OF fs_name1]) |
7646 apply(rule exists_fresh'(1)[OF fs_name1]) |
7826 done |
7647 done |
7827 next |
7648 next |
7828 case ImpR |
7649 case ImpR |
7829 then show ?case |
7650 then show ?case |
7830 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7651 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7831 next |
7652 next |
7832 case (ImpL d M' x1 M'' x2) |
7653 case (ImpL d M' x1 M'' x2) |
7833 then show ?case |
7654 then show ?case |
7834 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7655 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7835 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x2:=<a>.M},M'{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}}, |
7656 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x2:=<a>.M},M'{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}}, |
7836 x1,x2,M''{x2:=<a>.M},M''{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}})") |
7657 x1,x2,M''{x2:=<a>.M},M''{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}})") |
7837 apply(erule exE, simp add: fresh_prod) |
7658 apply(erule exE, simp add: fresh_prod) |
7838 apply(erule conjE)+ |
7659 apply(erule conjE)+ |
7839 apply(simp add: fresh_fun_simp_ImpL) |
7660 apply(simp add: fresh_fun_simp_ImpL) |
7877 shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}" |
7698 shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}" |
7878 using a |
7699 using a |
7879 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) |
7700 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) |
7880 case (Ax z c) |
7701 case (Ax z c) |
7881 then show ?case |
7702 then show ?case |
7882 by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7703 by (auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7883 next |
7704 next |
7884 case (Cut d M' u M'') |
7705 case (Cut d M' u M'') |
7885 then show ?case |
7706 then show ?case |
7886 apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) |
7707 apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) |
7887 apply(auto) |
7708 apply(auto) |
7917 apply(simp add: not_Ax1) |
7738 apply(simp add: not_Ax1) |
7918 done |
7739 done |
7919 next |
7740 next |
7920 case NotL |
7741 case NotL |
7921 then show ?case |
7742 then show ?case |
7922 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7743 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7923 next |
7744 next |
7924 case (NotR u M' d) |
7745 case (NotR u M' d) |
7925 then show ?case |
7746 then show ?case |
7926 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7747 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7927 apply(generate_fresh "coname") |
7748 apply(generate_fresh "coname") |
7928 apply(fresh_fun_simp) |
7749 apply(fresh_fun_simp) |
7929 apply(fresh_fun_simp) |
7750 apply(fresh_fun_simp) |
7930 apply(simp add: abs_fresh subst_fresh) |
7751 apply(simp add: abs_fresh subst_fresh) |
7931 apply(rule trans) |
7752 apply(rule trans) |
7935 apply(simp) |
7756 apply(simp) |
7936 apply(simp add: trm.inject alpha) |
7757 apply(simp add: trm.inject alpha) |
7937 apply(rule trans) |
7758 apply(rule trans) |
7938 apply(rule substc.simps) |
7759 apply(rule substc.simps) |
7939 apply(simp add: fresh_prod fresh_atm) |
7760 apply(simp add: fresh_prod fresh_atm) |
7940 apply(auto simp add: fresh_atm fresh_prod)[1] |
7761 apply(auto simp: fresh_atm fresh_prod)[1] |
7941 apply(generate_fresh "coname") |
7762 apply(generate_fresh "coname") |
7942 apply(fresh_fun_simp) |
7763 apply(fresh_fun_simp) |
7943 apply(fresh_fun_simp) |
7764 apply(fresh_fun_simp) |
7944 apply(rule sym) |
7765 apply(rule sym) |
7945 apply(rule trans) |
7766 apply(rule trans) |
7946 apply(rule better_Cut_substc) |
7767 apply(rule better_Cut_substc) |
7947 apply(simp add: fresh_prod fresh_atm subst_fresh) |
7768 apply(simp add: fresh_prod fresh_atm subst_fresh) |
7948 apply(simp add: abs_fresh subst_fresh) |
7769 apply(simp add: abs_fresh subst_fresh) |
7949 apply(auto simp add: fresh_atm) |
7770 apply(auto simp: fresh_atm) |
7950 apply(simp add: trm.inject alpha forget) |
7771 apply(simp add: trm.inject alpha forget) |
7951 apply(rule trans) |
7772 apply(rule trans) |
7952 apply(rule substc.simps) |
7773 apply(rule substc.simps) |
7953 apply(simp add: fresh_atm subst_fresh) |
7774 apply(simp add: fresh_atm subst_fresh) |
7954 apply(auto simp add: fresh_prod fresh_atm) |
7775 apply(auto simp: fresh_prod fresh_atm) |
7955 done |
7776 done |
7956 next |
7777 next |
7957 case AndL1 |
7778 case AndL1 |
7958 then show ?case |
7779 then show ?case |
7959 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7780 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7960 next |
7781 next |
7961 case AndL2 |
7782 case AndL2 |
7962 then show ?case |
7783 then show ?case |
7963 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7784 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7964 next |
7785 next |
7965 case (AndR d M e M' f) |
7786 case (AndR d M e M' f) |
7966 then show ?case |
7787 then show ?case |
7967 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7788 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7968 apply(generate_fresh "coname") |
7789 apply(generate_fresh "coname") |
7969 apply(fresh_fun_simp) |
7790 apply(fresh_fun_simp) |
7970 apply(fresh_fun_simp) |
7791 apply(fresh_fun_simp) |
7971 apply(simp add: abs_fresh subst_fresh) |
7792 apply(simp add: abs_fresh subst_fresh) |
7972 apply(rule trans) |
7793 apply(rule trans) |
7975 apply(simp add: abs_fresh) |
7796 apply(simp add: abs_fresh) |
7976 apply(simp) |
7797 apply(simp) |
7977 apply(simp add: trm.inject alpha) |
7798 apply(simp add: trm.inject alpha) |
7978 apply(rule trans) |
7799 apply(rule trans) |
7979 apply(rule substc.simps) |
7800 apply(rule substc.simps) |
7980 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7801 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
7981 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7802 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
7982 apply(simp) |
7803 apply(simp) |
7983 apply(auto simp add: fresh_atm fresh_prod)[1] |
7804 apply(auto simp: fresh_atm fresh_prod)[1] |
7984 apply(generate_fresh "coname") |
7805 apply(generate_fresh "coname") |
7985 apply(fresh_fun_simp) |
7806 apply(fresh_fun_simp) |
7986 apply(fresh_fun_simp) |
7807 apply(fresh_fun_simp) |
7987 apply(rule sym) |
7808 apply(rule sym) |
7988 apply(rule trans) |
7809 apply(rule trans) |
7989 apply(rule better_Cut_substc) |
7810 apply(rule better_Cut_substc) |
7990 apply(simp add: subst_fresh fresh_atm fresh_prod) |
7811 apply(simp add: subst_fresh fresh_atm fresh_prod) |
7991 apply(simp add: abs_fresh subst_fresh) |
7812 apply(simp add: abs_fresh subst_fresh) |
7992 apply(auto simp add: fresh_atm)[1] |
7813 apply(auto simp: fresh_atm)[1] |
7993 apply(simp add: trm.inject alpha forget) |
7814 apply(simp add: trm.inject alpha forget) |
7994 apply(rule trans) |
7815 apply(rule trans) |
7995 apply(rule substc.simps) |
7816 apply(rule substc.simps) |
7996 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7817 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
7997 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7818 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
7998 apply(simp) |
7819 apply(simp) |
7999 apply(auto simp add: fresh_atm fresh_prod)[1] |
7820 apply(auto simp: fresh_atm fresh_prod)[1] |
8000 done |
7821 done |
8001 next |
7822 next |
8002 case OrL |
7823 case OrL |
8003 then show ?case |
7824 then show ?case |
8004 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7825 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
8005 next |
7826 next |
8006 case (OrR1 d M' e) |
7827 case (OrR1 d M' e) |
8007 then show ?case |
7828 then show ?case |
8008 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7829 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
8009 apply(generate_fresh "coname") |
7830 apply(generate_fresh "coname") |
8010 apply(fresh_fun_simp) |
7831 apply(fresh_fun_simp) |
8011 apply(fresh_fun_simp) |
7832 apply(fresh_fun_simp) |
8012 apply(simp add: abs_fresh subst_fresh) |
7833 apply(simp add: abs_fresh subst_fresh) |
8013 apply(rule trans) |
7834 apply(rule trans) |
8016 apply(simp add: abs_fresh) |
7837 apply(simp add: abs_fresh) |
8017 apply(simp) |
7838 apply(simp) |
8018 apply(simp add: trm.inject alpha) |
7839 apply(simp add: trm.inject alpha) |
8019 apply(rule trans) |
7840 apply(rule trans) |
8020 apply(rule substc.simps) |
7841 apply(rule substc.simps) |
8021 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7842 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8022 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7843 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8023 apply(generate_fresh "coname") |
7844 apply(generate_fresh "coname") |
8024 apply(fresh_fun_simp) |
7845 apply(fresh_fun_simp) |
8025 apply(fresh_fun_simp) |
7846 apply(fresh_fun_simp) |
8026 apply(rule sym) |
7847 apply(rule sym) |
8027 apply(rule trans) |
7848 apply(rule trans) |
8028 apply(rule better_Cut_substc) |
7849 apply(rule better_Cut_substc) |
8029 apply(simp add: subst_fresh fresh_atm fresh_prod) |
7850 apply(simp add: subst_fresh fresh_atm fresh_prod) |
8030 apply(simp add: abs_fresh subst_fresh) |
7851 apply(simp add: abs_fresh subst_fresh) |
8031 apply(auto simp add: fresh_atm)[1] |
7852 apply(auto simp: fresh_atm)[1] |
8032 apply(simp add: trm.inject alpha forget) |
7853 apply(simp add: trm.inject alpha forget) |
8033 apply(rule trans) |
7854 apply(rule trans) |
8034 apply(rule substc.simps) |
7855 apply(rule substc.simps) |
8035 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7856 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8036 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7857 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8037 done |
7858 done |
8038 next |
7859 next |
8039 case (OrR2 d M' e) |
7860 case (OrR2 d M' e) |
8040 then show ?case |
7861 then show ?case |
8041 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7862 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
8042 apply(generate_fresh "coname") |
7863 apply(generate_fresh "coname") |
8043 apply(fresh_fun_simp) |
7864 apply(fresh_fun_simp) |
8044 apply(fresh_fun_simp) |
7865 apply(fresh_fun_simp) |
8045 apply(simp add: abs_fresh subst_fresh) |
7866 apply(simp add: abs_fresh subst_fresh) |
8046 apply(rule trans) |
7867 apply(rule trans) |
8049 apply(simp add: abs_fresh) |
7870 apply(simp add: abs_fresh) |
8050 apply(simp) |
7871 apply(simp) |
8051 apply(simp add: trm.inject alpha) |
7872 apply(simp add: trm.inject alpha) |
8052 apply(rule trans) |
7873 apply(rule trans) |
8053 apply(rule substc.simps) |
7874 apply(rule substc.simps) |
8054 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7875 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8055 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7876 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8056 apply(generate_fresh "coname") |
7877 apply(generate_fresh "coname") |
8057 apply(fresh_fun_simp) |
7878 apply(fresh_fun_simp) |
8058 apply(fresh_fun_simp) |
7879 apply(fresh_fun_simp) |
8059 apply(rule sym) |
7880 apply(rule sym) |
8060 apply(rule trans) |
7881 apply(rule trans) |
8061 apply(rule better_Cut_substc) |
7882 apply(rule better_Cut_substc) |
8062 apply(simp add: subst_fresh fresh_atm fresh_prod) |
7883 apply(simp add: subst_fresh fresh_atm fresh_prod) |
8063 apply(simp add: abs_fresh subst_fresh) |
7884 apply(simp add: abs_fresh subst_fresh) |
8064 apply(auto simp add: fresh_atm)[1] |
7885 apply(auto simp: fresh_atm)[1] |
8065 apply(simp add: trm.inject alpha forget) |
7886 apply(simp add: trm.inject alpha forget) |
8066 apply(rule trans) |
7887 apply(rule trans) |
8067 apply(rule substc.simps) |
7888 apply(rule substc.simps) |
8068 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7889 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8069 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7890 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8070 done |
7891 done |
8071 next |
7892 next |
8072 case ImpL |
7893 case ImpL |
8073 then show ?case |
7894 then show ?case |
8074 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7895 by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
8075 next |
7896 next |
8076 case (ImpR u d M' e) |
7897 case (ImpR u d M' e) |
8077 then show ?case |
7898 then show ?case |
8078 apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7899 apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
8079 apply(generate_fresh "coname") |
7900 apply(generate_fresh "coname") |
8080 apply(fresh_fun_simp) |
7901 apply(fresh_fun_simp) |
8081 apply(fresh_fun_simp) |
7902 apply(fresh_fun_simp) |
8082 apply(simp add: abs_fresh subst_fresh) |
7903 apply(simp add: abs_fresh subst_fresh) |
8083 apply(rule trans) |
7904 apply(rule trans) |
8086 apply(simp add: abs_fresh) |
7907 apply(simp add: abs_fresh) |
8087 apply(simp) |
7908 apply(simp) |
8088 apply(simp add: trm.inject alpha) |
7909 apply(simp add: trm.inject alpha) |
8089 apply(rule trans) |
7910 apply(rule trans) |
8090 apply(rule substc.simps) |
7911 apply(rule substc.simps) |
8091 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7912 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8092 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7913 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8093 apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] |
7914 apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] |
8094 apply(generate_fresh "coname") |
7915 apply(generate_fresh "coname") |
8095 apply(fresh_fun_simp) |
7916 apply(fresh_fun_simp) |
8096 apply(fresh_fun_simp) |
7917 apply(fresh_fun_simp) |
8097 apply(rule sym) |
7918 apply(rule sym) |
8098 apply(rule trans) |
7919 apply(rule trans) |
8099 apply(rule better_Cut_substc) |
7920 apply(rule better_Cut_substc) |
8100 apply(simp add: subst_fresh fresh_atm fresh_prod) |
7921 apply(simp add: subst_fresh fresh_atm fresh_prod) |
8101 apply(simp add: abs_fresh subst_fresh) |
7922 apply(simp add: abs_fresh subst_fresh) |
8102 apply(auto simp add: fresh_atm)[1] |
7923 apply(auto simp: fresh_atm)[1] |
8103 apply(simp add: trm.inject alpha forget) |
7924 apply(simp add: trm.inject alpha forget) |
8104 apply(rule trans) |
7925 apply(rule trans) |
8105 apply(rule substc.simps) |
7926 apply(rule substc.simps) |
8106 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7927 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8107 apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] |
7928 apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] |
8108 apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] |
7929 apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] |
8109 apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] |
7930 apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] |
8110 done |
7931 done |
8111 qed |
7932 qed |
8112 |
7933 |
8113 end |
7934 end |