changeset 26966 | 071f40487734 |
parent 26932 | c398a3866082 |
child 27117 | 97e9dae57284 |
26965:003b5781b845 | 26966:071f40487734 |
---|---|
28 by (rule TrueI)+ |
28 by (rule TrueI)+ |
29 |
29 |
30 lemma ty_cases: |
30 lemma ty_cases: |
31 fixes T::ty |
31 fixes T::ty |
32 shows "(\<exists>s. T=PR s) \<or> (\<exists>T'. T=NOT T') \<or> (\<exists>S U. T=S OR U) \<or> (\<exists>S U. T=S AND U) \<or> (\<exists>S U. T=S IMP U)" |
32 shows "(\<exists>s. T=PR s) \<or> (\<exists>T'. T=NOT T') \<or> (\<exists>S U. T=S OR U) \<or> (\<exists>S U. T=S AND U) \<or> (\<exists>S U. T=S IMP U)" |
33 by (induct T rule:ty.weak_induct) (auto) |
33 by (induct T rule:ty.induct) (auto) |
34 |
34 |
35 lemma fresh_ty: |
35 lemma fresh_ty: |
36 fixes a::"coname" |
36 fixes a::"coname" |
37 and x::"name" |
37 and x::"name" |
38 and T::"ty" |
38 and T::"ty" |
39 shows "a\<sharp>T" and "x\<sharp>T" |
39 shows "a\<sharp>T" and "x\<sharp>T" |
40 by (nominal_induct T rule: ty.induct) |
40 by (nominal_induct T rule: ty.strong_induct) |
41 (auto simp add: fresh_string) |
41 (auto simp add: fresh_string) |
42 |
42 |
43 text {* terms *} |
43 text {* terms *} |
44 |
44 |
45 nominal_datatype trm = |
45 nominal_datatype trm = |
115 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst] |
115 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst] |
116 |
116 |
117 lemma crename_name_eqvt[eqvt]: |
117 lemma crename_name_eqvt[eqvt]: |
118 fixes pi::"name prm" |
118 fixes pi::"name prm" |
119 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
119 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
120 apply(nominal_induct M avoiding: d e rule: trm.induct) |
120 apply(nominal_induct M avoiding: d e rule: trm.strong_induct) |
121 apply(auto simp add: fresh_bij eq_bij) |
121 apply(auto simp add: fresh_bij eq_bij) |
122 done |
122 done |
123 |
123 |
124 lemma crename_coname_eqvt[eqvt]: |
124 lemma crename_coname_eqvt[eqvt]: |
125 fixes pi::"coname prm" |
125 fixes pi::"coname prm" |
126 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
126 shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]" |
127 apply(nominal_induct M avoiding: d e rule: trm.induct) |
127 apply(nominal_induct M avoiding: d e rule: trm.strong_induct) |
128 apply(auto simp add: fresh_bij eq_bij) |
128 apply(auto simp add: fresh_bij eq_bij) |
129 done |
129 done |
130 |
130 |
131 lemma nrename_name_eqvt[eqvt]: |
131 lemma nrename_name_eqvt[eqvt]: |
132 fixes pi::"name prm" |
132 fixes pi::"name prm" |
133 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
133 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
134 apply(nominal_induct M avoiding: x y rule: trm.induct) |
134 apply(nominal_induct M avoiding: x y rule: trm.strong_induct) |
135 apply(auto simp add: fresh_bij eq_bij) |
135 apply(auto simp add: fresh_bij eq_bij) |
136 done |
136 done |
137 |
137 |
138 lemma nrename_coname_eqvt[eqvt]: |
138 lemma nrename_coname_eqvt[eqvt]: |
139 fixes pi::"coname prm" |
139 fixes pi::"coname prm" |
140 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
140 shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]" |
141 apply(nominal_induct M avoiding: x y rule: trm.induct) |
141 apply(nominal_induct M avoiding: x y rule: trm.strong_induct) |
142 apply(auto simp add: fresh_bij eq_bij) |
142 apply(auto simp add: fresh_bij eq_bij) |
143 done |
143 done |
144 |
144 |
145 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt |
145 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt |
146 nrename_name_eqvt nrename_coname_eqvt |
146 nrename_name_eqvt nrename_coname_eqvt |
147 lemma nrename_fresh: |
147 lemma nrename_fresh: |
148 assumes a: "x\<sharp>M" |
148 assumes a: "x\<sharp>M" |
149 shows "M[x\<turnstile>n>y] = M" |
149 shows "M[x\<turnstile>n>y] = M" |
150 using a |
150 using a |
151 by (nominal_induct M avoiding: x y rule: trm.induct) |
151 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
152 (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp) |
152 (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp) |
153 |
153 |
154 lemma crename_fresh: |
154 lemma crename_fresh: |
155 assumes a: "a\<sharp>M" |
155 assumes a: "a\<sharp>M" |
156 shows "M[a\<turnstile>c>b] = M" |
156 shows "M[a\<turnstile>c>b] = M" |
157 using a |
157 using a |
158 by (nominal_induct M avoiding: a b rule: trm.induct) |
158 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
159 (auto simp add: trm.inject fresh_atm abs_fresh) |
159 (auto simp add: trm.inject fresh_atm abs_fresh) |
160 |
160 |
161 lemma nrename_nfresh: |
161 lemma nrename_nfresh: |
162 fixes x::"name" |
162 fixes x::"name" |
163 shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]" |
163 shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]" |
164 by (nominal_induct M avoiding: x y rule: trm.induct) |
164 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
165 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
165 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
166 |
166 |
167 lemma crename_nfresh: |
167 lemma crename_nfresh: |
168 fixes x::"name" |
168 fixes x::"name" |
169 shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]" |
169 shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]" |
170 by (nominal_induct M avoiding: a b rule: trm.induct) |
170 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
171 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
171 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
172 |
172 |
173 lemma crename_cfresh: |
173 lemma crename_cfresh: |
174 fixes a::"coname" |
174 fixes a::"coname" |
175 shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]" |
175 shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]" |
176 by (nominal_induct M avoiding: a b rule: trm.induct) |
176 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
177 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
177 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
178 |
178 |
179 lemma nrename_cfresh: |
179 lemma nrename_cfresh: |
180 fixes c::"coname" |
180 fixes c::"coname" |
181 shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]" |
181 shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]" |
182 by (nominal_induct M avoiding: x y rule: trm.induct) |
182 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
183 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
183 (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
184 |
184 |
185 lemma nrename_nfresh': |
185 lemma nrename_nfresh': |
186 fixes x::"name" |
186 fixes x::"name" |
187 shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]" |
187 shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]" |
188 by (nominal_induct M avoiding: x z y rule: trm.induct) |
188 by (nominal_induct M avoiding: x z y rule: trm.strong_induct) |
189 (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
189 (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
190 |
190 |
191 lemma crename_cfresh': |
191 lemma crename_cfresh': |
192 fixes a::"coname" |
192 fixes a::"coname" |
193 shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]" |
193 shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]" |
194 by (nominal_induct M avoiding: a b c rule: trm.induct) |
194 by (nominal_induct M avoiding: a b c rule: trm.strong_induct) |
195 (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
195 (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) |
196 |
196 |
197 lemma nrename_rename: |
197 lemma nrename_rename: |
198 assumes a: "x'\<sharp>M" |
198 assumes a: "x'\<sharp>M" |
199 shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]" |
199 shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]" |
200 using a |
200 using a |
201 apply(nominal_induct M avoiding: x x' y rule: trm.induct) |
201 apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct) |
202 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
202 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
203 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) |
203 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) |
204 done |
204 done |
205 |
205 |
206 lemma crename_rename: |
206 lemma crename_rename: |
207 assumes a: "a'\<sharp>M" |
207 assumes a: "a'\<sharp>M" |
208 shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]" |
208 shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]" |
209 using a |
209 using a |
210 apply(nominal_induct M avoiding: a a' b rule: trm.induct) |
210 apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct) |
211 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
211 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) |
212 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) |
212 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) |
213 done |
213 done |
214 |
214 |
215 lemmas rename_fresh = nrename_fresh crename_fresh |
215 lemmas rename_fresh = nrename_fresh crename_fresh |
269 by simp |
269 by simp |
270 qed |
270 qed |
271 |
271 |
272 lemma crename_id: |
272 lemma crename_id: |
273 shows "M[a\<turnstile>c>a] = M" |
273 shows "M[a\<turnstile>c>a] = M" |
274 by (nominal_induct M avoiding: a rule: trm.induct) (auto) |
274 by (nominal_induct M avoiding: a rule: trm.strong_induct) (auto) |
275 |
275 |
276 lemma nrename_id: |
276 lemma nrename_id: |
277 shows "M[x\<turnstile>n>x] = M" |
277 shows "M[x\<turnstile>n>x] = M" |
278 by (nominal_induct M avoiding: x rule: trm.induct) (auto) |
278 by (nominal_induct M avoiding: x rule: trm.strong_induct) (auto) |
279 |
279 |
280 lemma nrename_swap: |
280 lemma nrename_swap: |
281 shows "x\<sharp>M \<Longrightarrow> [(x,y)]\<bullet>M = M[y\<turnstile>n>x]" |
281 shows "x\<sharp>M \<Longrightarrow> [(x,y)]\<bullet>M = M[y\<turnstile>n>x]" |
282 by (nominal_induct M avoiding: x y rule: trm.induct) |
282 by (nominal_induct M avoiding: x y rule: trm.strong_induct) |
283 (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp) |
283 (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp) |
284 |
284 |
285 lemma crename_swap: |
285 lemma crename_swap: |
286 shows "a\<sharp>M \<Longrightarrow> [(a,b)]\<bullet>M = M[b\<turnstile>c>a]" |
286 shows "a\<sharp>M \<Longrightarrow> [(a,b)]\<bullet>M = M[b\<turnstile>c>a]" |
287 by (nominal_induct M avoiding: a b rule: trm.induct) |
287 by (nominal_induct M avoiding: a b rule: trm.strong_induct) |
288 (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp) |
288 (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp) |
289 |
289 |
290 lemma crename_ax: |
290 lemma crename_ax: |
291 assumes a: "M[a\<turnstile>c>b] = Ax x c" "c\<noteq>a" "c\<noteq>b" |
291 assumes a: "M[a\<turnstile>c>b] = Ax x c" "c\<noteq>a" "c\<noteq>b" |
292 shows "M = Ax x c" |
292 shows "M = Ax x c" |
293 using a |
293 using a |
294 apply(nominal_induct M avoiding: a b x c rule: trm.induct) |
294 apply(nominal_induct M avoiding: a b x c rule: trm.strong_induct) |
295 apply(simp_all add: trm.inject split: if_splits) |
295 apply(simp_all add: trm.inject split: if_splits) |
296 done |
296 done |
297 |
297 |
298 lemma nrename_ax: |
298 lemma nrename_ax: |
299 assumes a: "M[x\<turnstile>n>y] = Ax z a" "z\<noteq>x" "z\<noteq>y" |
299 assumes a: "M[x\<turnstile>n>y] = Ax z a" "z\<noteq>x" "z\<noteq>y" |
300 shows "M = Ax z a" |
300 shows "M = Ax z a" |
301 using a |
301 using a |
302 apply(nominal_induct M avoiding: x y z a rule: trm.induct) |
302 apply(nominal_induct M avoiding: x y z a rule: trm.strong_induct) |
303 apply(simp_all add: trm.inject split: if_splits) |
303 apply(simp_all add: trm.inject split: if_splits) |
304 done |
304 done |
305 |
305 |
306 text {* substitution functions *} |
306 text {* substitution functions *} |
307 |
307 |
915 lemma csubst_eqvt[eqvt]: |
915 lemma csubst_eqvt[eqvt]: |
916 fixes pi1::"name prm" |
916 fixes pi1::"name prm" |
917 and pi2::"coname prm" |
917 and pi2::"coname prm" |
918 shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}" |
918 shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}" |
919 and "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}" |
919 and "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}" |
920 apply(nominal_induct M avoiding: c x N rule: trm.induct) |
920 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) |
921 apply(auto simp add: eq_bij fresh_bij eqvts) |
921 apply(auto simp add: eq_bij fresh_bij eqvts) |
922 apply(perm_simp)+ |
922 apply(perm_simp)+ |
923 done |
923 done |
924 |
924 |
925 lemma nsubst_eqvt[eqvt]: |
925 lemma nsubst_eqvt[eqvt]: |
926 fixes pi1::"name prm" |
926 fixes pi1::"name prm" |
927 and pi2::"coname prm" |
927 and pi2::"coname prm" |
928 shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}" |
928 shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}" |
929 and "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}" |
929 and "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}" |
930 apply(nominal_induct M avoiding: c x N rule: trm.induct) |
930 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) |
931 apply(auto simp add: eq_bij fresh_bij eqvts) |
931 apply(auto simp add: eq_bij fresh_bij eqvts) |
932 apply(perm_simp)+ |
932 apply(perm_simp)+ |
933 done |
933 done |
934 |
934 |
935 lemma supp_subst1: |
935 lemma supp_subst1: |
936 shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)" |
936 shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)" |
937 apply(nominal_induct M avoiding: y P c rule: trm.induct) |
937 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
938 apply(auto) |
938 apply(auto) |
939 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
939 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
940 apply(blast)+ |
940 apply(blast)+ |
941 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
941 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
942 apply(erule exE) |
942 apply(erule exE) |
1061 apply(blast)+ |
1061 apply(blast)+ |
1062 done |
1062 done |
1063 |
1063 |
1064 lemma supp_subst2: |
1064 lemma supp_subst2: |
1065 shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})" |
1065 shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})" |
1066 apply(nominal_induct M avoiding: y P c rule: trm.induct) |
1066 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1067 apply(auto) |
1067 apply(auto) |
1068 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1068 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1069 apply(blast)+ |
1069 apply(blast)+ |
1070 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1070 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1071 apply(erule exE) |
1071 apply(erule exE) |
1174 apply(blast)+ |
1174 apply(blast)+ |
1175 done |
1175 done |
1176 |
1176 |
1177 lemma supp_subst3: |
1177 lemma supp_subst3: |
1178 shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)" |
1178 shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)" |
1179 apply(nominal_induct M avoiding: x P c rule: trm.induct) |
1179 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1180 apply(auto) |
1180 apply(auto) |
1181 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1181 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1182 apply(blast)+ |
1182 apply(blast)+ |
1183 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1183 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1184 apply(erule exE) |
1184 apply(erule exE) |
1302 apply(blast)+ |
1302 apply(blast)+ |
1303 done |
1303 done |
1304 |
1304 |
1305 lemma supp_subst4: |
1305 lemma supp_subst4: |
1306 shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})" |
1306 shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})" |
1307 apply(nominal_induct M avoiding: x P c rule: trm.induct) |
1307 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1308 apply(auto) |
1308 apply(auto) |
1309 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1309 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1310 apply(blast)+ |
1310 apply(blast)+ |
1311 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1311 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1312 apply(erule exE) |
1312 apply(erule exE) |
1407 apply(blast)+ |
1407 apply(blast)+ |
1408 done |
1408 done |
1409 |
1409 |
1410 lemma supp_subst5: |
1410 lemma supp_subst5: |
1411 shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})" |
1411 shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})" |
1412 apply(nominal_induct M avoiding: y P c rule: trm.induct) |
1412 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1413 apply(auto) |
1413 apply(auto) |
1414 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1414 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1415 apply(blast)+ |
1415 apply(blast)+ |
1416 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1416 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1417 apply(erule exE) |
1417 apply(erule exE) |
1474 apply(blast) |
1474 apply(blast) |
1475 done |
1475 done |
1476 |
1476 |
1477 lemma supp_subst6: |
1477 lemma supp_subst6: |
1478 shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)" |
1478 shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)" |
1479 apply(nominal_induct M avoiding: y P c rule: trm.induct) |
1479 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) |
1480 apply(auto) |
1480 apply(auto) |
1481 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1481 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1482 apply(blast)+ |
1482 apply(blast)+ |
1483 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1483 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)") |
1484 apply(erule exE) |
1484 apply(erule exE) |
1541 apply(blast) |
1541 apply(blast) |
1542 done |
1542 done |
1543 |
1543 |
1544 lemma supp_subst7: |
1544 lemma supp_subst7: |
1545 shows "(supp M - {c}) \<subseteq> supp (M{c:=(x).P})" |
1545 shows "(supp M - {c}) \<subseteq> supp (M{c:=(x).P})" |
1546 apply(nominal_induct M avoiding: x P c rule: trm.induct) |
1546 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1547 apply(auto) |
1547 apply(auto) |
1548 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1548 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1549 apply(blast)+ |
1549 apply(blast)+ |
1550 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1550 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1551 apply(erule exE) |
1551 apply(erule exE) |
1600 apply(blast) |
1600 apply(blast) |
1601 done |
1601 done |
1602 |
1602 |
1603 lemma supp_subst8: |
1603 lemma supp_subst8: |
1604 shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)" |
1604 shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)" |
1605 apply(nominal_induct M avoiding: x P c rule: trm.induct) |
1605 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) |
1606 apply(auto) |
1606 apply(auto) |
1607 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1607 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) |
1608 apply(blast)+ |
1608 apply(blast)+ |
1609 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1609 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)") |
1610 apply(erule exE) |
1610 apply(erule exE) |
1679 done |
1679 done |
1680 |
1680 |
1681 lemma forget: |
1681 lemma forget: |
1682 shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M" |
1682 shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M" |
1683 and "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M" |
1683 and "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M" |
1684 apply(nominal_induct M avoiding: x c P rule: trm.induct) |
1684 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct) |
1685 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
1685 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
1686 done |
1686 done |
1687 |
1687 |
1688 lemma substc_rename1: |
1688 lemma substc_rename1: |
1689 assumes a: "c\<sharp>(M,a)" |
1689 assumes a: "c\<sharp>(M,a)" |
1690 shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}" |
1690 shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}" |
1691 using a |
1691 using a |
1692 proof(nominal_induct M avoiding: c a x N rule: trm.induct) |
1692 proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct) |
1693 case (Ax z d) |
1693 case (Ax z d) |
1694 then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1694 then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1695 next |
1695 next |
1696 case NotL |
1696 case NotL |
1697 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1697 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1782 |
1782 |
1783 lemma substc_rename2: |
1783 lemma substc_rename2: |
1784 assumes a: "y\<sharp>(N,x)" |
1784 assumes a: "y\<sharp>(N,x)" |
1785 shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}" |
1785 shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}" |
1786 using a |
1786 using a |
1787 proof(nominal_induct M avoiding: a x y N rule: trm.induct) |
1787 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) |
1788 case (Ax z d) |
1788 case (Ax z d) |
1789 then show ?case |
1789 then show ?case |
1790 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1790 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1791 next |
1791 next |
1792 case NotL |
1792 case NotL |
1870 |
1870 |
1871 lemma substn_rename3: |
1871 lemma substn_rename3: |
1872 assumes a: "y\<sharp>(M,x)" |
1872 assumes a: "y\<sharp>(M,x)" |
1873 shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}" |
1873 shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}" |
1874 using a |
1874 using a |
1875 proof(nominal_induct M avoiding: a x y N rule: trm.induct) |
1875 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) |
1876 case (Ax z d) |
1876 case (Ax z d) |
1877 then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1877 then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) |
1878 next |
1878 next |
1879 case NotR |
1879 case NotR |
1880 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1880 then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) |
1960 |
1960 |
1961 lemma substn_rename4: |
1961 lemma substn_rename4: |
1962 assumes a: "c\<sharp>(N,a)" |
1962 assumes a: "c\<sharp>(N,a)" |
1963 shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}" |
1963 shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}" |
1964 using a |
1964 using a |
1965 proof(nominal_induct M avoiding: x c a N rule: trm.induct) |
1965 proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct) |
1966 case (Ax z d) |
1966 case (Ax z d) |
1967 then show ?case |
1967 then show ?case |
1968 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1968 by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) |
1969 next |
1969 next |
1970 case NotR |
1970 case NotR |
2423 |
2423 |
2424 lemma substn_crename_comm: |
2424 lemma substn_crename_comm: |
2425 assumes a: "c\<noteq>a" "c\<noteq>b" |
2425 assumes a: "c\<noteq>a" "c\<noteq>b" |
2426 shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}" |
2426 shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}" |
2427 using a |
2427 using a |
2428 apply(nominal_induct M avoiding: x c P a b rule: trm.induct) |
2428 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) |
2429 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2429 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2430 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)") |
2430 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)") |
2431 apply(erule exE) |
2431 apply(erule exE) |
2432 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a") |
2432 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a") |
2433 apply(simp) |
2433 apply(simp) |
2515 |
2515 |
2516 lemma substc_crename_comm: |
2516 lemma substc_crename_comm: |
2517 assumes a: "c\<noteq>a" "c\<noteq>b" |
2517 assumes a: "c\<noteq>a" "c\<noteq>b" |
2518 shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}" |
2518 shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}" |
2519 using a |
2519 using a |
2520 apply(nominal_induct M avoiding: x c P a b rule: trm.induct) |
2520 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) |
2521 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2521 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2522 apply(rule trans) |
2522 apply(rule trans) |
2523 apply(rule better_crename_Cut) |
2523 apply(rule better_crename_Cut) |
2524 apply(simp add: fresh_atm fresh_prod) |
2524 apply(simp add: fresh_atm fresh_prod) |
2525 apply(simp add: rename_fresh fresh_atm) |
2525 apply(simp add: rename_fresh fresh_atm) |
2589 |
2589 |
2590 lemma substn_nrename_comm: |
2590 lemma substn_nrename_comm: |
2591 assumes a: "x\<noteq>y" "x\<noteq>z" |
2591 assumes a: "x\<noteq>y" "x\<noteq>z" |
2592 shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}" |
2592 shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}" |
2593 using a |
2593 using a |
2594 apply(nominal_induct M avoiding: x c P y z rule: trm.induct) |
2594 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) |
2595 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2595 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2596 apply(rule trans) |
2596 apply(rule trans) |
2597 apply(rule better_nrename_Cut) |
2597 apply(rule better_nrename_Cut) |
2598 apply(simp add: fresh_prod fresh_atm) |
2598 apply(simp add: fresh_prod fresh_atm) |
2599 apply(simp add: trm.inject) |
2599 apply(simp add: trm.inject) |
2661 |
2661 |
2662 lemma substc_nrename_comm: |
2662 lemma substc_nrename_comm: |
2663 assumes a: "x\<noteq>y" "x\<noteq>z" |
2663 assumes a: "x\<noteq>y" "x\<noteq>z" |
2664 shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}" |
2664 shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}" |
2665 using a |
2665 using a |
2666 apply(nominal_induct M avoiding: x c P y z rule: trm.induct) |
2666 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) |
2667 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2667 apply(auto simp add: subst_fresh rename_fresh trm.inject) |
2668 apply(rule trans) |
2668 apply(rule trans) |
2669 apply(rule better_nrename_Cut) |
2669 apply(rule better_nrename_Cut) |
2670 apply(simp add: fresh_atm fresh_prod) |
2670 apply(simp add: fresh_atm fresh_prod) |
2671 apply(simp add: rename_fresh fresh_atm) |
2671 apply(simp add: rename_fresh fresh_atm) |
3029 |
3029 |
3030 lemma not_fin_subst1: |
3030 lemma not_fin_subst1: |
3031 assumes a: "\<not>(fin M x)" |
3031 assumes a: "\<not>(fin M x)" |
3032 shows "\<not>(fin (M{c:=(y).P}) x)" |
3032 shows "\<not>(fin (M{c:=(y).P}) x)" |
3033 using a |
3033 using a |
3034 apply(nominal_induct M avoiding: x c y P rule: trm.induct) |
3034 apply(nominal_induct M avoiding: x c y P rule: trm.strong_induct) |
3035 apply(auto) |
3035 apply(auto) |
3036 apply(drule fin_elims, simp) |
3036 apply(drule fin_elims, simp) |
3037 apply(drule fin_elims, simp) |
3037 apply(drule fin_elims, simp) |
3038 apply(drule fin_elims, simp) |
3038 apply(drule fin_elims, simp) |
3039 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname:=(y).P},P,x)") |
3039 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname:=(y).P},P,x)") |
3114 |
3114 |
3115 lemma not_fin_subst2: |
3115 lemma not_fin_subst2: |
3116 assumes a: "\<not>(fin M x)" |
3116 assumes a: "\<not>(fin M x)" |
3117 shows "\<not>(fin (M{y:=<c>.P}) x)" |
3117 shows "\<not>(fin (M{y:=<c>.P}) x)" |
3118 using a |
3118 using a |
3119 apply(nominal_induct M avoiding: x c y P rule: trm.induct) |
3119 apply(nominal_induct M avoiding: x c y P rule: trm.strong_induct) |
3120 apply(auto) |
3120 apply(auto) |
3121 apply(erule fin.cases, simp_all add: trm.inject) |
3121 apply(erule fin.cases, simp_all add: trm.inject) |
3122 apply(erule fin.cases, simp_all add: trm.inject) |
3122 apply(erule fin.cases, simp_all add: trm.inject) |
3123 apply(erule fin.cases, simp_all add: trm.inject) |
3123 apply(erule fin.cases, simp_all add: trm.inject) |
3124 apply(erule fin.cases, simp_all add: trm.inject) |
3124 apply(erule fin.cases, simp_all add: trm.inject) |
3202 |
3202 |
3203 lemma fin_subst1: |
3203 lemma fin_subst1: |
3204 assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P" |
3204 assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P" |
3205 shows "fin (M{y:=<c>.P}) x" |
3205 shows "fin (M{y:=<c>.P}) x" |
3206 using a |
3206 using a |
3207 apply(nominal_induct M avoiding: x y c P rule: trm.induct) |
3207 apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct) |
3208 apply(auto dest!: fin_elims simp add: subst_fresh abs_fresh) |
3208 apply(auto dest!: fin_elims simp add: subst_fresh abs_fresh) |
3209 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3209 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3210 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3210 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3211 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3211 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3212 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3212 apply(rule fin.intros, simp add: subst_fresh abs_fresh) |
3219 |
3219 |
3220 lemma fin_subst2: |
3220 lemma fin_subst2: |
3221 assumes a: "fin M y" "x\<noteq>y" "y\<sharp>P" "M\<noteq>Ax y c" |
3221 assumes a: "fin M y" "x\<noteq>y" "y\<sharp>P" "M\<noteq>Ax y c" |
3222 shows "fin (M{c:=(x).P}) y" |
3222 shows "fin (M{c:=(x).P}) y" |
3223 using a |
3223 using a |
3224 apply(nominal_induct M avoiding: x y c P rule: trm.induct) |
3224 apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct) |
3225 apply(drule fin_elims) |
3225 apply(drule fin_elims) |
3226 apply(simp add: trm.inject) |
3226 apply(simp add: trm.inject) |
3227 apply(rule fin.intros) |
3227 apply(rule fin.intros) |
3228 apply(drule fin_elims, simp) |
3228 apply(drule fin_elims, simp) |
3229 apply(drule fin_elims, simp) |
3229 apply(drule fin_elims, simp) |
3266 |
3266 |
3267 lemma fin_substn_nrename: |
3267 lemma fin_substn_nrename: |
3268 assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P" |
3268 assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P" |
3269 shows "M[x\<turnstile>n>y]{y:=<c>.P} = Cut <c>.P (x).(M{y:=<c>.P})" |
3269 shows "M[x\<turnstile>n>y]{y:=<c>.P} = Cut <c>.P (x).(M{y:=<c>.P})" |
3270 using a |
3270 using a |
3271 apply(nominal_induct M avoiding: x y c P rule: trm.induct) |
3271 apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct) |
3272 apply(drule fin_Ax_elim) |
3272 apply(drule fin_Ax_elim) |
3273 apply(simp) |
3273 apply(simp) |
3274 apply(simp add: trm.inject) |
3274 apply(simp add: trm.inject) |
3275 apply(simp add: alpha calc_atm fresh_atm) |
3275 apply(simp add: alpha calc_atm fresh_atm) |
3276 apply(simp) |
3276 apply(simp) |
3452 |
3452 |
3453 lemma not_fic_subst1: |
3453 lemma not_fic_subst1: |
3454 assumes a: "\<not>(fic M a)" |
3454 assumes a: "\<not>(fic M a)" |
3455 shows "\<not>(fic (M{y:=<c>.P}) a)" |
3455 shows "\<not>(fic (M{y:=<c>.P}) a)" |
3456 using a |
3456 using a |
3457 apply(nominal_induct M avoiding: a c y P rule: trm.induct) |
3457 apply(nominal_induct M avoiding: a c y P rule: trm.strong_induct) |
3458 apply(auto) |
3458 apply(auto) |
3459 apply(drule fic_elims, simp) |
3459 apply(drule fic_elims, simp) |
3460 apply(drule fic_elims, simp) |
3460 apply(drule fic_elims, simp) |
3461 apply(drule fic_elims, simp) |
3461 apply(drule fic_elims, simp) |
3462 apply(drule fic_elims) |
3462 apply(drule fic_elims) |
3528 |
3528 |
3529 lemma not_fic_subst2: |
3529 lemma not_fic_subst2: |
3530 assumes a: "\<not>(fic M a)" |
3530 assumes a: "\<not>(fic M a)" |
3531 shows "\<not>(fic (M{c:=(y).P}) a)" |
3531 shows "\<not>(fic (M{c:=(y).P}) a)" |
3532 using a |
3532 using a |
3533 apply(nominal_induct M avoiding: a c y P rule: trm.induct) |
3533 apply(nominal_induct M avoiding: a c y P rule: trm.strong_induct) |
3534 apply(auto) |
3534 apply(auto) |
3535 apply(drule fic_elims, simp) |
3535 apply(drule fic_elims, simp) |
3536 apply(drule fic_elims, simp) |
3536 apply(drule fic_elims, simp) |
3537 apply(drule fic_elims, simp) |
3537 apply(drule fic_elims, simp) |
3538 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(y).P},P,a)") |
3538 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(y).P},P,a)") |
3610 |
3610 |
3611 lemma fic_subst1: |
3611 lemma fic_subst1: |
3612 assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P" |
3612 assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P" |
3613 shows "fic (M{b:=(x).P}) a" |
3613 shows "fic (M{b:=(x).P}) a" |
3614 using a |
3614 using a |
3615 apply(nominal_induct M avoiding: x b a P rule: trm.induct) |
3615 apply(nominal_induct M avoiding: x b a P rule: trm.strong_induct) |
3616 apply(drule fic_elims) |
3616 apply(drule fic_elims) |
3617 apply(simp add: fic.intros) |
3617 apply(simp add: fic.intros) |
3618 apply(drule fic_elims, simp) |
3618 apply(drule fic_elims, simp) |
3619 apply(drule fic_elims, simp) |
3619 apply(drule fic_elims, simp) |
3620 apply(rule fic.intros) |
3620 apply(rule fic.intros) |
3653 |
3653 |
3654 lemma fic_subst2: |
3654 lemma fic_subst2: |
3655 assumes a: "fic M a" "c\<noteq>a" "a\<sharp>P" "M\<noteq>Ax x a" |
3655 assumes a: "fic M a" "c\<noteq>a" "a\<sharp>P" "M\<noteq>Ax x a" |
3656 shows "fic (M{x:=<c>.P}) a" |
3656 shows "fic (M{x:=<c>.P}) a" |
3657 using a |
3657 using a |
3658 apply(nominal_induct M avoiding: x a c P rule: trm.induct) |
3658 apply(nominal_induct M avoiding: x a c P rule: trm.strong_induct) |
3659 apply(drule fic_elims) |
3659 apply(drule fic_elims) |
3660 apply(simp add: trm.inject) |
3660 apply(simp add: trm.inject) |
3661 apply(rule fic.intros) |
3661 apply(rule fic.intros) |
3662 apply(drule fic_elims, simp) |
3662 apply(drule fic_elims, simp) |
3663 apply(drule fic_elims, simp) |
3663 apply(drule fic_elims, simp) |
3697 |
3697 |
3698 lemma fic_substc_crename: |
3698 lemma fic_substc_crename: |
3699 assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P" |
3699 assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P" |
3700 shows "M[a\<turnstile>c>b]{b:=(y).P} = Cut <a>.(M{b:=(y).P}) (y).P" |
3700 shows "M[a\<turnstile>c>b]{b:=(y).P} = Cut <a>.(M{b:=(y).P}) (y).P" |
3701 using a |
3701 using a |
3702 apply(nominal_induct M avoiding: a b y P rule: trm.induct) |
3702 apply(nominal_induct M avoiding: a b y P rule: trm.strong_induct) |
3703 apply(drule fic_Ax_elim) |
3703 apply(drule fic_Ax_elim) |
3704 apply(simp) |
3704 apply(simp) |
3705 apply(simp add: trm.inject) |
3705 apply(simp add: trm.inject) |
3706 apply(simp add: alpha calc_atm fresh_atm trm.inject) |
3706 apply(simp add: alpha calc_atm fresh_atm trm.inject) |
3707 apply(simp) |
3707 apply(simp) |
5453 |
5453 |
5454 text {* Substitution *} |
5454 text {* Substitution *} |
5455 |
5455 |
5456 lemma subst_not_fin1: |
5456 lemma subst_not_fin1: |
5457 shows "\<not>fin(M{x:=<c>.P}) x" |
5457 shows "\<not>fin(M{x:=<c>.P}) x" |
5458 apply(nominal_induct M avoiding: x c P rule: trm.induct) |
5458 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct) |
5459 apply(auto) |
5459 apply(auto) |
5460 apply(drule fin_elims, simp) |
5460 apply(drule fin_elims, simp) |
5461 apply(drule fin_elims, simp) |
5461 apply(drule fin_elims, simp) |
5462 apply(erule fin.cases, simp_all add: trm.inject) |
5462 apply(erule fin.cases, simp_all add: trm.inject) |
5463 apply(erule fin.cases, simp_all add: trm.inject) |
5463 apply(erule fin.cases, simp_all add: trm.inject) |
5510 |
5510 |
5511 lemma subst_not_fin2: |
5511 lemma subst_not_fin2: |
5512 assumes a: "\<not>fin M y" |
5512 assumes a: "\<not>fin M y" |
5513 shows "\<not>fin(M{c:=(x).P}) y" |
5513 shows "\<not>fin(M{c:=(x).P}) y" |
5514 using a |
5514 using a |
5515 apply(nominal_induct M avoiding: x c P y rule: trm.induct) |
5515 apply(nominal_induct M avoiding: x c P y rule: trm.strong_induct) |
5516 apply(auto) |
5516 apply(auto) |
5517 apply(drule fin_elims, simp) |
5517 apply(drule fin_elims, simp) |
5518 apply(drule fin_elims, simp) |
5518 apply(drule fin_elims, simp) |
5519 apply(drule fin_elims, simp) |
5519 apply(drule fin_elims, simp) |
5520 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(x).P},P)") |
5520 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(x).P},P)") |
5585 apply(simp add: fin.intros abs_fresh) |
5585 apply(simp add: fin.intros abs_fresh) |
5586 done |
5586 done |
5587 |
5587 |
5588 lemma subst_not_fic1: |
5588 lemma subst_not_fic1: |
5589 shows "\<not>fic (M{a:=(x).P}) a" |
5589 shows "\<not>fic (M{a:=(x).P}) a" |
5590 apply(nominal_induct M avoiding: a x P rule: trm.induct) |
5590 apply(nominal_induct M avoiding: a x P rule: trm.strong_induct) |
5591 apply(auto) |
5591 apply(auto) |
5592 apply(erule fic.cases, simp_all add: trm.inject) |
5592 apply(erule fic.cases, simp_all add: trm.inject) |
5593 apply(erule fic.cases, simp_all add: trm.inject) |
5593 apply(erule fic.cases, simp_all add: trm.inject) |
5594 apply(erule fic.cases, simp_all add: trm.inject) |
5594 apply(erule fic.cases, simp_all add: trm.inject) |
5595 apply(erule fic.cases, simp_all add: trm.inject) |
5595 apply(erule fic.cases, simp_all add: trm.inject) |
5642 |
5642 |
5643 lemma subst_not_fic2: |
5643 lemma subst_not_fic2: |
5644 assumes a: "\<not>fic M a" |
5644 assumes a: "\<not>fic M a" |
5645 shows "\<not>fic(M{x:=<b>.P}) a" |
5645 shows "\<not>fic(M{x:=<b>.P}) a" |
5646 using a |
5646 using a |
5647 apply(nominal_induct M avoiding: x a P b rule: trm.induct) |
5647 apply(nominal_induct M avoiding: x a P b rule: trm.strong_induct) |
5648 apply(auto) |
5648 apply(auto) |
5649 apply(drule fic_elims, simp) |
5649 apply(drule fic_elims, simp) |
5650 apply(drule fic_elims, simp) |
5650 apply(drule fic_elims, simp) |
5651 apply(drule fic_elims, simp) |
5651 apply(drule fic_elims, simp) |
5652 apply(drule fic_elims, simp) |
5652 apply(drule fic_elims, simp) |
5856 |
5856 |
5857 text {* substitution properties *} |
5857 text {* substitution properties *} |
5858 |
5858 |
5859 lemma subst_with_ax1: |
5859 lemma subst_with_ax1: |
5860 shows "M{x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* M[x\<turnstile>n>y]" |
5860 shows "M{x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* M[x\<turnstile>n>y]" |
5861 proof(nominal_induct M avoiding: x a y rule: trm.induct) |
5861 proof(nominal_induct M avoiding: x a y rule: trm.strong_induct) |
5862 case (Ax z b x a y) |
5862 case (Ax z b x a y) |
5863 show "(Ax z b){x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* (Ax z b)[x\<turnstile>n>y]" |
5863 show "(Ax z b){x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* (Ax z b)[x\<turnstile>n>y]" |
5864 proof (cases "z=x") |
5864 proof (cases "z=x") |
5865 case True |
5865 case True |
5866 assume eq: "z=x" |
5866 assume eq: "z=x" |
6113 qed |
6113 qed |
6114 qed |
6114 qed |
6115 |
6115 |
6116 lemma subst_with_ax2: |
6116 lemma subst_with_ax2: |
6117 shows "M{b:=(x).Ax x a} \<longrightarrow>\<^isub>a* M[b\<turnstile>c>a]" |
6117 shows "M{b:=(x).Ax x a} \<longrightarrow>\<^isub>a* M[b\<turnstile>c>a]" |
6118 proof(nominal_induct M avoiding: b a x rule: trm.induct) |
6118 proof(nominal_induct M avoiding: b a x rule: trm.strong_induct) |
6119 case (Ax z c b a x) |
6119 case (Ax z c b a x) |
6120 show "(Ax z c){b:=(x).Ax x a} \<longrightarrow>\<^isub>a* (Ax z c)[b\<turnstile>c>a]" |
6120 show "(Ax z c){b:=(x).Ax x a} \<longrightarrow>\<^isub>a* (Ax z c)[b\<turnstile>c>a]" |
6121 proof (cases "c=b") |
6121 proof (cases "c=b") |
6122 case True |
6122 case True |
6123 assume eq: "c=b" |
6123 assume eq: "c=b" |
6369 |
6369 |
6370 text {* substitution lemmas *} |
6370 text {* substitution lemmas *} |
6371 |
6371 |
6372 lemma not_Ax1: |
6372 lemma not_Ax1: |
6373 shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a" |
6373 shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a" |
6374 apply(nominal_induct M avoiding: b y Q x a rule: trm.induct) |
6374 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) |
6375 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
6375 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
6376 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)") |
6376 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)") |
6377 apply(erule exE) |
6377 apply(erule exE) |
6378 apply(simp add: fresh_prod) |
6378 apply(simp add: fresh_prod) |
6379 apply(erule conjE)+ |
6379 apply(erule conjE)+ |
6441 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6441 apply(rule exists_fresh'(2)[OF fs_coname1]) |
6442 done |
6442 done |
6443 |
6443 |
6444 lemma not_Ax2: |
6444 lemma not_Ax2: |
6445 shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a" |
6445 shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a" |
6446 apply(nominal_induct M avoiding: b y Q x a rule: trm.induct) |
6446 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) |
6447 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
6447 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) |
6448 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)") |
6448 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)") |
6449 apply(erule exE) |
6449 apply(erule exE) |
6450 apply(simp add: fresh_prod) |
6450 apply(simp add: fresh_prod) |
6451 apply(erule conjE)+ |
6451 apply(erule conjE)+ |
6521 |
6521 |
6522 lemma interesting_subst1: |
6522 lemma interesting_subst1: |
6523 assumes a: "x\<noteq>y" "x\<sharp>P" "y\<sharp>P" |
6523 assumes a: "x\<noteq>y" "x\<sharp>P" "y\<sharp>P" |
6524 shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}" |
6524 shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}" |
6525 using a |
6525 using a |
6526 proof(nominal_induct N avoiding: x y c P rule: trm.induct) |
6526 proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct) |
6527 case Ax |
6527 case Ax |
6528 then show ?case |
6528 then show ?case |
6529 by (auto simp add: abs_fresh fresh_atm forget trm.inject) |
6529 by (auto simp add: abs_fresh fresh_atm forget trm.inject) |
6530 next |
6530 next |
6531 case (Cut d M u M' x' y' c P) |
6531 case (Cut d M u M' x' y' c P) |
6829 |
6829 |
6830 lemma interesting_subst2: |
6830 lemma interesting_subst2: |
6831 assumes a: "a\<noteq>b" "a\<sharp>P" "b\<sharp>P" |
6831 assumes a: "a\<noteq>b" "a\<sharp>P" "b\<sharp>P" |
6832 shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}" |
6832 shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}" |
6833 using a |
6833 using a |
6834 proof(nominal_induct N avoiding: a b y P rule: trm.induct) |
6834 proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct) |
6835 case Ax |
6835 case Ax |
6836 then show ?case |
6836 then show ?case |
6837 by (auto simp add: abs_fresh fresh_atm forget trm.inject) |
6837 by (auto simp add: abs_fresh fresh_atm forget trm.inject) |
6838 next |
6838 next |
6839 case (Cut d M u M' x' y' c P) |
6839 case (Cut d M u M' x' y' c P) |
7116 |
7116 |
7117 lemma subst_subst1: |
7117 lemma subst_subst1: |
7118 assumes a: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" |
7118 assumes a: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" |
7119 shows "M{x:=<a>.P}{b:=(y).Q} = M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
7119 shows "M{x:=<a>.P}{b:=(y).Q} = M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" |
7120 using a |
7120 using a |
7121 proof(nominal_induct M avoiding: x a P b y Q rule: trm.induct) |
7121 proof(nominal_induct M avoiding: x a P b y Q rule: trm.strong_induct) |
7122 case (Ax z c) |
7122 case (Ax z c) |
7123 have fs: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" by fact+ |
7123 have fs: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" by fact+ |
7124 { assume asm: "z=x \<and> c=b" |
7124 { assume asm: "z=x \<and> c=b" |
7125 have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp |
7125 have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp |
7126 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" |
7126 also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" |
7405 |
7405 |
7406 lemma subst_subst2: |
7406 lemma subst_subst2: |
7407 assumes a: "a\<sharp>(b,P,N)" "x\<sharp>(y,P,M)" "b\<sharp>(M,N)" "y\<sharp>P" |
7407 assumes a: "a\<sharp>(b,P,N)" "x\<sharp>(y,P,M)" "b\<sharp>(M,N)" "y\<sharp>P" |
7408 shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}" |
7408 shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}" |
7409 using a |
7409 using a |
7410 proof(nominal_induct M avoiding: a x N y b P rule: trm.induct) |
7410 proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct) |
7411 case (Ax z c) |
7411 case (Ax z c) |
7412 then show ?case |
7412 then show ?case |
7413 by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7413 by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) |
7414 next |
7414 next |
7415 case (Cut d M' u M'') |
7415 case (Cut d M' u M'') |
7689 |
7689 |
7690 lemma subst_subst3: |
7690 lemma subst_subst3: |
7691 assumes a: "a\<sharp>(P,N,c)" "c\<sharp>(M,N)" "x\<sharp>(y,P,M)" "y\<sharp>(P,x)" "M\<noteq>Ax y a" |
7691 assumes a: "a\<sharp>(P,N,c)" "c\<sharp>(M,N)" "x\<sharp>(y,P,M)" "y\<sharp>(P,x)" "M\<noteq>Ax y a" |
7692 shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}" |
7692 shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}" |
7693 using a |
7693 using a |
7694 proof(nominal_induct N avoiding: x y a c M P rule: trm.induct) |
7694 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) |
7695 case (Ax z c) |
7695 case (Ax z c) |
7696 then show ?case |
7696 then show ?case |
7697 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7697 by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7698 next |
7698 next |
7699 case (Cut d M' u M'') |
7699 case (Cut d M' u M'') |
7958 |
7958 |
7959 lemma subst_subst4: |
7959 lemma subst_subst4: |
7960 assumes a: "x\<sharp>(P,N,y)" "y\<sharp>(M,N)" "a\<sharp>(c,P,M)" "c\<sharp>(P,a)" "M\<noteq>Ax x c" |
7960 assumes a: "x\<sharp>(P,N,y)" "y\<sharp>(M,N)" "a\<sharp>(c,P,M)" "c\<sharp>(P,a)" "M\<noteq>Ax x c" |
7961 shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}" |
7961 shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}" |
7962 using a |
7962 using a |
7963 proof(nominal_induct N avoiding: x y a c M P rule: trm.induct) |
7963 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) |
7964 case (Ax z c) |
7964 case (Ax z c) |
7965 then show ?case |
7965 then show ?case |
7966 by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7966 by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) |
7967 next |
7967 next |
7968 case (Cut d M' u M'') |
7968 case (Cut d M' u M'') |
11175 where |
11175 where |
11176 "\<parallel><B>\<parallel> \<equiv> NEGc B (\<parallel>(B)\<parallel>)" |
11176 "\<parallel><B>\<parallel> \<equiv> NEGc B (\<parallel>(B)\<parallel>)" |
11177 |
11177 |
11178 lemma NEGn_decreasing: |
11178 lemma NEGn_decreasing: |
11179 shows "X\<subseteq>Y \<Longrightarrow> NEGn B Y \<subseteq> NEGn B X" |
11179 shows "X\<subseteq>Y \<Longrightarrow> NEGn B Y \<subseteq> NEGn B X" |
11180 by (nominal_induct B rule: ty.induct) |
11180 by (nominal_induct B rule: ty.strong_induct) |
11181 (auto dest: BINDINGn_decreasing) |
11181 (auto dest: BINDINGn_decreasing) |
11182 |
11182 |
11183 lemma NEGc_decreasing: |
11183 lemma NEGc_decreasing: |
11184 shows "X\<subseteq>Y \<Longrightarrow> NEGc B Y \<subseteq> NEGc B X" |
11184 shows "X\<subseteq>Y \<Longrightarrow> NEGc B Y \<subseteq> NEGc B X" |
11185 by (nominal_induct B rule: ty.induct) |
11185 by (nominal_induct B rule: ty.strong_induct) |
11186 (auto dest: BINDINGc_decreasing) |
11186 (auto dest: BINDINGc_decreasing) |
11187 |
11187 |
11188 lemma mono_NEGn_NEGc: |
11188 lemma mono_NEGn_NEGc: |
11189 shows "mono (NEGn B \<circ> NEGc B)" |
11189 shows "mono (NEGn B \<circ> NEGc B)" |
11190 and "mono (NEGc B \<circ> NEGn B)" |
11190 and "mono (NEGc B \<circ> NEGn B)" |
11244 lemma AXIOMS_in_CANDs: |
11244 lemma AXIOMS_in_CANDs: |
11245 shows "AXIOMSn B \<subseteq> (\<parallel>(B)\<parallel>)" |
11245 shows "AXIOMSn B \<subseteq> (\<parallel>(B)\<parallel>)" |
11246 and "AXIOMSc B \<subseteq> (\<parallel><B>\<parallel>)" |
11246 and "AXIOMSc B \<subseteq> (\<parallel><B>\<parallel>)" |
11247 proof - |
11247 proof - |
11248 have "AXIOMSn B \<subseteq> NEGn B (\<parallel><B>\<parallel>)" |
11248 have "AXIOMSn B \<subseteq> NEGn B (\<parallel><B>\<parallel>)" |
11249 by (nominal_induct B rule: ty.induct) (auto) |
11249 by (nominal_induct B rule: ty.strong_induct) (auto) |
11250 then show "AXIOMSn B \<subseteq> \<parallel>(B)\<parallel>" using NEG_simp by blast |
11250 then show "AXIOMSn B \<subseteq> \<parallel>(B)\<parallel>" using NEG_simp by blast |
11251 next |
11251 next |
11252 have "AXIOMSc B \<subseteq> NEGc B (\<parallel>(B)\<parallel>)" |
11252 have "AXIOMSc B \<subseteq> NEGc B (\<parallel>(B)\<parallel>)" |
11253 by (nominal_induct B rule: ty.induct) (auto) |
11253 by (nominal_induct B rule: ty.strong_induct) (auto) |
11254 then show "AXIOMSc B \<subseteq> \<parallel><B>\<parallel>" using NEG_simp by blast |
11254 then show "AXIOMSc B \<subseteq> \<parallel><B>\<parallel>" using NEG_simp by blast |
11255 qed |
11255 qed |
11256 |
11256 |
11257 lemma Ax_in_CANDs: |
11257 lemma Ax_in_CANDs: |
11258 shows "(y):Ax x a \<in> \<parallel>(B)\<parallel>" |
11258 shows "(y):Ax x a \<in> \<parallel>(B)\<parallel>" |
11443 |
11443 |
11444 lemma CAND_eqvt_name: |
11444 lemma CAND_eqvt_name: |
11445 fixes pi::"name prm" |
11445 fixes pi::"name prm" |
11446 shows "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)" |
11446 shows "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)" |
11447 and "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)" |
11447 and "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)" |
11448 proof (nominal_induct B rule: ty.induct) |
11448 proof (nominal_induct B rule: ty.strong_induct) |
11449 case (PR X) |
11449 case (PR X) |
11450 { case 1 show ?case |
11450 { case 1 show ?case |
11451 apply - |
11451 apply - |
11452 apply(simp add: lfp_eqvt) |
11452 apply(simp add: lfp_eqvt) |
11453 apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"]) |
11453 apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"]) |
11553 |
11553 |
11554 lemma CAND_eqvt_coname: |
11554 lemma CAND_eqvt_coname: |
11555 fixes pi::"coname prm" |
11555 fixes pi::"coname prm" |
11556 shows "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)" |
11556 shows "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)" |
11557 and "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)" |
11557 and "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)" |
11558 proof (nominal_induct B rule: ty.induct) |
11558 proof (nominal_induct B rule: ty.strong_induct) |
11559 case (PR X) |
11559 case (PR X) |
11560 { case 1 show ?case |
11560 { case 1 show ?case |
11561 apply - |
11561 apply - |
11562 apply(simp add: lfp_eqvt) |
11562 apply(simp add: lfp_eqvt) |
11563 apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"]) |
11563 apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"]) |
12737 |
12737 |
12738 lemma CAND_NotR_elim: |
12738 lemma CAND_NotR_elim: |
12739 assumes a: "<a>:NotR (x).M a \<in> (\<parallel><B>\<parallel>)" "<a>:NotR (x).M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12739 assumes a: "<a>:NotR (x).M a \<in> (\<parallel><B>\<parallel>)" "<a>:NotR (x).M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12740 shows "\<exists>B'. B = NOT B' \<and> (x):M \<in> (\<parallel>(B')\<parallel>)" |
12740 shows "\<exists>B'. B = NOT B' \<and> (x):M \<in> (\<parallel>(B')\<parallel>)" |
12741 using a |
12741 using a |
12742 apply(nominal_induct B rule: ty.induct) |
12742 apply(nominal_induct B rule: ty.strong_induct) |
12743 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12743 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12744 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12744 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12745 apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12745 apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12746 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) |
12746 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) |
12747 done |
12747 done |
12748 |
12748 |
12749 lemma CAND_NotL_elim_aux: |
12749 lemma CAND_NotL_elim_aux: |
12750 assumes a: "(x):NotL <a>.M x \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):NotL <a>.M x \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12750 assumes a: "(x):NotL <a>.M x \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):NotL <a>.M x \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12751 shows "\<exists>B'. B = NOT B' \<and> <a>:M \<in> (\<parallel><B'>\<parallel>)" |
12751 shows "\<exists>B'. B = NOT B' \<and> <a>:M \<in> (\<parallel><B'>\<parallel>)" |
12752 using a |
12752 using a |
12753 apply(nominal_induct B rule: ty.induct) |
12753 apply(nominal_induct B rule: ty.strong_induct) |
12754 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12754 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12755 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12755 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12756 apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12756 apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12757 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) |
12757 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) |
12758 done |
12758 done |
12761 |
12761 |
12762 lemma CAND_AndR_elim: |
12762 lemma CAND_AndR_elim: |
12763 assumes a: "<a>:AndR <b>.M <c>.N a \<in> (\<parallel><B>\<parallel>)" "<a>:AndR <b>.M <c>.N a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12763 assumes a: "<a>:AndR <b>.M <c>.N a \<in> (\<parallel><B>\<parallel>)" "<a>:AndR <b>.M <c>.N a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12764 shows "\<exists>B1 B2. B = B1 AND B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>) \<and> <c>:N \<in> (\<parallel><B2>\<parallel>)" |
12764 shows "\<exists>B1 B2. B = B1 AND B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>) \<and> <c>:N \<in> (\<parallel><B2>\<parallel>)" |
12765 using a |
12765 using a |
12766 apply(nominal_induct B rule: ty.induct) |
12766 apply(nominal_induct B rule: ty.strong_induct) |
12767 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12767 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12768 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12768 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12769 apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12769 apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12770 apply(simp add: CAND_eqvt_coname calc_atm) |
12770 apply(simp add: CAND_eqvt_coname calc_atm) |
12771 apply(auto intro: CANDs_alpha)[1] |
12771 apply(auto intro: CANDs_alpha)[1] |
12842 |
12842 |
12843 lemma CAND_OrR1_elim: |
12843 lemma CAND_OrR1_elim: |
12844 assumes a: "<a>:OrR1 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR1 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12844 assumes a: "<a>:OrR1 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR1 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12845 shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>)" |
12845 shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>)" |
12846 using a |
12846 using a |
12847 apply(nominal_induct B rule: ty.induct) |
12847 apply(nominal_induct B rule: ty.strong_induct) |
12848 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12848 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12849 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12849 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12850 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12850 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12851 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) |
12851 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) |
12852 apply(case_tac "a=aa") |
12852 apply(case_tac "a=aa") |
12863 |
12863 |
12864 lemma CAND_OrR2_elim: |
12864 lemma CAND_OrR2_elim: |
12865 assumes a: "<a>:OrR2 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR2 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12865 assumes a: "<a>:OrR2 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR2 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
12866 shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B2>\<parallel>)" |
12866 shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B2>\<parallel>)" |
12867 using a |
12867 using a |
12868 apply(nominal_induct B rule: ty.induct) |
12868 apply(nominal_induct B rule: ty.strong_induct) |
12869 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12869 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
12870 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12870 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12871 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12871 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) |
12872 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) |
12872 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) |
12873 apply(case_tac "a=aa") |
12873 apply(case_tac "a=aa") |
12884 |
12884 |
12885 lemma CAND_OrL_elim_aux: |
12885 lemma CAND_OrL_elim_aux: |
12886 assumes a: "(x):(OrL (y).M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(OrL (y).M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12886 assumes a: "(x):(OrL (y).M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(OrL (y).M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12887 shows "\<exists>B1 B2. B = B1 OR B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" |
12887 shows "\<exists>B1 B2. B = B1 OR B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" |
12888 using a |
12888 using a |
12889 apply(nominal_induct B rule: ty.induct) |
12889 apply(nominal_induct B rule: ty.strong_induct) |
12890 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12890 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12891 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12891 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12892 apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12892 apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12893 apply(simp add: CAND_eqvt_name calc_atm) |
12893 apply(simp add: CAND_eqvt_name calc_atm) |
12894 apply(auto intro: CANDs_alpha)[1] |
12894 apply(auto intro: CANDs_alpha)[1] |
12967 |
12967 |
12968 lemma CAND_AndL1_elim_aux: |
12968 lemma CAND_AndL1_elim_aux: |
12969 assumes a: "(x):(AndL1 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL1 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12969 assumes a: "(x):(AndL1 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL1 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12970 shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>)" |
12970 shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>)" |
12971 using a |
12971 using a |
12972 apply(nominal_induct B rule: ty.induct) |
12972 apply(nominal_induct B rule: ty.strong_induct) |
12973 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12973 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12974 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12974 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12975 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12975 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12976 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) |
12976 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) |
12977 apply(case_tac "x=xa") |
12977 apply(case_tac "x=xa") |
12990 |
12990 |
12991 lemma CAND_AndL2_elim_aux: |
12991 lemma CAND_AndL2_elim_aux: |
12992 assumes a: "(x):(AndL2 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL2 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12992 assumes a: "(x):(AndL2 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL2 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
12993 shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B2)\<parallel>)" |
12993 shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B2)\<parallel>)" |
12994 using a |
12994 using a |
12995 apply(nominal_induct B rule: ty.induct) |
12995 apply(nominal_induct B rule: ty.strong_induct) |
12996 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12996 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
12997 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12997 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
12998 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12998 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
12999 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) |
12999 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) |
13000 apply(case_tac "x=xa") |
13000 apply(case_tac "x=xa") |
13013 |
13013 |
13014 lemma CAND_ImpL_elim_aux: |
13014 lemma CAND_ImpL_elim_aux: |
13015 assumes a: "(x):(ImpL <a>.M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(ImpL <a>.M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
13015 assumes a: "(x):(ImpL <a>.M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(ImpL <a>.M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)" |
13016 shows "\<exists>B1 B2. B = B1 IMP B2 \<and> <a>:M \<in> (\<parallel><B1>\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" |
13016 shows "\<exists>B1 B2. B = B1 IMP B2 \<and> <a>:M \<in> (\<parallel><B1>\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" |
13017 using a |
13017 using a |
13018 apply(nominal_induct B rule: ty.induct) |
13018 apply(nominal_induct B rule: ty.strong_induct) |
13019 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
13019 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) |
13020 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
13020 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) |
13021 apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
13021 apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) |
13022 apply(simp add: CAND_eqvt_name calc_atm) |
13022 apply(simp add: CAND_eqvt_name calc_atm) |
13023 apply(auto intro: CANDs_alpha)[1] |
13023 apply(auto intro: CANDs_alpha)[1] |
13050 assumes a: "<a>:ImpR (x).<b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:ImpR (x).<b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
13050 assumes a: "<a>:ImpR (x).<b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:ImpR (x).<b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)" |
13051 shows "\<exists>B1 B2. B = B1 IMP B2 \<and> |
13051 shows "\<exists>B1 B2. B = B1 IMP B2 \<and> |
13052 (\<forall>z P. x\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B2)\<parallel> \<longrightarrow> (x):(M{b:=(z).P}) \<in> \<parallel>(B1)\<parallel>) \<and> |
13052 (\<forall>z P. x\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B2)\<parallel> \<longrightarrow> (x):(M{b:=(z).P}) \<in> \<parallel>(B1)\<parallel>) \<and> |
13053 (\<forall>c Q. b\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><B1>\<parallel> \<longrightarrow> <b>:(M{x:=<c>.Q}) \<in> \<parallel><B2>\<parallel>)" |
13053 (\<forall>c Q. b\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><B1>\<parallel> \<longrightarrow> <b>:(M{x:=<c>.Q}) \<in> \<parallel><B2>\<parallel>)" |
13054 using a |
13054 using a |
13055 apply(nominal_induct B rule: ty.induct) |
13055 apply(nominal_induct B rule: ty.strong_induct) |
13056 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
13056 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) |
13057 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm fresh_prod fresh_bij) |
13057 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm fresh_prod fresh_bij) |
13058 apply(generate_fresh "name") |
13058 apply(generate_fresh "name") |
13059 apply(generate_fresh "coname") |
13059 apply(generate_fresh "coname") |
13060 apply(drule_tac a="ca" and z="c" in alpha_name_coname) |
13060 apply(drule_tac a="ca" and z="c" in alpha_name_coname) |
13455 done |
13455 done |
13456 |
13456 |
13457 lemma CANDs_imply_SNa: |
13457 lemma CANDs_imply_SNa: |
13458 shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M" |
13458 shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M" |
13459 and "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M" |
13459 and "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M" |
13460 proof(induct B arbitrary: a x M rule: ty.weak_induct) |
13460 proof(induct B arbitrary: a x M rule: ty.induct) |
13461 case (PR X) |
13461 case (PR X) |
13462 { case 1 |
13462 { case 1 |
13463 have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact |
13463 have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact |
13464 then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp |
13464 then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp |
13465 then have "<a>:M \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp |
13465 then have "<a>:M \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp |
13762 qed |
13762 qed |
13763 |
13763 |
13764 lemma CANDs_preserved: |
13764 lemma CANDs_preserved: |
13765 shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>" |
13765 shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>" |
13766 and "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" |
13766 and "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" |
13767 proof(nominal_induct B arbitrary: a x M M' rule: ty.induct) |
13767 proof(nominal_induct B arbitrary: a x M M' rule: ty.strong_induct) |
13768 case (PR X) |
13768 case (PR X) |
13769 { case 1 |
13769 { case 1 |
13770 have asm: "M \<longrightarrow>\<^isub>a* M'" by fact |
13770 have asm: "M \<longrightarrow>\<^isub>a* M'" by fact |
13771 have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact |
13771 have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact |
13772 then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp |
13772 then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp |
14133 lemma fic_CANDS: |
14133 lemma fic_CANDS: |
14134 assumes a: "\<not>fic M a" |
14134 assumes a: "\<not>fic M a" |
14135 and b: "<a>:M \<in> \<parallel><B>\<parallel>" |
14135 and b: "<a>:M \<in> \<parallel><B>\<parallel>" |
14136 shows "<a>:M \<in> AXIOMSc B \<or> <a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)" |
14136 shows "<a>:M \<in> AXIOMSc B \<or> <a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)" |
14137 using a b |
14137 using a b |
14138 apply(nominal_induct B rule: ty.induct) |
14138 apply(nominal_induct B rule: ty.strong_induct) |
14139 apply(simp) |
14139 apply(simp) |
14140 apply(simp) |
14140 apply(simp) |
14141 apply(erule disjE) |
14141 apply(erule disjE) |
14142 apply(simp) |
14142 apply(simp) |
14143 apply(erule disjE) |
14143 apply(erule disjE) |
14200 lemma fin_CANDS_aux: |
14200 lemma fin_CANDS_aux: |
14201 assumes a: "\<not>fin M x" |
14201 assumes a: "\<not>fin M x" |
14202 and b: "(x):M \<in> (NEGn B (\<parallel><B>\<parallel>))" |
14202 and b: "(x):M \<in> (NEGn B (\<parallel><B>\<parallel>))" |
14203 shows "(x):M \<in> AXIOMSn B \<or> (x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)" |
14203 shows "(x):M \<in> AXIOMSn B \<or> (x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)" |
14204 using a b |
14204 using a b |
14205 apply(nominal_induct B rule: ty.induct) |
14205 apply(nominal_induct B rule: ty.strong_induct) |
14206 apply(simp) |
14206 apply(simp) |
14207 apply(simp) |
14207 apply(simp) |
14208 apply(erule disjE) |
14208 apply(erule disjE) |
14209 apply(simp) |
14209 apply(simp) |
14210 apply(erule disjE) |
14210 apply(erule disjE) |
14276 |
14276 |
14277 lemma BINDING_implies_CAND: |
14277 lemma BINDING_implies_CAND: |
14278 shows "<c>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> <c>:M \<in> (\<parallel><B>\<parallel>)" |
14278 shows "<c>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> <c>:M \<in> (\<parallel><B>\<parallel>)" |
14279 and "(x):N \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> (x):N \<in> (\<parallel>(B)\<parallel>)" |
14279 and "(x):N \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> (x):N \<in> (\<parallel>(B)\<parallel>)" |
14280 apply - |
14280 apply - |
14281 apply(nominal_induct B rule: ty.induct) |
14281 apply(nominal_induct B rule: ty.strong_induct) |
14282 apply(auto) |
14282 apply(auto) |
14283 apply(rule NEG_intro) |
14283 apply(rule NEG_intro) |
14284 apply(nominal_induct B rule: ty.induct) |
14284 apply(nominal_induct B rule: ty.strong_induct) |
14285 apply(auto) |
14285 apply(auto) |
14286 done |
14286 done |
14287 |
14287 |
14288 text {* 3rd Main Lemma *} |
14288 text {* 3rd Main Lemma *} |
14289 |
14289 |
14342 |
14342 |
14343 lemma not_fic_crename_aux: |
14343 lemma not_fic_crename_aux: |
14344 assumes a: "fic M c" "c\<sharp>(a,b)" |
14344 assumes a: "fic M c" "c\<sharp>(a,b)" |
14345 shows "fic (M[a\<turnstile>c>b]) c" |
14345 shows "fic (M[a\<turnstile>c>b]) c" |
14346 using a |
14346 using a |
14347 apply(nominal_induct M avoiding: c a b rule: trm.induct) |
14347 apply(nominal_induct M avoiding: c a b rule: trm.strong_induct) |
14348 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) |
14348 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) |
14349 done |
14349 done |
14350 |
14350 |
14351 lemma not_fic_crename: |
14351 lemma not_fic_crename: |
14352 assumes a: "\<not>(fic (M[a\<turnstile>c>b]) c)" "c\<sharp>(a,b)" |
14352 assumes a: "\<not>(fic (M[a\<turnstile>c>b]) c)" "c\<sharp>(a,b)" |
14357 |
14357 |
14358 lemma not_fin_crename_aux: |
14358 lemma not_fin_crename_aux: |
14359 assumes a: "fin M y" |
14359 assumes a: "fin M y" |
14360 shows "fin (M[a\<turnstile>c>b]) y" |
14360 shows "fin (M[a\<turnstile>c>b]) y" |
14361 using a |
14361 using a |
14362 apply(nominal_induct M avoiding: a b rule: trm.induct) |
14362 apply(nominal_induct M avoiding: a b rule: trm.strong_induct) |
14363 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) |
14363 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) |
14364 done |
14364 done |
14365 |
14365 |
14366 lemma not_fin_crename: |
14366 lemma not_fin_crename: |
14367 assumes a: "\<not>(fin (M[a\<turnstile>c>b]) y)" |
14367 assumes a: "\<not>(fin (M[a\<turnstile>c>b]) y)" |
14373 lemma crename_fresh_interesting1: |
14373 lemma crename_fresh_interesting1: |
14374 fixes c::"coname" |
14374 fixes c::"coname" |
14375 assumes a: "c\<sharp>(M[a\<turnstile>c>b])" "c\<sharp>(a,b)" |
14375 assumes a: "c\<sharp>(M[a\<turnstile>c>b])" "c\<sharp>(a,b)" |
14376 shows "c\<sharp>M" |
14376 shows "c\<sharp>M" |
14377 using a |
14377 using a |
14378 apply(nominal_induct M avoiding: c a b rule: trm.induct) |
14378 apply(nominal_induct M avoiding: c a b rule: trm.strong_induct) |
14379 apply(auto split: if_splits simp add: abs_fresh) |
14379 apply(auto split: if_splits simp add: abs_fresh) |
14380 done |
14380 done |
14381 |
14381 |
14382 lemma crename_fresh_interesting2: |
14382 lemma crename_fresh_interesting2: |
14383 fixes x::"name" |
14383 fixes x::"name" |
14384 assumes a: "x\<sharp>(M[a\<turnstile>c>b])" |
14384 assumes a: "x\<sharp>(M[a\<turnstile>c>b])" |
14385 shows "x\<sharp>M" |
14385 shows "x\<sharp>M" |
14386 using a |
14386 using a |
14387 apply(nominal_induct M avoiding: x a b rule: trm.induct) |
14387 apply(nominal_induct M avoiding: x a b rule: trm.strong_induct) |
14388 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm) |
14388 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm) |
14389 done |
14389 done |
14390 |
14390 |
14391 |
14391 |
14392 lemma fic_crename: |
14392 lemma fic_crename: |
14393 assumes a: "fic (M[a\<turnstile>c>b]) c" "c\<sharp>(a,b)" |
14393 assumes a: "fic (M[a\<turnstile>c>b]) c" "c\<sharp>(a,b)" |
14394 shows "fic M c" |
14394 shows "fic M c" |
14395 using a |
14395 using a |
14396 apply(nominal_induct M avoiding: c a b rule: trm.induct) |
14396 apply(nominal_induct M avoiding: c a b rule: trm.strong_induct) |
14397 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
14397 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
14398 split: if_splits) |
14398 split: if_splits) |
14399 apply(auto dest: crename_fresh_interesting1 simp add: fresh_prod fresh_atm) |
14399 apply(auto dest: crename_fresh_interesting1 simp add: fresh_prod fresh_atm) |
14400 done |
14400 done |
14401 |
14401 |
14402 lemma fin_crename: |
14402 lemma fin_crename: |
14403 assumes a: "fin (M[a\<turnstile>c>b]) x" |
14403 assumes a: "fin (M[a\<turnstile>c>b]) x" |
14404 shows "fin M x" |
14404 shows "fin M x" |
14405 using a |
14405 using a |
14406 apply(nominal_induct M avoiding: x a b rule: trm.induct) |
14406 apply(nominal_induct M avoiding: x a b rule: trm.strong_induct) |
14407 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
14407 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
14408 split: if_splits) |
14408 split: if_splits) |
14409 apply(auto dest: crename_fresh_interesting2 simp add: fresh_prod fresh_atm) |
14409 apply(auto dest: crename_fresh_interesting2 simp add: fresh_prod fresh_atm) |
14410 done |
14410 done |
14411 |
14411 |
14412 lemma crename_Cut: |
14412 lemma crename_Cut: |
14413 assumes a: "R[a\<turnstile>c>b] = Cut <c>.M (x).N" "c\<sharp>(a,b,N,R)" "x\<sharp>(M,R)" |
14413 assumes a: "R[a\<turnstile>c>b] = Cut <c>.M (x).N" "c\<sharp>(a,b,N,R)" "x\<sharp>(M,R)" |
14414 shows "\<exists>M' N'. R = Cut <c>.M' (x).N' \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> x\<sharp>M'" |
14414 shows "\<exists>M' N'. R = Cut <c>.M' (x).N' \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> x\<sharp>M'" |
14415 using a |
14415 using a |
14416 apply(nominal_induct R avoiding: a b c x M N rule: trm.induct) |
14416 apply(nominal_induct R avoiding: a b c x M N rule: trm.strong_induct) |
14417 apply(auto split: if_splits) |
14417 apply(auto split: if_splits) |
14418 apply(simp add: trm.inject) |
14418 apply(simp add: trm.inject) |
14419 apply(auto simp add: alpha) |
14419 apply(auto simp add: alpha) |
14420 apply(rule_tac x="[(name,x)]\<bullet>trm2" in exI) |
14420 apply(rule_tac x="[(name,x)]\<bullet>trm2" in exI) |
14421 apply(perm_simp) |
14421 apply(perm_simp) |
14450 |
14450 |
14451 lemma crename_NotR: |
14451 lemma crename_NotR: |
14452 assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>(a,b)" |
14452 assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>(a,b)" |
14453 shows "\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N" |
14453 shows "\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N" |
14454 using a |
14454 using a |
14455 apply(nominal_induct R avoiding: a b c x N rule: trm.induct) |
14455 apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct) |
14456 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14456 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14457 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
14457 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
14458 apply(perm_simp) |
14458 apply(perm_simp) |
14459 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14459 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14460 apply(drule sym) |
14460 apply(drule sym) |
14464 |
14464 |
14465 lemma crename_NotR': |
14465 lemma crename_NotR': |
14466 assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>a" |
14466 assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>a" |
14467 shows "(\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N) \<or> (\<exists>N'. (R = NotR (x).N' a) \<and> b=c \<and> N'[a\<turnstile>c>b] = N)" |
14467 shows "(\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N) \<or> (\<exists>N'. (R = NotR (x).N' a) \<and> b=c \<and> N'[a\<turnstile>c>b] = N)" |
14468 using a |
14468 using a |
14469 apply(nominal_induct R avoiding: a b c x N rule: trm.induct) |
14469 apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct) |
14470 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
14470 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
14471 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
14471 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
14472 apply(perm_simp) |
14472 apply(perm_simp) |
14473 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14473 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14474 apply(drule sym) |
14474 apply(drule sym) |
14484 |
14484 |
14485 lemma crename_NotR_aux: |
14485 lemma crename_NotR_aux: |
14486 assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" |
14486 assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" |
14487 shows "(a=c \<and> a=b) \<or> (a\<noteq>c)" |
14487 shows "(a=c \<and> a=b) \<or> (a\<noteq>c)" |
14488 using a |
14488 using a |
14489 apply(nominal_induct R avoiding: a b c x N rule: trm.induct) |
14489 apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct) |
14490 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14490 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14491 done |
14491 done |
14492 |
14492 |
14493 lemma crename_NotL: |
14493 lemma crename_NotL: |
14494 assumes a: "R[a\<turnstile>c>b] = NotL <c>.N y" "c\<sharp>(R,a,b)" |
14494 assumes a: "R[a\<turnstile>c>b] = NotL <c>.N y" "c\<sharp>(R,a,b)" |
14495 shows "\<exists>N'. (R = NotL <c>.N' y) \<and> N'[a\<turnstile>c>b] = N" |
14495 shows "\<exists>N'. (R = NotL <c>.N' y) \<and> N'[a\<turnstile>c>b] = N" |
14496 using a |
14496 using a |
14497 apply(nominal_induct R avoiding: a b c y N rule: trm.induct) |
14497 apply(nominal_induct R avoiding: a b c y N rule: trm.strong_induct) |
14498 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14498 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14499 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI) |
14499 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI) |
14500 apply(perm_simp) |
14500 apply(perm_simp) |
14501 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14501 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14502 apply(drule sym) |
14502 apply(drule sym) |
14506 |
14506 |
14507 lemma crename_AndL1: |
14507 lemma crename_AndL1: |
14508 assumes a: "R[a\<turnstile>c>b] = AndL1 (x).N y" "x\<sharp>R" |
14508 assumes a: "R[a\<turnstile>c>b] = AndL1 (x).N y" "x\<sharp>R" |
14509 shows "\<exists>N'. (R = AndL1 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" |
14509 shows "\<exists>N'. (R = AndL1 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" |
14510 using a |
14510 using a |
14511 apply(nominal_induct R avoiding: a b x y N rule: trm.induct) |
14511 apply(nominal_induct R avoiding: a b x y N rule: trm.strong_induct) |
14512 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14512 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14513 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI) |
14513 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI) |
14514 apply(perm_simp) |
14514 apply(perm_simp) |
14515 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14515 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14516 apply(drule sym) |
14516 apply(drule sym) |
14520 |
14520 |
14521 lemma crename_AndL2: |
14521 lemma crename_AndL2: |
14522 assumes a: "R[a\<turnstile>c>b] = AndL2 (x).N y" "x\<sharp>R" |
14522 assumes a: "R[a\<turnstile>c>b] = AndL2 (x).N y" "x\<sharp>R" |
14523 shows "\<exists>N'. (R = AndL2 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" |
14523 shows "\<exists>N'. (R = AndL2 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" |
14524 using a |
14524 using a |
14525 apply(nominal_induct R avoiding: a b x y N rule: trm.induct) |
14525 apply(nominal_induct R avoiding: a b x y N rule: trm.strong_induct) |
14526 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14526 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14527 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI) |
14527 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI) |
14528 apply(perm_simp) |
14528 apply(perm_simp) |
14529 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14529 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14530 apply(drule sym) |
14530 apply(drule sym) |
14534 |
14534 |
14535 lemma crename_AndR_aux: |
14535 lemma crename_AndR_aux: |
14536 assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" |
14536 assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" |
14537 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14537 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14538 using a |
14538 using a |
14539 apply(nominal_induct R avoiding: a b c d e M N rule: trm.induct) |
14539 apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct) |
14540 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14540 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14541 done |
14541 done |
14542 |
14542 |
14543 lemma crename_AndR: |
14543 lemma crename_AndR: |
14544 assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>(a,b)" |
14544 assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>(a,b)" |
14545 shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M'" |
14545 shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M'" |
14546 using a |
14546 using a |
14547 apply(nominal_induct R avoiding: a b c d e M N rule: trm.induct) |
14547 apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct) |
14548 apply(auto split: if_splits simp add: trm.inject alpha) |
14548 apply(auto split: if_splits simp add: trm.inject alpha) |
14549 apply(simp add: fresh_atm fresh_prod) |
14549 apply(simp add: fresh_atm fresh_prod) |
14550 apply(rule_tac x="[(coname2,d)]\<bullet>trm2" in exI) |
14550 apply(rule_tac x="[(coname2,d)]\<bullet>trm2" in exI) |
14551 apply(perm_simp) |
14551 apply(perm_simp) |
14552 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
14552 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
14579 lemma crename_AndR': |
14579 lemma crename_AndR': |
14580 assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>a" |
14580 assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>a" |
14581 shows "(\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M') \<or> |
14581 shows "(\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M') \<or> |
14582 (\<exists>M' N'. R = AndR <c>.M' <d>.N' a \<and> b=e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M')" |
14582 (\<exists>M' N'. R = AndR <c>.M' <d>.N' a \<and> b=e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M')" |
14583 using a |
14583 using a |
14584 apply(nominal_induct R avoiding: a b c d e M N rule: trm.induct) |
14584 apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct) |
14585 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14585 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14586 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14586 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14587 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14587 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14588 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14588 apply(auto split: if_splits simp add: trm.inject alpha)[1] |
14589 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha)[1] |
14589 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha)[1] |
14619 |
14619 |
14620 lemma crename_OrR1_aux: |
14620 lemma crename_OrR1_aux: |
14621 assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.M e" |
14621 assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.M e" |
14622 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14622 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14623 using a |
14623 using a |
14624 apply(nominal_induct R avoiding: a b c e M rule: trm.induct) |
14624 apply(nominal_induct R avoiding: a b c e M rule: trm.strong_induct) |
14625 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14625 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14626 done |
14626 done |
14627 |
14627 |
14628 lemma crename_OrR1: |
14628 lemma crename_OrR1: |
14629 assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" |
14629 assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" |
14630 shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" |
14630 shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" |
14631 using a |
14631 using a |
14632 apply(nominal_induct R avoiding: a b c d N rule: trm.induct) |
14632 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) |
14633 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14633 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14634 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14634 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14635 apply(perm_simp) |
14635 apply(perm_simp) |
14636 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14636 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14637 apply(drule sym) |
14637 apply(drule sym) |
14642 lemma crename_OrR1': |
14642 lemma crename_OrR1': |
14643 assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a" |
14643 assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a" |
14644 shows "(\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or> |
14644 shows "(\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or> |
14645 (\<exists>N'. (R = OrR1 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" |
14645 (\<exists>N'. (R = OrR1 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" |
14646 using a |
14646 using a |
14647 apply(nominal_induct R avoiding: a b c d N rule: trm.induct) |
14647 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) |
14648 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14648 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14649 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14649 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14650 apply(perm_simp) |
14650 apply(perm_simp) |
14651 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14651 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14652 apply(drule sym) |
14652 apply(drule sym) |
14662 |
14662 |
14663 lemma crename_OrR2_aux: |
14663 lemma crename_OrR2_aux: |
14664 assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.M e" |
14664 assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.M e" |
14665 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14665 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14666 using a |
14666 using a |
14667 apply(nominal_induct R avoiding: a b c e M rule: trm.induct) |
14667 apply(nominal_induct R avoiding: a b c e M rule: trm.strong_induct) |
14668 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14668 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14669 done |
14669 done |
14670 |
14670 |
14671 lemma crename_OrR2: |
14671 lemma crename_OrR2: |
14672 assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" |
14672 assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" |
14673 shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" |
14673 shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" |
14674 using a |
14674 using a |
14675 apply(nominal_induct R avoiding: a b c d N rule: trm.induct) |
14675 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) |
14676 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14676 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14677 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14677 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14678 apply(perm_simp) |
14678 apply(perm_simp) |
14679 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14679 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14680 apply(drule sym) |
14680 apply(drule sym) |
14685 lemma crename_OrR2': |
14685 lemma crename_OrR2': |
14686 assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a" |
14686 assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a" |
14687 shows "(\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or> |
14687 shows "(\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or> |
14688 (\<exists>N'. (R = OrR2 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" |
14688 (\<exists>N'. (R = OrR2 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" |
14689 using a |
14689 using a |
14690 apply(nominal_induct R avoiding: a b c d N rule: trm.induct) |
14690 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) |
14691 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14691 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14692 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14692 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
14693 apply(perm_simp) |
14693 apply(perm_simp) |
14694 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14694 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14695 apply(drule sym) |
14695 apply(drule sym) |
14705 |
14705 |
14706 lemma crename_OrL: |
14706 lemma crename_OrL: |
14707 assumes a: "R[a\<turnstile>c>b] = OrL (x).M (y).N z" "x\<sharp>(y,z,N,R)" "y\<sharp>(x,z,M,R)" |
14707 assumes a: "R[a\<turnstile>c>b] = OrL (x).M (y).N z" "x\<sharp>(y,z,N,R)" "y\<sharp>(x,z,M,R)" |
14708 shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> x\<sharp>N' \<and> y\<sharp>M'" |
14708 shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> x\<sharp>N' \<and> y\<sharp>M'" |
14709 using a |
14709 using a |
14710 apply(nominal_induct R avoiding: a b x y z M N rule: trm.induct) |
14710 apply(nominal_induct R avoiding: a b x y z M N rule: trm.strong_induct) |
14711 apply(auto split: if_splits simp add: trm.inject alpha) |
14711 apply(auto split: if_splits simp add: trm.inject alpha) |
14712 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI) |
14712 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI) |
14713 apply(perm_simp) |
14713 apply(perm_simp) |
14714 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
14714 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
14715 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI) |
14715 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI) |
14731 |
14731 |
14732 lemma crename_ImpL: |
14732 lemma crename_ImpL: |
14733 assumes a: "R[a\<turnstile>c>b] = ImpL <c>.M (y).N z" "c\<sharp>(a,b,N,R)" "y\<sharp>(z,M,R)" |
14733 assumes a: "R[a\<turnstile>c>b] = ImpL <c>.M (y).N z" "c\<sharp>(a,b,N,R)" "y\<sharp>(z,M,R)" |
14734 shows "\<exists>M' N'. R = ImpL <c>.M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> y\<sharp>M'" |
14734 shows "\<exists>M' N'. R = ImpL <c>.M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> y\<sharp>M'" |
14735 using a |
14735 using a |
14736 apply(nominal_induct R avoiding: a b c y z M N rule: trm.induct) |
14736 apply(nominal_induct R avoiding: a b c y z M N rule: trm.strong_induct) |
14737 apply(auto split: if_splits simp add: trm.inject alpha) |
14737 apply(auto split: if_splits simp add: trm.inject alpha) |
14738 apply(rule_tac x="[(name1,y)]\<bullet>trm2" in exI) |
14738 apply(rule_tac x="[(name1,y)]\<bullet>trm2" in exI) |
14739 apply(perm_simp) |
14739 apply(perm_simp) |
14740 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
14740 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
14741 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
14741 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
14757 |
14757 |
14758 lemma crename_ImpR_aux: |
14758 lemma crename_ImpR_aux: |
14759 assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.M e" |
14759 assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.M e" |
14760 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14760 shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" |
14761 using a |
14761 using a |
14762 apply(nominal_induct R avoiding: x a b c e M rule: trm.induct) |
14762 apply(nominal_induct R avoiding: x a b c e M rule: trm.strong_induct) |
14763 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14763 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
14764 done |
14764 done |
14765 |
14765 |
14766 lemma crename_ImpR: |
14766 lemma crename_ImpR: |
14767 assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" "x\<sharp>R" |
14767 assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" "x\<sharp>R" |
14768 shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N" |
14768 shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N" |
14769 using a |
14769 using a |
14770 apply(nominal_induct R avoiding: a b x c d N rule: trm.induct) |
14770 apply(nominal_induct R avoiding: a b x c d N rule: trm.strong_induct) |
14771 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject) |
14771 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject) |
14772 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
14772 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
14773 apply(perm_simp) |
14773 apply(perm_simp) |
14774 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14774 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
14775 apply(simp add: calc_atm) |
14775 apply(simp add: calc_atm) |
14785 lemma crename_ImpR': |
14785 lemma crename_ImpR': |
14786 assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "x\<sharp>R" "d\<sharp>a" |
14786 assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "x\<sharp>R" "d\<sharp>a" |
14787 shows "(\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or> |
14787 shows "(\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or> |
14788 (\<exists>N'. (R = ImpR (x).<c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" |
14788 (\<exists>N'. (R = ImpR (x).<c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" |
14789 using a |
14789 using a |
14790 apply(nominal_induct R avoiding: x a b c d N rule: trm.induct) |
14790 apply(nominal_induct R avoiding: x a b c d N rule: trm.strong_induct) |
14791 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject abs_perm calc_atm) |
14791 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject abs_perm calc_atm) |
14792 apply(rule_tac x="[(name,x)]\<bullet>[(coname1,c)]\<bullet>trm" in exI) |
14792 apply(rule_tac x="[(name,x)]\<bullet>[(coname1,c)]\<bullet>trm" in exI) |
14793 apply(perm_simp) |
14793 apply(perm_simp) |
14794 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod abs_supp fin_supp) |
14794 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod abs_supp fin_supp) |
14795 apply(drule sym) |
14795 apply(drule sym) |
14807 |
14807 |
14808 lemma crename_ax2: |
14808 lemma crename_ax2: |
14809 assumes a: "N[a\<turnstile>c>b] = Ax x c" |
14809 assumes a: "N[a\<turnstile>c>b] = Ax x c" |
14810 shows "\<exists>d. N = Ax x d" |
14810 shows "\<exists>d. N = Ax x d" |
14811 using a |
14811 using a |
14812 apply(nominal_induct N avoiding: a b rule: trm.induct) |
14812 apply(nominal_induct N avoiding: a b rule: trm.strong_induct) |
14813 apply(auto split: if_splits) |
14813 apply(auto split: if_splits) |
14814 apply(simp add: trm.inject) |
14814 apply(simp add: trm.inject) |
14815 done |
14815 done |
14816 |
14816 |
14817 lemma crename_interesting1: |
14817 lemma crename_interesting1: |
14818 assumes a: "distinct [a,b,c]" |
14818 assumes a: "distinct [a,b,c]" |
14819 shows "M[a\<turnstile>c>c][c\<turnstile>c>b] = M[c\<turnstile>c>b][a\<turnstile>c>b]" |
14819 shows "M[a\<turnstile>c>c][c\<turnstile>c>b] = M[c\<turnstile>c>b][a\<turnstile>c>b]" |
14820 using a |
14820 using a |
14821 apply(nominal_induct M avoiding: a c b rule: trm.induct) |
14821 apply(nominal_induct M avoiding: a c b rule: trm.strong_induct) |
14822 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
14822 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
14823 apply(blast) |
14823 apply(blast) |
14824 apply(rotate_tac 12) |
14824 apply(rotate_tac 12) |
14825 apply(drule_tac x="a" in meta_spec) |
14825 apply(drule_tac x="a" in meta_spec) |
14826 apply(rotate_tac 15) |
14826 apply(rotate_tac 15) |
14834 |
14834 |
14835 lemma crename_interesting2: |
14835 lemma crename_interesting2: |
14836 assumes a: "a\<noteq>c" "a\<noteq>d" "a\<noteq>b" "c\<noteq>d" "b\<noteq>c" |
14836 assumes a: "a\<noteq>c" "a\<noteq>d" "a\<noteq>b" "c\<noteq>d" "b\<noteq>c" |
14837 shows "M[a\<turnstile>c>b][c\<turnstile>c>d] = M[c\<turnstile>c>d][a\<turnstile>c>b]" |
14837 shows "M[a\<turnstile>c>b][c\<turnstile>c>d] = M[c\<turnstile>c>d][a\<turnstile>c>b]" |
14838 using a |
14838 using a |
14839 apply(nominal_induct M avoiding: a c b d rule: trm.induct) |
14839 apply(nominal_induct M avoiding: a c b d rule: trm.strong_induct) |
14840 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
14840 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
14841 done |
14841 done |
14842 |
14842 |
14843 lemma crename_interesting3: |
14843 lemma crename_interesting3: |
14844 shows "M[a\<turnstile>c>c][x\<turnstile>n>y] = M[x\<turnstile>n>y][a\<turnstile>c>c]" |
14844 shows "M[a\<turnstile>c>c][x\<turnstile>n>y] = M[x\<turnstile>n>y][a\<turnstile>c>c]" |
14845 apply(nominal_induct M avoiding: a c x y rule: trm.induct) |
14845 apply(nominal_induct M avoiding: a c x y rule: trm.strong_induct) |
14846 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
14846 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
14847 done |
14847 done |
14848 |
14848 |
14849 lemma crename_credu: |
14849 lemma crename_credu: |
14850 assumes a: "(M[a\<turnstile>c>b]) \<longrightarrow>\<^isub>c M'" |
14850 assumes a: "(M[a\<turnstile>c>b]) \<longrightarrow>\<^isub>c M'" |
15450 |
15450 |
15451 lemma nrename_interesting1: |
15451 lemma nrename_interesting1: |
15452 assumes a: "distinct [x,y,z]" |
15452 assumes a: "distinct [x,y,z]" |
15453 shows "M[x\<turnstile>n>z][z\<turnstile>n>y] = M[z\<turnstile>n>y][x\<turnstile>n>y]" |
15453 shows "M[x\<turnstile>n>z][z\<turnstile>n>y] = M[z\<turnstile>n>y][x\<turnstile>n>y]" |
15454 using a |
15454 using a |
15455 apply(nominal_induct M avoiding: x y z rule: trm.induct) |
15455 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) |
15456 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
15456 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
15457 apply(blast) |
15457 apply(blast) |
15458 apply(blast) |
15458 apply(blast) |
15459 apply(rotate_tac 12) |
15459 apply(rotate_tac 12) |
15460 apply(drule_tac x="x" in meta_spec) |
15460 apply(drule_tac x="x" in meta_spec) |
15474 |
15474 |
15475 lemma nrename_interesting2: |
15475 lemma nrename_interesting2: |
15476 assumes a: "x\<noteq>z" "x\<noteq>u" "x\<noteq>y" "z\<noteq>u" "y\<noteq>z" |
15476 assumes a: "x\<noteq>z" "x\<noteq>u" "x\<noteq>y" "z\<noteq>u" "y\<noteq>z" |
15477 shows "M[x\<turnstile>n>y][z\<turnstile>n>u] = M[z\<turnstile>n>u][x\<turnstile>n>y]" |
15477 shows "M[x\<turnstile>n>y][z\<turnstile>n>u] = M[z\<turnstile>n>u][x\<turnstile>n>y]" |
15478 using a |
15478 using a |
15479 apply(nominal_induct M avoiding: x y z u rule: trm.induct) |
15479 apply(nominal_induct M avoiding: x y z u rule: trm.strong_induct) |
15480 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
15480 apply(auto simp add: rename_fresh simp add: trm.inject alpha) |
15481 done |
15481 done |
15482 |
15482 |
15483 lemma not_fic_nrename_aux: |
15483 lemma not_fic_nrename_aux: |
15484 assumes a: "fic M c" |
15484 assumes a: "fic M c" |
15485 shows "fic (M[x\<turnstile>n>y]) c" |
15485 shows "fic (M[x\<turnstile>n>y]) c" |
15486 using a |
15486 using a |
15487 apply(nominal_induct M avoiding: c x y rule: trm.induct) |
15487 apply(nominal_induct M avoiding: c x y rule: trm.strong_induct) |
15488 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) |
15488 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) |
15489 done |
15489 done |
15490 |
15490 |
15491 lemma not_fic_nrename: |
15491 lemma not_fic_nrename: |
15492 assumes a: "\<not>(fic (M[x\<turnstile>n>y]) c)" |
15492 assumes a: "\<not>(fic (M[x\<turnstile>n>y]) c)" |
15497 |
15497 |
15498 lemma fin_nrename: |
15498 lemma fin_nrename: |
15499 assumes a: "fin M z" "z\<sharp>(x,y)" |
15499 assumes a: "fin M z" "z\<sharp>(x,y)" |
15500 shows "fin (M[x\<turnstile>n>y]) z" |
15500 shows "fin (M[x\<turnstile>n>y]) z" |
15501 using a |
15501 using a |
15502 apply(nominal_induct M avoiding: x y z rule: trm.induct) |
15502 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) |
15503 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
15503 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
15504 split: if_splits) |
15504 split: if_splits) |
15505 done |
15505 done |
15506 |
15506 |
15507 lemma nrename_fresh_interesting1: |
15507 lemma nrename_fresh_interesting1: |
15508 fixes z::"name" |
15508 fixes z::"name" |
15509 assumes a: "z\<sharp>(M[x\<turnstile>n>y])" "z\<sharp>(x,y)" |
15509 assumes a: "z\<sharp>(M[x\<turnstile>n>y])" "z\<sharp>(x,y)" |
15510 shows "z\<sharp>M" |
15510 shows "z\<sharp>M" |
15511 using a |
15511 using a |
15512 apply(nominal_induct M avoiding: x y z rule: trm.induct) |
15512 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) |
15513 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp) |
15513 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp) |
15514 done |
15514 done |
15515 |
15515 |
15516 lemma nrename_fresh_interesting2: |
15516 lemma nrename_fresh_interesting2: |
15517 fixes c::"coname" |
15517 fixes c::"coname" |
15518 assumes a: "c\<sharp>(M[x\<turnstile>n>y])" |
15518 assumes a: "c\<sharp>(M[x\<turnstile>n>y])" |
15519 shows "c\<sharp>M" |
15519 shows "c\<sharp>M" |
15520 using a |
15520 using a |
15521 apply(nominal_induct M avoiding: x y c rule: trm.induct) |
15521 apply(nominal_induct M avoiding: x y c rule: trm.strong_induct) |
15522 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm) |
15522 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm) |
15523 done |
15523 done |
15524 |
15524 |
15525 lemma fin_nrename2: |
15525 lemma fin_nrename2: |
15526 assumes a: "fin (M[x\<turnstile>n>y]) z" "z\<sharp>(x,y)" |
15526 assumes a: "fin (M[x\<turnstile>n>y]) z" "z\<sharp>(x,y)" |
15527 shows "fin M z" |
15527 shows "fin M z" |
15528 using a |
15528 using a |
15529 apply(nominal_induct M avoiding: x y z rule: trm.induct) |
15529 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) |
15530 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
15530 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
15531 split: if_splits) |
15531 split: if_splits) |
15532 apply(auto dest: nrename_fresh_interesting1 simp add: fresh_atm fresh_prod) |
15532 apply(auto dest: nrename_fresh_interesting1 simp add: fresh_atm fresh_prod) |
15533 done |
15533 done |
15534 |
15534 |
15535 lemma nrename_Cut: |
15535 lemma nrename_Cut: |
15536 assumes a: "R[x\<turnstile>n>y] = Cut <c>.M (z).N" "c\<sharp>(N,R)" "z\<sharp>(x,y,M,R)" |
15536 assumes a: "R[x\<turnstile>n>y] = Cut <c>.M (z).N" "c\<sharp>(N,R)" "z\<sharp>(x,y,M,R)" |
15537 shows "\<exists>M' N'. R = Cut <c>.M' (z).N' \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> z\<sharp>M'" |
15537 shows "\<exists>M' N'. R = Cut <c>.M' (z).N' \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> z\<sharp>M'" |
15538 using a |
15538 using a |
15539 apply(nominal_induct R avoiding: c y x z M N rule: trm.induct) |
15539 apply(nominal_induct R avoiding: c y x z M N rule: trm.strong_induct) |
15540 apply(auto split: if_splits) |
15540 apply(auto split: if_splits) |
15541 apply(simp add: trm.inject) |
15541 apply(simp add: trm.inject) |
15542 apply(auto simp add: alpha fresh_atm) |
15542 apply(auto simp add: alpha fresh_atm) |
15543 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
15543 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
15544 apply(perm_simp) |
15544 apply(perm_simp) |
15559 |
15559 |
15560 lemma nrename_NotR: |
15560 lemma nrename_NotR: |
15561 assumes a: "R[x\<turnstile>n>y] = NotR (z).N c" "z\<sharp>(R,x,y)" |
15561 assumes a: "R[x\<turnstile>n>y] = NotR (z).N c" "z\<sharp>(R,x,y)" |
15562 shows "\<exists>N'. (R = NotR (z).N' c) \<and> N'[x\<turnstile>n>y] = N" |
15562 shows "\<exists>N'. (R = NotR (z).N' c) \<and> N'[x\<turnstile>n>y] = N" |
15563 using a |
15563 using a |
15564 apply(nominal_induct R avoiding: x y c z N rule: trm.induct) |
15564 apply(nominal_induct R avoiding: x y c z N rule: trm.strong_induct) |
15565 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15565 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15566 apply(rule_tac x="[(name,z)]\<bullet>trm" in exI) |
15566 apply(rule_tac x="[(name,z)]\<bullet>trm" in exI) |
15567 apply(perm_simp) |
15567 apply(perm_simp) |
15568 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15568 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15569 apply(drule sym) |
15569 apply(drule sym) |
15573 |
15573 |
15574 lemma nrename_NotL: |
15574 lemma nrename_NotL: |
15575 assumes a: "R[x\<turnstile>n>y] = NotL <c>.N z" "c\<sharp>R" "z\<sharp>(x,y)" |
15575 assumes a: "R[x\<turnstile>n>y] = NotL <c>.N z" "c\<sharp>R" "z\<sharp>(x,y)" |
15576 shows "\<exists>N'. (R = NotL <c>.N' z) \<and> N'[x\<turnstile>n>y] = N" |
15576 shows "\<exists>N'. (R = NotL <c>.N' z) \<and> N'[x\<turnstile>n>y] = N" |
15577 using a |
15577 using a |
15578 apply(nominal_induct R avoiding: x y c z N rule: trm.induct) |
15578 apply(nominal_induct R avoiding: x y c z N rule: trm.strong_induct) |
15579 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15579 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15580 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI) |
15580 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI) |
15581 apply(perm_simp) |
15581 apply(perm_simp) |
15582 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15582 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15583 apply(drule sym) |
15583 apply(drule sym) |
15587 |
15587 |
15588 lemma nrename_NotL': |
15588 lemma nrename_NotL': |
15589 assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" "c\<sharp>R" "x\<noteq>y" |
15589 assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" "c\<sharp>R" "x\<noteq>y" |
15590 shows "(\<exists>N'. (R = NotL <c>.N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = NotL <c>.N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)" |
15590 shows "(\<exists>N'. (R = NotL <c>.N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = NotL <c>.N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)" |
15591 using a |
15591 using a |
15592 apply(nominal_induct R avoiding: y u c x N rule: trm.induct) |
15592 apply(nominal_induct R avoiding: y u c x N rule: trm.strong_induct) |
15593 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15593 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15594 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI) |
15594 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI) |
15595 apply(perm_simp) |
15595 apply(perm_simp) |
15596 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15596 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15597 apply(drule sym) |
15597 apply(drule sym) |
15607 |
15607 |
15608 lemma nrename_NotL_aux: |
15608 lemma nrename_NotL_aux: |
15609 assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" |
15609 assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" |
15610 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15610 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15611 using a |
15611 using a |
15612 apply(nominal_induct R avoiding: y u c x N rule: trm.induct) |
15612 apply(nominal_induct R avoiding: y u c x N rule: trm.strong_induct) |
15613 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15613 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15614 done |
15614 done |
15615 |
15615 |
15616 lemma nrename_AndL1: |
15616 lemma nrename_AndL1: |
15617 assumes a: "R[x\<turnstile>n>y] = AndL1 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)" |
15617 assumes a: "R[x\<turnstile>n>y] = AndL1 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)" |
15618 shows "\<exists>N'. (R = AndL1 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" |
15618 shows "\<exists>N'. (R = AndL1 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" |
15619 using a |
15619 using a |
15620 apply(nominal_induct R avoiding: z u x y N rule: trm.induct) |
15620 apply(nominal_induct R avoiding: z u x y N rule: trm.strong_induct) |
15621 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15621 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15622 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI) |
15622 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI) |
15623 apply(perm_simp) |
15623 apply(perm_simp) |
15624 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15624 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15625 apply(drule sym) |
15625 apply(drule sym) |
15629 |
15629 |
15630 lemma nrename_AndL1': |
15630 lemma nrename_AndL1': |
15631 assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" |
15631 assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" |
15632 shows "(\<exists>N'. (R = AndL1 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL1 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)" |
15632 shows "(\<exists>N'. (R = AndL1 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL1 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)" |
15633 using a |
15633 using a |
15634 apply(nominal_induct R avoiding: y u v x N rule: trm.induct) |
15634 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) |
15635 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15635 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15636 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI) |
15636 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI) |
15637 apply(perm_simp) |
15637 apply(perm_simp) |
15638 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15638 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15639 apply(drule sym) |
15639 apply(drule sym) |
15649 |
15649 |
15650 lemma nrename_AndL1_aux: |
15650 lemma nrename_AndL1_aux: |
15651 assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" |
15651 assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" |
15652 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15652 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15653 using a |
15653 using a |
15654 apply(nominal_induct R avoiding: y u v x N rule: trm.induct) |
15654 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) |
15655 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15655 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15656 done |
15656 done |
15657 |
15657 |
15658 lemma nrename_AndL2: |
15658 lemma nrename_AndL2: |
15659 assumes a: "R[x\<turnstile>n>y] = AndL2 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)" |
15659 assumes a: "R[x\<turnstile>n>y] = AndL2 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)" |
15660 shows "\<exists>N'. (R = AndL2 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" |
15660 shows "\<exists>N'. (R = AndL2 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" |
15661 using a |
15661 using a |
15662 apply(nominal_induct R avoiding: z u x y N rule: trm.induct) |
15662 apply(nominal_induct R avoiding: z u x y N rule: trm.strong_induct) |
15663 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15663 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15664 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI) |
15664 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI) |
15665 apply(perm_simp) |
15665 apply(perm_simp) |
15666 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15666 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15667 apply(drule sym) |
15667 apply(drule sym) |
15671 |
15671 |
15672 lemma nrename_AndL2': |
15672 lemma nrename_AndL2': |
15673 assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" |
15673 assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" |
15674 shows "(\<exists>N'. (R = AndL2 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL2 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)" |
15674 shows "(\<exists>N'. (R = AndL2 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL2 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)" |
15675 using a |
15675 using a |
15676 apply(nominal_induct R avoiding: y u v x N rule: trm.induct) |
15676 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) |
15677 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15677 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15678 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI) |
15678 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI) |
15679 apply(perm_simp) |
15679 apply(perm_simp) |
15680 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15680 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15681 apply(drule sym) |
15681 apply(drule sym) |
15691 |
15691 |
15692 lemma nrename_AndL2_aux: |
15692 lemma nrename_AndL2_aux: |
15693 assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" |
15693 assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" |
15694 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15694 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15695 using a |
15695 using a |
15696 apply(nominal_induct R avoiding: y u v x N rule: trm.induct) |
15696 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) |
15697 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15697 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15698 done |
15698 done |
15699 |
15699 |
15700 lemma nrename_AndR: |
15700 lemma nrename_AndR: |
15701 assumes a: "R[x\<turnstile>n>y] = AndR <c>.M <d>.N e" "c\<sharp>(d,e,N,R)" "d\<sharp>(c,e,M,R)" |
15701 assumes a: "R[x\<turnstile>n>y] = AndR <c>.M <d>.N e" "c\<sharp>(d,e,N,R)" "d\<sharp>(c,e,M,R)" |
15702 shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> d\<sharp>M'" |
15702 shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> d\<sharp>M'" |
15703 using a |
15703 using a |
15704 apply(nominal_induct R avoiding: x y c d e M N rule: trm.induct) |
15704 apply(nominal_induct R avoiding: x y c d e M N rule: trm.strong_induct) |
15705 apply(auto split: if_splits simp add: trm.inject alpha) |
15705 apply(auto split: if_splits simp add: trm.inject alpha) |
15706 apply(simp add: fresh_atm fresh_prod) |
15706 apply(simp add: fresh_atm fresh_prod) |
15707 apply(rule_tac x="[(coname1,c)]\<bullet>trm1" in exI) |
15707 apply(rule_tac x="[(coname1,c)]\<bullet>trm1" in exI) |
15708 apply(perm_simp) |
15708 apply(perm_simp) |
15709 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
15709 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
15723 |
15723 |
15724 lemma nrename_OrR1: |
15724 lemma nrename_OrR1: |
15725 assumes a: "R[x\<turnstile>n>y] = OrR1 <c>.N d" "c\<sharp>(R,d)" |
15725 assumes a: "R[x\<turnstile>n>y] = OrR1 <c>.N d" "c\<sharp>(R,d)" |
15726 shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" |
15726 shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" |
15727 using a |
15727 using a |
15728 apply(nominal_induct R avoiding: x y c d N rule: trm.induct) |
15728 apply(nominal_induct R avoiding: x y c d N rule: trm.strong_induct) |
15729 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15729 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15730 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
15730 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
15731 apply(perm_simp) |
15731 apply(perm_simp) |
15732 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15732 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15733 apply(drule sym) |
15733 apply(drule sym) |
15737 |
15737 |
15738 lemma nrename_OrR2: |
15738 lemma nrename_OrR2: |
15739 assumes a: "R[x\<turnstile>n>y] = OrR2 <c>.N d" "c\<sharp>(R,d)" |
15739 assumes a: "R[x\<turnstile>n>y] = OrR2 <c>.N d" "c\<sharp>(R,d)" |
15740 shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" |
15740 shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" |
15741 using a |
15741 using a |
15742 apply(nominal_induct R avoiding: x y c d N rule: trm.induct) |
15742 apply(nominal_induct R avoiding: x y c d N rule: trm.strong_induct) |
15743 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15743 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15744 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
15744 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI) |
15745 apply(perm_simp) |
15745 apply(perm_simp) |
15746 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15746 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15747 apply(drule sym) |
15747 apply(drule sym) |
15751 |
15751 |
15752 lemma nrename_OrL: |
15752 lemma nrename_OrL: |
15753 assumes a: "R[u\<turnstile>n>v] = OrL (x).M (y).N z" "x\<sharp>(y,z,u,v,N,R)" "y\<sharp>(x,z,u,v,M,R)" "z\<sharp>(u,v)" |
15753 assumes a: "R[u\<turnstile>n>v] = OrL (x).M (y).N z" "x\<sharp>(y,z,u,v,N,R)" "y\<sharp>(x,z,u,v,M,R)" "z\<sharp>(u,v)" |
15754 shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[u\<turnstile>n>v] = M \<and> N'[u\<turnstile>n>v] = N \<and> x\<sharp>N' \<and> y\<sharp>M'" |
15754 shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[u\<turnstile>n>v] = M \<and> N'[u\<turnstile>n>v] = N \<and> x\<sharp>N' \<and> y\<sharp>M'" |
15755 using a |
15755 using a |
15756 apply(nominal_induct R avoiding: u v x y z M N rule: trm.induct) |
15756 apply(nominal_induct R avoiding: u v x y z M N rule: trm.strong_induct) |
15757 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm) |
15757 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm) |
15758 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI) |
15758 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI) |
15759 apply(perm_simp) |
15759 apply(perm_simp) |
15760 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
15760 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
15761 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI) |
15761 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI) |
15772 lemma nrename_OrL': |
15772 lemma nrename_OrL': |
15773 assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" "v\<sharp>(R,N,u,x,y)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" |
15773 assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" "v\<sharp>(R,N,u,x,y)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" |
15774 shows "(\<exists>M' N'. (R = OrL (v).M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> |
15774 shows "(\<exists>M' N'. (R = OrL (v).M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> |
15775 (\<exists>M' N'. (R = OrL (v).M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)" |
15775 (\<exists>M' N'. (R = OrL (v).M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)" |
15776 using a |
15776 using a |
15777 apply(nominal_induct R avoiding: y x u v w M N rule: trm.induct) |
15777 apply(nominal_induct R avoiding: y x u v w M N rule: trm.strong_induct) |
15778 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15778 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15779 apply(rule_tac x="[(name1,v)]\<bullet>trm1" in exI) |
15779 apply(rule_tac x="[(name1,v)]\<bullet>trm1" in exI) |
15780 apply(perm_simp) |
15780 apply(perm_simp) |
15781 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15781 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15782 apply(rule_tac x="[(name2,w)]\<bullet>trm2" in exI) |
15782 apply(rule_tac x="[(name2,w)]\<bullet>trm2" in exI) |
15806 |
15806 |
15807 lemma nrename_OrL_aux: |
15807 lemma nrename_OrL_aux: |
15808 assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" |
15808 assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" |
15809 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15809 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15810 using a |
15810 using a |
15811 apply(nominal_induct R avoiding: y x w u v M N rule: trm.induct) |
15811 apply(nominal_induct R avoiding: y x w u v M N rule: trm.strong_induct) |
15812 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15812 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15813 done |
15813 done |
15814 |
15814 |
15815 lemma nrename_ImpL: |
15815 lemma nrename_ImpL: |
15816 assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (u).N z" "c\<sharp>(N,R)" "u\<sharp>(y,x,z,M,R)" "z\<sharp>(x,y)" |
15816 assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (u).N z" "c\<sharp>(N,R)" "u\<sharp>(y,x,z,M,R)" "z\<sharp>(x,y)" |
15817 shows "\<exists>M' N'. R = ImpL <c>.M' (u).N' z \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> u\<sharp>M'" |
15817 shows "\<exists>M' N'. R = ImpL <c>.M' (u).N' z \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> u\<sharp>M'" |
15818 using a |
15818 using a |
15819 apply(nominal_induct R avoiding: u x c y z M N rule: trm.induct) |
15819 apply(nominal_induct R avoiding: u x c y z M N rule: trm.strong_induct) |
15820 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm) |
15820 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm) |
15821 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
15821 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
15822 apply(perm_simp) |
15822 apply(perm_simp) |
15823 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
15823 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] |
15824 apply(rule_tac x="[(name1,u)]\<bullet>trm2" in exI) |
15824 apply(rule_tac x="[(name1,u)]\<bullet>trm2" in exI) |
15835 lemma nrename_ImpL': |
15835 lemma nrename_ImpL': |
15836 assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" "c\<sharp>(R,N)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" |
15836 assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" "c\<sharp>(R,N)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" |
15837 shows "(\<exists>M' N'. (R = ImpL <c>.M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> |
15837 shows "(\<exists>M' N'. (R = ImpL <c>.M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> |
15838 (\<exists>M' N'. (R = ImpL <c>.M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)" |
15838 (\<exists>M' N'. (R = ImpL <c>.M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)" |
15839 using a |
15839 using a |
15840 apply(nominal_induct R avoiding: y x u c w M N rule: trm.induct) |
15840 apply(nominal_induct R avoiding: y x u c w M N rule: trm.strong_induct) |
15841 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15841 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) |
15842 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
15842 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI) |
15843 apply(perm_simp) |
15843 apply(perm_simp) |
15844 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15844 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15845 apply(rule_tac x="[(name1,w)]\<bullet>trm2" in exI) |
15845 apply(rule_tac x="[(name1,w)]\<bullet>trm2" in exI) |
15869 |
15869 |
15870 lemma nrename_ImpL_aux: |
15870 lemma nrename_ImpL_aux: |
15871 assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" |
15871 assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" |
15872 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15872 shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" |
15873 using a |
15873 using a |
15874 apply(nominal_induct R avoiding: y x w u c M N rule: trm.induct) |
15874 apply(nominal_induct R avoiding: y x w u c M N rule: trm.strong_induct) |
15875 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15875 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) |
15876 done |
15876 done |
15877 |
15877 |
15878 lemma nrename_ImpR: |
15878 lemma nrename_ImpR: |
15879 assumes a: "R[u\<turnstile>n>v] = ImpR (x).<c>.N d" "c\<sharp>(R,d)" "x\<sharp>(R,u,v)" |
15879 assumes a: "R[u\<turnstile>n>v] = ImpR (x).<c>.N d" "c\<sharp>(R,d)" "x\<sharp>(R,u,v)" |
15880 shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[u\<turnstile>n>v] = N" |
15880 shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[u\<turnstile>n>v] = N" |
15881 using a |
15881 using a |
15882 apply(nominal_induct R avoiding: u v x c d N rule: trm.induct) |
15882 apply(nominal_induct R avoiding: u v x c d N rule: trm.strong_induct) |
15883 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject) |
15883 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject) |
15884 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
15884 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI) |
15885 apply(perm_simp) |
15885 apply(perm_simp) |
15886 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15886 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) |
15887 apply(simp add: calc_atm) |
15887 apply(simp add: calc_atm) |
15927 |
15927 |
15928 lemma nrename_ax2: |
15928 lemma nrename_ax2: |
15929 assumes a: "N[x\<turnstile>n>y] = Ax z c" |
15929 assumes a: "N[x\<turnstile>n>y] = Ax z c" |
15930 shows "\<exists>z. N = Ax z c" |
15930 shows "\<exists>z. N = Ax z c" |
15931 using a |
15931 using a |
15932 apply(nominal_induct N avoiding: x y rule: trm.induct) |
15932 apply(nominal_induct N avoiding: x y rule: trm.strong_induct) |
15933 apply(auto split: if_splits) |
15933 apply(auto split: if_splits) |
15934 apply(simp add: trm.inject) |
15934 apply(simp add: trm.inject) |
15935 done |
15935 done |
15936 |
15936 |
15937 lemma fic_nrename: |
15937 lemma fic_nrename: |
15938 assumes a: "fic (M[x\<turnstile>n>y]) c" |
15938 assumes a: "fic (M[x\<turnstile>n>y]) c" |
15939 shows "fic M c" |
15939 shows "fic M c" |
15940 using a |
15940 using a |
15941 apply(nominal_induct M avoiding: c x y rule: trm.induct) |
15941 apply(nominal_induct M avoiding: c x y rule: trm.strong_induct) |
15942 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
15942 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh |
15943 split: if_splits) |
15943 split: if_splits) |
15944 apply(auto dest: nrename_fresh_interesting2 simp add: fresh_prod fresh_atm) |
15944 apply(auto dest: nrename_fresh_interesting2 simp add: fresh_prod fresh_atm) |
15945 done |
15945 done |
15946 |
15946 |
17863 fixes pi1::"name prm" |
17863 fixes pi1::"name prm" |
17864 and pi2::"coname prm" |
17864 and pi2::"coname prm" |
17865 shows "(pi1\<bullet>(stn M \<theta>n)) = stn (pi1\<bullet>M) (pi1\<bullet>\<theta>n)" |
17865 shows "(pi1\<bullet>(stn M \<theta>n)) = stn (pi1\<bullet>M) (pi1\<bullet>\<theta>n)" |
17866 and "(pi2\<bullet>(stn M \<theta>n)) = stn (pi2\<bullet>M) (pi2\<bullet>\<theta>n)" |
17866 and "(pi2\<bullet>(stn M \<theta>n)) = stn (pi2\<bullet>M) (pi2\<bullet>\<theta>n)" |
17867 apply - |
17867 apply - |
17868 apply(nominal_induct M avoiding: \<theta>n rule: trm.induct) |
17868 apply(nominal_induct M avoiding: \<theta>n rule: trm.strong_induct) |
17869 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17869 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17870 apply(nominal_induct M avoiding: \<theta>n rule: trm.induct) |
17870 apply(nominal_induct M avoiding: \<theta>n rule: trm.strong_induct) |
17871 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17871 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17872 done |
17872 done |
17873 |
17873 |
17874 lemma stc_eqvt[eqvt]: |
17874 lemma stc_eqvt[eqvt]: |
17875 fixes pi1::"name prm" |
17875 fixes pi1::"name prm" |
17876 and pi2::"coname prm" |
17876 and pi2::"coname prm" |
17877 shows "(pi1\<bullet>(stc M \<theta>c)) = stc (pi1\<bullet>M) (pi1\<bullet>\<theta>c)" |
17877 shows "(pi1\<bullet>(stc M \<theta>c)) = stc (pi1\<bullet>M) (pi1\<bullet>\<theta>c)" |
17878 and "(pi2\<bullet>(stc M \<theta>c)) = stc (pi2\<bullet>M) (pi2\<bullet>\<theta>c)" |
17878 and "(pi2\<bullet>(stc M \<theta>c)) = stc (pi2\<bullet>M) (pi2\<bullet>\<theta>c)" |
17879 apply - |
17879 apply - |
17880 apply(nominal_induct M avoiding: \<theta>c rule: trm.induct) |
17880 apply(nominal_induct M avoiding: \<theta>c rule: trm.strong_induct) |
17881 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17881 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17882 apply(nominal_induct M avoiding: \<theta>c rule: trm.induct) |
17882 apply(nominal_induct M avoiding: \<theta>c rule: trm.strong_induct) |
17883 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17883 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) |
17884 done |
17884 done |
17885 |
17885 |
17886 lemma stn_fresh: |
17886 lemma stn_fresh: |
17887 fixes a::"coname" |
17887 fixes a::"coname" |
17888 and x::"name" |
17888 and x::"name" |
17889 shows "a\<sharp>(\<theta>n,M) \<Longrightarrow> a\<sharp>stn M \<theta>n" |
17889 shows "a\<sharp>(\<theta>n,M) \<Longrightarrow> a\<sharp>stn M \<theta>n" |
17890 and "x\<sharp>(\<theta>n,M) \<Longrightarrow> x\<sharp>stn M \<theta>n" |
17890 and "x\<sharp>(\<theta>n,M) \<Longrightarrow> x\<sharp>stn M \<theta>n" |
17891 apply(nominal_induct M avoiding: \<theta>n a x rule: trm.induct) |
17891 apply(nominal_induct M avoiding: \<theta>n a x rule: trm.strong_induct) |
17892 apply(auto simp add: abs_fresh fresh_prod fresh_atm) |
17892 apply(auto simp add: abs_fresh fresh_prod fresh_atm) |
17893 apply(rule lookupc_freshness) |
17893 apply(rule lookupc_freshness) |
17894 apply(simp add: fresh_atm) |
17894 apply(simp add: fresh_atm) |
17895 apply(rule lookupc_freshness) |
17895 apply(rule lookupc_freshness) |
17896 apply(simp add: fresh_atm) |
17896 apply(simp add: fresh_atm) |
17899 lemma stc_fresh: |
17899 lemma stc_fresh: |
17900 fixes a::"coname" |
17900 fixes a::"coname" |
17901 and x::"name" |
17901 and x::"name" |
17902 shows "a\<sharp>(\<theta>c,M) \<Longrightarrow> a\<sharp>stc M \<theta>c" |
17902 shows "a\<sharp>(\<theta>c,M) \<Longrightarrow> a\<sharp>stc M \<theta>c" |
17903 and "x\<sharp>(\<theta>c,M) \<Longrightarrow> x\<sharp>stc M \<theta>c" |
17903 and "x\<sharp>(\<theta>c,M) \<Longrightarrow> x\<sharp>stc M \<theta>c" |
17904 apply(nominal_induct M avoiding: \<theta>c a x rule: trm.induct) |
17904 apply(nominal_induct M avoiding: \<theta>c a x rule: trm.strong_induct) |
17905 apply(auto simp add: abs_fresh fresh_prod fresh_atm) |
17905 apply(auto simp add: abs_fresh fresh_prod fresh_atm) |
17906 apply(rule lookupd_freshness) |
17906 apply(rule lookupd_freshness) |
17907 apply(simp add: fresh_atm) |
17907 apply(simp add: fresh_atm) |
17908 apply(rule lookupd_freshness) |
17908 apply(rule lookupd_freshness) |
17909 apply(simp add: fresh_atm) |
17909 apply(simp add: fresh_atm) |
18126 lemma psubst_eqvt[eqvt]: |
18126 lemma psubst_eqvt[eqvt]: |
18127 fixes pi1::"name prm" |
18127 fixes pi1::"name prm" |
18128 and pi2::"coname prm" |
18128 and pi2::"coname prm" |
18129 shows "pi1\<bullet>(\<theta>n,\<theta>c<M>) = (pi1\<bullet>\<theta>n),(pi1\<bullet>\<theta>c)<(pi1\<bullet>M)>" |
18129 shows "pi1\<bullet>(\<theta>n,\<theta>c<M>) = (pi1\<bullet>\<theta>n),(pi1\<bullet>\<theta>c)<(pi1\<bullet>M)>" |
18130 and "pi2\<bullet>(\<theta>n,\<theta>c<M>) = (pi2\<bullet>\<theta>n),(pi2\<bullet>\<theta>c)<(pi2\<bullet>M)>" |
18130 and "pi2\<bullet>(\<theta>n,\<theta>c<M>) = (pi2\<bullet>\<theta>n),(pi2\<bullet>\<theta>c)<(pi2\<bullet>M)>" |
18131 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.induct) |
18131 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.strong_induct) |
18132 apply(auto simp add: eq_bij fresh_bij eqvts perm_pi_simp) |
18132 apply(auto simp add: eq_bij fresh_bij eqvts perm_pi_simp) |
18133 apply(rule case_cong) |
18133 apply(rule case_cong) |
18134 apply(rule find_maps) |
18134 apply(rule find_maps) |
18135 apply(simp) |
18135 apply(simp) |
18136 apply(perm_simp add: eqvts) |
18136 apply(perm_simp add: eqvts) |
18215 lemma ax_psubst: |
18215 lemma ax_psubst: |
18216 assumes a: "\<theta>n,\<theta>c<M> = Ax x a" |
18216 assumes a: "\<theta>n,\<theta>c<M> = Ax x a" |
18217 and b: "a\<sharp>(\<theta>n,\<theta>c)" "x\<sharp>(\<theta>n,\<theta>c)" |
18217 and b: "a\<sharp>(\<theta>n,\<theta>c)" "x\<sharp>(\<theta>n,\<theta>c)" |
18218 shows "M = Ax x a" |
18218 shows "M = Ax x a" |
18219 using a b |
18219 using a b |
18220 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.induct) |
18220 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.strong_induct) |
18221 apply(auto) |
18221 apply(auto) |
18222 apply(drule lookup_unicity) |
18222 apply(drule lookup_unicity) |
18223 apply(simp)+ |
18223 apply(simp)+ |
18224 apply(case_tac "findc \<theta>c coname") |
18224 apply(case_tac "findc \<theta>c coname") |
18225 apply(simp) |
18225 apply(simp) |
18406 lemma psubst_fresh_name: |
18406 lemma psubst_fresh_name: |
18407 fixes x::"name" |
18407 fixes x::"name" |
18408 assumes a: "x\<sharp>\<theta>n" "x\<sharp>\<theta>c" "x\<sharp>M" |
18408 assumes a: "x\<sharp>\<theta>n" "x\<sharp>\<theta>c" "x\<sharp>M" |
18409 shows "x\<sharp>\<theta>n,\<theta>c<M>" |
18409 shows "x\<sharp>\<theta>n,\<theta>c<M>" |
18410 using a |
18410 using a |
18411 apply(nominal_induct M avoiding: x \<theta>n \<theta>c rule: trm.induct) |
18411 apply(nominal_induct M avoiding: x \<theta>n \<theta>c rule: trm.strong_induct) |
18412 apply(simp add: lookup_freshness) |
18412 apply(simp add: lookup_freshness) |
18413 apply(auto simp add: abs_fresh)[1] |
18413 apply(auto simp add: abs_fresh)[1] |
18414 apply(simp add: lookupc_freshness) |
18414 apply(simp add: lookupc_freshness) |
18415 apply(simp add: lookupc_freshness) |
18415 apply(simp add: lookupc_freshness) |
18416 apply(simp add: lookupc_freshness) |
18416 apply(simp add: lookupc_freshness) |
18492 lemma psubst_fresh_coname: |
18492 lemma psubst_fresh_coname: |
18493 fixes a::"coname" |
18493 fixes a::"coname" |
18494 assumes a: "a\<sharp>\<theta>n" "a\<sharp>\<theta>c" "a\<sharp>M" |
18494 assumes a: "a\<sharp>\<theta>n" "a\<sharp>\<theta>c" "a\<sharp>M" |
18495 shows "a\<sharp>\<theta>n,\<theta>c<M>" |
18495 shows "a\<sharp>\<theta>n,\<theta>c<M>" |
18496 using a |
18496 using a |
18497 apply(nominal_induct M avoiding: a \<theta>n \<theta>c rule: trm.induct) |
18497 apply(nominal_induct M avoiding: a \<theta>n \<theta>c rule: trm.strong_induct) |
18498 apply(simp add: lookup_freshness) |
18498 apply(simp add: lookup_freshness) |
18499 apply(auto simp add: abs_fresh)[1] |
18499 apply(auto simp add: abs_fresh)[1] |
18500 apply(simp add: lookupd_freshness) |
18500 apply(simp add: lookupd_freshness) |
18501 apply(simp add: lookupd_freshness) |
18501 apply(simp add: lookupd_freshness) |
18502 apply(simp add: lookupc_freshness) |
18502 apply(simp add: lookupc_freshness) |
18577 |
18577 |
18578 lemma psubst_csubst: |
18578 lemma psubst_csubst: |
18579 assumes a: "a\<sharp>(\<theta>n,\<theta>c)" |
18579 assumes a: "a\<sharp>(\<theta>n,\<theta>c)" |
18580 shows "\<theta>n,((a,x,P)#\<theta>c)<M> = ((\<theta>n,\<theta>c<M>){a:=(x).P})" |
18580 shows "\<theta>n,((a,x,P)#\<theta>c)<M> = ((\<theta>n,\<theta>c<M>){a:=(x).P})" |
18581 using a |
18581 using a |
18582 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.induct) |
18582 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.strong_induct) |
18583 apply(auto simp add: fresh_list_cons fresh_prod)[1] |
18583 apply(auto simp add: fresh_list_cons fresh_prod)[1] |
18584 apply(simp add: lookup_csubst) |
18584 apply(simp add: lookup_csubst) |
18585 apply(simp add: fresh_list_cons fresh_prod) |
18585 apply(simp add: fresh_list_cons fresh_prod) |
18586 apply(auto)[1] |
18586 apply(auto)[1] |
18587 apply(rule sym) |
18587 apply(rule sym) |
18864 |
18864 |
18865 lemma psubst_nsubst: |
18865 lemma psubst_nsubst: |
18866 assumes a: "x\<sharp>(\<theta>n,\<theta>c)" |
18866 assumes a: "x\<sharp>(\<theta>n,\<theta>c)" |
18867 shows "((x,a,P)#\<theta>n),\<theta>c<M> = ((\<theta>n,\<theta>c<M>){x:=<a>.P})" |
18867 shows "((x,a,P)#\<theta>n),\<theta>c<M> = ((\<theta>n,\<theta>c<M>){x:=<a>.P})" |
18868 using a |
18868 using a |
18869 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.induct) |
18869 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.strong_induct) |
18870 apply(auto simp add: fresh_list_cons fresh_prod)[1] |
18870 apply(auto simp add: fresh_list_cons fresh_prod)[1] |
18871 apply(simp add: lookup_fresh) |
18871 apply(simp add: lookup_fresh) |
18872 apply(rule lookupb_lookupa) |
18872 apply(rule lookupb_lookupa) |
18873 apply(simp) |
18873 apply(simp) |
18874 apply(rule sym) |
18874 apply(rule sym) |
19335 lemma ty_perm: |
19335 lemma ty_perm: |
19336 fixes pi1::"name prm" |
19336 fixes pi1::"name prm" |
19337 and pi2::"coname prm" |
19337 and pi2::"coname prm" |
19338 and B::"ty" |
19338 and B::"ty" |
19339 shows "pi1\<bullet>B=B" and "pi2\<bullet>B=B" |
19339 shows "pi1\<bullet>B=B" and "pi2\<bullet>B=B" |
19340 apply(nominal_induct B rule: ty.induct) |
19340 apply(nominal_induct B rule: ty.strong_induct) |
19341 apply(auto simp add: perm_string) |
19341 apply(auto simp add: perm_string) |
19342 done |
19342 done |
19343 |
19343 |
19344 lemma ctxt_perm: |
19344 lemma ctxt_perm: |
19345 fixes pi1::"name prm" |
19345 fixes pi1::"name prm" |
20392 apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) |
20392 apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) |
20393 done |
20393 done |
20394 |
20394 |
20395 lemma id_redu: |
20395 lemma id_redu: |
20396 shows "(idn \<Gamma> x),(idc \<Delta> a)<M> \<longrightarrow>\<^isub>a* M" |
20396 shows "(idn \<Gamma> x),(idc \<Delta> a)<M> \<longrightarrow>\<^isub>a* M" |
20397 apply(nominal_induct M avoiding: \<Gamma> \<Delta> x a rule: trm.induct) |
20397 apply(nominal_induct M avoiding: \<Gamma> \<Delta> x a rule: trm.strong_induct) |
20398 apply(auto) |
20398 apply(auto) |
20399 (* Ax *) |
20399 (* Ax *) |
20400 apply(case_tac "name\<sharp>(idn \<Gamma> x)") |
20400 apply(case_tac "name\<sharp>(idn \<Gamma> x)") |
20401 apply(simp add: lookup1) |
20401 apply(simp add: lookup1) |
20402 apply(case_tac "coname\<sharp>(idc \<Delta> a)") |
20402 apply(case_tac "coname\<sharp>(idc \<Delta> a)") |