diff -r bb18eed53ed6 -r a1119cf551e8 src/HOL/Nominal/Examples/Pattern.thy --- a/src/HOL/Nominal/Examples/Pattern.thy Tue Aug 13 14:20:22 2013 +0200 +++ b/src/HOL/Nominal/Examples/Pattern.thy Tue Aug 13 16:25:47 2013 +0200 @@ -144,7 +144,7 @@ ptyping :: "pat \ ty \ ctx \ bool" ("\ _ : _ \ _" [60, 60, 60] 60) where PVar: "\ PVar x T : T \ [(x, T)]" -| PTuple: "\ p : T \ \\<^isub>1 \ \ q : U \ \\<^isub>2 \ \ \\p, q\\ : T \ U \ \\<^isub>2 @ \\<^isub>1" +| PTuple: "\ p : T \ \\<^sub>1 \ \ q : U \ \\<^sub>2 \ \ \\p, q\\ : T \ U \ \\<^sub>2 @ \\<^sub>1" lemma pat_vars_ptyping: assumes "\ p : T \ \" @@ -168,7 +168,7 @@ abbreviation "sub_ctx" :: "ctx \ ctx \ bool" ("_ \ _") where - "\\<^isub>1 \ \\<^isub>2 \ \x. x \ set \\<^isub>1 \ x \ set \\<^isub>2" + "\\<^sub>1 \ \\<^sub>2 \ \x. x \ set \\<^sub>1 \ x \ set \\<^sub>2" abbreviation Let_syn :: "pat \ trm \ trm \ trm" ("(LET (_ =/ _)/ IN (_))" 10) @@ -213,8 +213,8 @@ by (auto simp add: fresh_star_def pat_var) lemma valid_app_mono: - assumes "valid (\ @ \\<^isub>1)" and "(supp \::name set) \* \\<^isub>2" and "valid \\<^isub>2" and "\\<^isub>1 \ \\<^isub>2" - shows "valid (\ @ \\<^isub>2)" using assms + assumes "valid (\ @ \\<^sub>1)" and "(supp \::name set) \* \\<^sub>2" and "valid \\<^sub>2" and "\\<^sub>1 \ \\<^sub>2" + shows "valid (\ @ \\<^sub>2)" using assms by (induct \) (auto simp add: supp_list_cons fresh_star_Un_elim supp_prod fresh_list_append supp_atm fresh_star_insert_elim fresh_star_empty_elim) @@ -253,14 +253,14 @@ qed lemma weakening: - assumes "\\<^isub>1 \ t : T" and "valid \\<^isub>2" and "\\<^isub>1 \ \\<^isub>2" - shows "\\<^isub>2 \ t : T" using assms - apply (nominal_induct \\<^isub>1 t T avoiding: \\<^isub>2 rule: typing.strong_induct) + assumes "\\<^sub>1 \ t : T" and "valid \\<^sub>2" and "\\<^sub>1 \ \\<^sub>2" + shows "\\<^sub>2 \ t : T" using assms + apply (nominal_induct \\<^sub>1 t T avoiding: \\<^sub>2 rule: typing.strong_induct) apply auto - apply (drule_tac x="(x, T) # \\<^isub>2" in meta_spec) + apply (drule_tac x="(x, T) # \\<^sub>2" in meta_spec) apply (auto intro: valid_typing) - apply (drule_tac x="\\<^isub>2" in meta_spec) - apply (drule_tac x="\ @ \\<^isub>2" in meta_spec) + apply (drule_tac x="\\<^sub>2" in meta_spec) + apply (drule_tac x="\ @ \\<^sub>2" in meta_spec) apply (auto intro: valid_typing) apply (rule typing.Let) apply assumption+ @@ -379,8 +379,8 @@ (simp_all add: fresh_list_nil fresh_list_cons psubst_forget) lemma psubst_append: - "(supp (map fst (\\<^isub>1 @ \\<^isub>2))::name set) \* map snd (\\<^isub>1 @ \\<^isub>2) \ (\\<^isub>1 @ \\<^isub>2)\t\ = \\<^isub>2\\\<^isub>1\t\\" - by (induct \\<^isub>1 arbitrary: t) + "(supp (map fst (\\<^sub>1 @ \\<^sub>2))::name set) \* map snd (\\<^sub>1 @ \\<^sub>2) \ (\\<^sub>1 @ \\<^sub>2)\t\ = \\<^sub>2\\\<^sub>1\t\\" + by (induct \\<^sub>1 arbitrary: t) (simp_all add: psubst_nil split_paired_all supp_list_cons psubst_cons fresh_star_def fresh_list_cons fresh_list_append supp_list_append) @@ -424,12 +424,12 @@ then show "\ @ \ \ Var y[x\u] : T" using ineq valid by auto qed next - case (Tuple t\<^isub>1 T\<^isub>1 t\<^isub>2 T\<^isub>2) + case (Tuple t\<^sub>1 T\<^sub>1 t\<^sub>2 T\<^sub>2) from refl `\ \ u : U` - have "\ @ \ \ t\<^isub>1[x\u] : T\<^isub>1" by (rule Tuple) + have "\ @ \ \ t\<^sub>1[x\u] : T\<^sub>1" by (rule Tuple) moreover from refl `\ \ u : U` - have "\ @ \ \ t\<^isub>2[x\u] : T\<^isub>2" by (rule Tuple) - ultimately have "\ @ \ \ \t\<^isub>1[x\u], t\<^isub>2[x\u]\ : T\<^isub>1 \ T\<^isub>2" .. + have "\ @ \ \ t\<^sub>2[x\u] : T\<^sub>2" by (rule Tuple) + ultimately have "\ @ \ \ \t\<^sub>1[x\u], t\<^sub>2[x\u]\ : T\<^sub>1 \ T\<^sub>2" .. then show ?case by simp next case (Let p t T \' s S) @@ -456,12 +456,12 @@ by (simp add: fresh_list_nil fresh_list_cons) ultimately show ?case by simp next - case (App t\<^isub>1 T S t\<^isub>2) + case (App t\<^sub>1 T S t\<^sub>2) from refl `\ \ u : U` - have "\ @ \ \ t\<^isub>1[x\u] : T \ S" by (rule App) + have "\ @ \ \ t\<^sub>1[x\u] : T \ S" by (rule App) moreover from refl `\ \ u : U` - have "\ @ \ \ t\<^isub>2[x\u] : T" by (rule App) - ultimately have "\ @ \ \ (t\<^isub>1[x\u]) \ (t\<^isub>2[x\u]) : S" + have "\ @ \ \ t\<^sub>2[x\u] : T" by (rule App) + ultimately have "\ @ \ \ (t\<^sub>1[x\u]) \ (t\<^sub>2[x\u]) : S" by (rule typing.App) then show ?case by simp qed @@ -482,42 +482,42 @@ lemma match_type_aux: assumes "\ p : U \ \" - and "\\<^isub>2 \ u : U" - and "\\<^isub>1 @ \ @ \\<^isub>2 \ t : T" + and "\\<^sub>2 \ u : U" + and "\\<^sub>1 @ \ @ \\<^sub>2 \ t : T" and "\ p \ u \ \" and "(supp p::name set) \* u" - shows "\\<^isub>1 @ \\<^isub>2 \ \\t\ : T" using assms -proof (induct arbitrary: \\<^isub>1 \\<^isub>2 t u T \) + shows "\\<^sub>1 @ \\<^sub>2 \ \\t\ : T" using assms +proof (induct arbitrary: \\<^sub>1 \\<^sub>2 t u T \) case (PVar x U) - from `\\<^isub>1 @ [(x, U)] @ \\<^isub>2 \ t : T` `\\<^isub>2 \ u : U` - have "\\<^isub>1 @ \\<^isub>2 \ t[x\u] : T" by (rule subst_type_aux) + from `\\<^sub>1 @ [(x, U)] @ \\<^sub>2 \ t : T` `\\<^sub>2 \ u : U` + have "\\<^sub>1 @ \\<^sub>2 \ t[x\u] : T" by (rule subst_type_aux) moreover from `\ PVar x U \ u \ \` have "\ = [(x, u)]" by cases simp_all ultimately show ?case by simp next - case (PTuple p S \\<^isub>1 q U \\<^isub>2) - from `\ \\p, q\\ \ u \ \` obtain u\<^isub>1 u\<^isub>2 \\<^isub>1 \\<^isub>2 - where u: "u = \u\<^isub>1, u\<^isub>2\" and \: "\ = \\<^isub>1 @ \\<^isub>2" - and p: "\ p \ u\<^isub>1 \ \\<^isub>1" and q: "\ q \ u\<^isub>2 \ \\<^isub>2" + case (PTuple p S \\<^sub>1 q U \\<^sub>2) + from `\ \\p, q\\ \ u \ \` obtain u\<^sub>1 u\<^sub>2 \\<^sub>1 \\<^sub>2 + where u: "u = \u\<^sub>1, u\<^sub>2\" and \: "\ = \\<^sub>1 @ \\<^sub>2" + and p: "\ p \ u\<^sub>1 \ \\<^sub>1" and q: "\ q \ u\<^sub>2 \ \\<^sub>2" by cases simp_all - with PTuple have "\\<^isub>2 \ \u\<^isub>1, u\<^isub>2\ : S \ U" by simp - then obtain u\<^isub>1: "\\<^isub>2 \ u\<^isub>1 : S" and u\<^isub>2: "\\<^isub>2 \ u\<^isub>2 : U" + with PTuple have "\\<^sub>2 \ \u\<^sub>1, u\<^sub>2\ : S \ U" by simp + then obtain u\<^sub>1: "\\<^sub>2 \ u\<^sub>1 : S" and u\<^sub>2: "\\<^sub>2 \ u\<^sub>2 : U" by cases (simp_all add: ty.inject trm.inject) - note u\<^isub>1 - moreover from `\\<^isub>1 @ (\\<^isub>2 @ \\<^isub>1) @ \\<^isub>2 \ t : T` - have "(\\<^isub>1 @ \\<^isub>2) @ \\<^isub>1 @ \\<^isub>2 \ t : T" by simp + note u\<^sub>1 + moreover from `\\<^sub>1 @ (\\<^sub>2 @ \\<^sub>1) @ \\<^sub>2 \ t : T` + have "(\\<^sub>1 @ \\<^sub>2) @ \\<^sub>1 @ \\<^sub>2 \ t : T" by simp moreover note p moreover from `supp \\p, q\\ \* u` and u - have "(supp p::name set) \* u\<^isub>1" by (simp add: fresh_star_def) - ultimately have \\<^isub>1: "(\\<^isub>1 @ \\<^isub>2) @ \\<^isub>2 \ \\<^isub>1\t\ : T" + have "(supp p::name set) \* u\<^sub>1" by (simp add: fresh_star_def) + ultimately have \\<^sub>1: "(\\<^sub>1 @ \\<^sub>2) @ \\<^sub>2 \ \\<^sub>1\t\ : T" by (rule PTuple) - note u\<^isub>2 - moreover from \\<^isub>1 - have "\\<^isub>1 @ \\<^isub>2 @ \\<^isub>2 \ \\<^isub>1\t\ : T" by simp + note u\<^sub>2 + moreover from \\<^sub>1 + have "\\<^sub>1 @ \\<^sub>2 @ \\<^sub>2 \ \\<^sub>1\t\ : T" by simp moreover note q moreover from `supp \\p, q\\ \* u` and u - have "(supp q::name set) \* u\<^isub>2" by (simp add: fresh_star_def) - ultimately have "\\<^isub>1 @ \\<^isub>2 \ \\<^isub>2\\\<^isub>1\t\\ : T" + have "(supp q::name set) \* u\<^sub>2" by (simp add: fresh_star_def) + ultimately have "\\<^sub>1 @ \\<^sub>2 \ \\<^sub>2\\\<^sub>1\t\\ : T" by (rule PTuple) moreover from `\ \\p, q\\ \ u \ \` `supp \\p, q\\ \* u` have "(supp (map fst \)::name set) \* map snd \" @@ -525,7 +525,7 @@ ultimately show ?case using \ by (simp add: psubst_append) qed -lemmas match_type = match_type_aux [where \\<^isub>1="[]", simplified] +lemmas match_type = match_type_aux [where \\<^sub>1="[]", simplified] inductive eval :: "trm \ trm \ bool" ("_ \ _" [60,60] 60) where @@ -680,78 +680,78 @@ then show ?thesis .. qed next - case (PTuple p\<^isub>1 p\<^isub>2) - with PVar have "ty_size (pat_type p\<^isub>1) < ty_size T" by simp - then have "Bind T x t \ (\[p\<^isub>1]. \[p\<^isub>2]. u)" + case (PTuple p\<^sub>1 p\<^sub>2) + with PVar have "ty_size (pat_type p\<^sub>1) < ty_size T" by simp + then have "Bind T x t \ (\[p\<^sub>1]. \[p\<^sub>2]. u)" by (rule bind_tuple_ineq) moreover from PTuple PVar - have "Bind T x t = (\[p\<^isub>1]. \[p\<^isub>2]. u)" by simp + have "Bind T x t = (\[p\<^sub>1]. \[p\<^sub>2]. u)" by simp ultimately show ?thesis .. qed next - case (PTuple p\<^isub>1 p\<^isub>2) + case (PTuple p\<^sub>1 p\<^sub>2) note PTuple' = this show ?case proof (cases q) case (PVar x T) - with PTuple have "ty_size (pat_type p\<^isub>1) < ty_size T" by auto - then have "Bind T x u \ (\[p\<^isub>1]. \[p\<^isub>2]. t)" + with PTuple have "ty_size (pat_type p\<^sub>1) < ty_size T" by auto + then have "Bind T x u \ (\[p\<^sub>1]. \[p\<^sub>2]. t)" by (rule bind_tuple_ineq) moreover from PTuple PVar - have "Bind T x u = (\[p\<^isub>1]. \[p\<^isub>2]. t)" by simp + have "Bind T x u = (\[p\<^sub>1]. \[p\<^sub>2]. t)" by simp ultimately show ?thesis .. next - case (PTuple p\<^isub>1' p\<^isub>2') - with PTuple' have "(\[p\<^isub>1]. \[p\<^isub>2]. t) = (\[p\<^isub>1']. \[p\<^isub>2']. u)" by simp - moreover from PTuple PTuple' have "pat_type p\<^isub>1 = pat_type p\<^isub>1'" + case (PTuple p\<^sub>1' p\<^sub>2') + with PTuple' have "(\[p\<^sub>1]. \[p\<^sub>2]. t) = (\[p\<^sub>1']. \[p\<^sub>2']. u)" by simp + moreover from PTuple PTuple' have "pat_type p\<^sub>1 = pat_type p\<^sub>1'" by (simp add: ty.inject) - moreover from PTuple' have "distinct (pat_vars p\<^isub>1)" by simp - moreover from PTuple PTuple' have "distinct (pat_vars p\<^isub>1')" by simp - ultimately have "\pi::name prm. p\<^isub>1 = pi \ p\<^isub>1' \ - (\[p\<^isub>2]. t) = pi \ (\[p\<^isub>2']. u) \ - set pi \ (supp p\<^isub>1 \ supp p\<^isub>1') \ (supp p\<^isub>1 \ supp p\<^isub>1')" + moreover from PTuple' have "distinct (pat_vars p\<^sub>1)" by simp + moreover from PTuple PTuple' have "distinct (pat_vars p\<^sub>1')" by simp + ultimately have "\pi::name prm. p\<^sub>1 = pi \ p\<^sub>1' \ + (\[p\<^sub>2]. t) = pi \ (\[p\<^sub>2']. u) \ + set pi \ (supp p\<^sub>1 \ supp p\<^sub>1') \ (supp p\<^sub>1 \ supp p\<^sub>1')" by (rule PTuple') then obtain pi::"name prm" where - "p\<^isub>1 = pi \ p\<^isub>1'" "(\[p\<^isub>2]. t) = pi \ (\[p\<^isub>2']. u)" and - pi: "set pi \ (supp p\<^isub>1 \ supp p\<^isub>1') \ (supp p\<^isub>1 \ supp p\<^isub>1')" by auto - from `(\[p\<^isub>2]. t) = pi \ (\[p\<^isub>2']. u)` - have "(\[p\<^isub>2]. t) = (\[pi \ p\<^isub>2']. pi \ u)" + "p\<^sub>1 = pi \ p\<^sub>1'" "(\[p\<^sub>2]. t) = pi \ (\[p\<^sub>2']. u)" and + pi: "set pi \ (supp p\<^sub>1 \ supp p\<^sub>1') \ (supp p\<^sub>1 \ supp p\<^sub>1')" by auto + from `(\[p\<^sub>2]. t) = pi \ (\[p\<^sub>2']. u)` + have "(\[p\<^sub>2]. t) = (\[pi \ p\<^sub>2']. pi \ u)" by (simp add: eqvts) - moreover from PTuple PTuple' have "pat_type p\<^isub>2 = pat_type (pi \ p\<^isub>2')" + moreover from PTuple PTuple' have "pat_type p\<^sub>2 = pat_type (pi \ p\<^sub>2')" by (simp add: ty.inject pat_type_perm_eq) - moreover from PTuple' have "distinct (pat_vars p\<^isub>2)" by simp - moreover from PTuple PTuple' have "distinct (pat_vars (pi \ p\<^isub>2'))" + moreover from PTuple' have "distinct (pat_vars p\<^sub>2)" by simp + moreover from PTuple PTuple' have "distinct (pat_vars (pi \ p\<^sub>2'))" by (simp add: pat_vars_eqvt [symmetric] distinct_eqvt [symmetric]) - ultimately have "\pi'::name prm. p\<^isub>2 = pi' \ pi \ p\<^isub>2' \ + ultimately have "\pi'::name prm. p\<^sub>2 = pi' \ pi \ p\<^sub>2' \ t = pi' \ pi \ u \ - set pi' \ (supp p\<^isub>2 \ supp (pi \ p\<^isub>2')) \ (supp p\<^isub>2 \ supp (pi \ p\<^isub>2'))" + set pi' \ (supp p\<^sub>2 \ supp (pi \ p\<^sub>2')) \ (supp p\<^sub>2 \ supp (pi \ p\<^sub>2'))" by (rule PTuple') then obtain pi'::"name prm" where - "p\<^isub>2 = pi' \ pi \ p\<^isub>2'" "t = pi' \ pi \ u" and - pi': "set pi' \ (supp p\<^isub>2 \ supp (pi \ p\<^isub>2')) \ - (supp p\<^isub>2 \ supp (pi \ p\<^isub>2'))" by auto - from PTuple PTuple' have "pi \ distinct (pat_vars \\p\<^isub>1', p\<^isub>2'\\)" by simp - then have "distinct (pat_vars \\pi \ p\<^isub>1', pi \ p\<^isub>2'\\)" by (simp only: eqvts) - with `p\<^isub>1 = pi \ p\<^isub>1'` PTuple' - have fresh: "(supp p\<^isub>2 \ supp (pi \ p\<^isub>2') :: name set) \* p\<^isub>1" + "p\<^sub>2 = pi' \ pi \ p\<^sub>2'" "t = pi' \ pi \ u" and + pi': "set pi' \ (supp p\<^sub>2 \ supp (pi \ p\<^sub>2')) \ + (supp p\<^sub>2 \ supp (pi \ p\<^sub>2'))" by auto + from PTuple PTuple' have "pi \ distinct (pat_vars \\p\<^sub>1', p\<^sub>2'\\)" by simp + then have "distinct (pat_vars \\pi \ p\<^sub>1', pi \ p\<^sub>2'\\)" by (simp only: eqvts) + with `p\<^sub>1 = pi \ p\<^sub>1'` PTuple' + have fresh: "(supp p\<^sub>2 \ supp (pi \ p\<^sub>2') :: name set) \* p\<^sub>1" by (auto simp add: set_pat_vars_supp fresh_star_def fresh_def eqvts) - from `p\<^isub>1 = pi \ p\<^isub>1'` have "pi' \ (p\<^isub>1 = pi \ p\<^isub>1')" by (rule perm_boolI) + from `p\<^sub>1 = pi \ p\<^sub>1'` have "pi' \ (p\<^sub>1 = pi \ p\<^sub>1')" by (rule perm_boolI) with pt_freshs_freshs [OF pt_name_inst at_name_inst pi' fresh fresh] - have "p\<^isub>1 = pi' \ pi \ p\<^isub>1'" by (simp add: eqvts) - with `p\<^isub>2 = pi' \ pi \ p\<^isub>2'` have "\\p\<^isub>1, p\<^isub>2\\ = (pi' @ pi) \ \\p\<^isub>1', p\<^isub>2'\\" + have "p\<^sub>1 = pi' \ pi \ p\<^sub>1'" by (simp add: eqvts) + with `p\<^sub>2 = pi' \ pi \ p\<^sub>2'` have "\\p\<^sub>1, p\<^sub>2\\ = (pi' @ pi) \ \\p\<^sub>1', p\<^sub>2'\\" by (simp add: pt_name2) moreover - have "((supp p\<^isub>2 \ (pi \ supp p\<^isub>2')) \ (supp p\<^isub>2 \ (pi \ supp p\<^isub>2'))::(name \ name) set) \ - (supp p\<^isub>2 \ (supp p\<^isub>1 \ supp p\<^isub>1' \ supp p\<^isub>2')) \ (supp p\<^isub>2 \ (supp p\<^isub>1 \ supp p\<^isub>1' \ supp p\<^isub>2'))" + have "((supp p\<^sub>2 \ (pi \ supp p\<^sub>2')) \ (supp p\<^sub>2 \ (pi \ supp p\<^sub>2'))::(name \ name) set) \ + (supp p\<^sub>2 \ (supp p\<^sub>1 \ supp p\<^sub>1' \ supp p\<^sub>2')) \ (supp p\<^sub>2 \ (supp p\<^sub>1 \ supp p\<^sub>1' \ supp p\<^sub>2'))" by (rule subset_refl Sigma_mono Un_mono perm_cases [OF pi])+ with pi' have "set pi' \ \" by (simp add: supp_eqvt [symmetric]) - with pi have "set (pi' @ pi) \ (supp \\p\<^isub>1, p\<^isub>2\\ \ supp \\p\<^isub>1', p\<^isub>2'\\) \ - (supp \\p\<^isub>1, p\<^isub>2\\ \ supp \\p\<^isub>1', p\<^isub>2'\\)" + with pi have "set (pi' @ pi) \ (supp \\p\<^sub>1, p\<^sub>2\\ \ supp \\p\<^sub>1', p\<^sub>2'\\) \ + (supp \\p\<^sub>1, p\<^sub>2\\ \ supp \\p\<^sub>1', p\<^sub>2'\\)" by (simp add: Sigma_Un_distrib1 Sigma_Un_distrib2 Un_ac) blast moreover note `t = pi' \ pi \ u` - ultimately have "\\p\<^isub>1, p\<^isub>2\\ = (pi' @ pi) \ q \ t = (pi' @ pi) \ u \ - set (pi' @ pi) \ (supp \\p\<^isub>1, p\<^isub>2\\ \ supp q) \ - (supp \\p\<^isub>1, p\<^isub>2\\ \ supp q)" using PTuple + ultimately have "\\p\<^sub>1, p\<^sub>2\\ = (pi' @ pi) \ q \ t = (pi' @ pi) \ u \ + set (pi' @ pi) \ (supp \\p\<^sub>1, p\<^sub>2\\ \ supp q) \ + (supp \\p\<^sub>1, p\<^sub>2\\ \ supp q)" using PTuple by (simp add: pt_name2) then show ?thesis .. qed @@ -805,22 +805,22 @@ shows "\ \ t' : T" using assms proof (nominal_induct avoiding: \ T rule: eval.strong_induct) case (TupleL t t' u) - from `\ \ \t, u\ : T` obtain T\<^isub>1 T\<^isub>2 - where "T = T\<^isub>1 \ T\<^isub>2" "\ \ t : T\<^isub>1" "\ \ u : T\<^isub>2" + from `\ \ \t, u\ : T` obtain T\<^sub>1 T\<^sub>2 + where "T = T\<^sub>1 \ T\<^sub>2" "\ \ t : T\<^sub>1" "\ \ u : T\<^sub>2" by cases (simp_all add: trm.inject) - from `\ \ t : T\<^isub>1` have "\ \ t' : T\<^isub>1" by (rule TupleL) - then have "\ \ \t', u\ : T\<^isub>1 \ T\<^isub>2" using `\ \ u : T\<^isub>2` + from `\ \ t : T\<^sub>1` have "\ \ t' : T\<^sub>1" by (rule TupleL) + then have "\ \ \t', u\ : T\<^sub>1 \ T\<^sub>2" using `\ \ u : T\<^sub>2` by (rule Tuple) - with `T = T\<^isub>1 \ T\<^isub>2` show ?case by simp + with `T = T\<^sub>1 \ T\<^sub>2` show ?case by simp next case (TupleR u u' t) - from `\ \ \t, u\ : T` obtain T\<^isub>1 T\<^isub>2 - where "T = T\<^isub>1 \ T\<^isub>2" "\ \ t : T\<^isub>1" "\ \ u : T\<^isub>2" + from `\ \ \t, u\ : T` obtain T\<^sub>1 T\<^sub>2 + where "T = T\<^sub>1 \ T\<^sub>2" "\ \ t : T\<^sub>1" "\ \ u : T\<^sub>2" by cases (simp_all add: trm.inject) - from `\ \ u : T\<^isub>2` have "\ \ u' : T\<^isub>2" by (rule TupleR) - with `\ \ t : T\<^isub>1` have "\ \ \t, u'\ : T\<^isub>1 \ T\<^isub>2" + from `\ \ u : T\<^sub>2` have "\ \ u' : T\<^sub>2" by (rule TupleR) + with `\ \ t : T\<^sub>1` have "\ \ \t, u'\ : T\<^sub>1 \ T\<^sub>2" by (rule Tuple) - with `T = T\<^isub>1 \ T\<^isub>2` show ?case by simp + with `T = T\<^sub>1 \ T\<^sub>2` show ?case by simp next case (Abs t t' x S) from `\ \ (\x:S. t) : T` `x \ \` obtain U where