# HG changeset patch # User urbanc # Date 1206698898 -3600 # Node ID 5c21ec1ff293702b0d47de127191de21f72f7a38 # Parent 9385d441cec67fbf6abd2658845292b375155240 tuned proofs diff -r 9385d441cec6 -r 5c21ec1ff293 src/HOL/Nominal/Examples/CR_Takahashi.thy --- a/src/HOL/Nominal/Examples/CR_Takahashi.thy Fri Mar 28 00:02:58 2008 +0100 +++ b/src/HOL/Nominal/Examples/CR_Takahashi.thy Fri Mar 28 11:08:18 2008 +0100 @@ -45,23 +45,17 @@ by (nominal_induct t avoiding: x s rule: lam.induct) (auto simp add: abs_fresh fresh_atm) -lemma fresh_fact1: +lemma fresh_fact: fixes z::"name" - shows "z\(t,s) \ z\t[y::=s]" + shows "z\s \ (z=y \ z\t) \ z\t[y::=s]" by (nominal_induct t avoiding: z y s rule: lam.induct) (auto simp add: abs_fresh fresh_prod fresh_atm) -lemma fresh_fact2: - fixes x::"name" - shows "x\s \ x\t[x::=s]" -by (nominal_induct t avoiding: x s rule: lam.induct) - (auto simp add: abs_fresh fresh_atm) - lemma substitution_lemma: assumes a: "x\y" "x\u" shows "t[x::=s][y::=u] = t[y::=u][x::=s[y::=u]]" using a by (nominal_induct t avoiding: x y s u rule: lam.induct) - (auto simp add: fresh_fact1 forget) + (auto simp add: fresh_fact forget) lemma subst_rename: assumes a: "y\t" @@ -100,7 +94,7 @@ equivariance One nominal_inductive One - by (simp_all add: abs_fresh fresh_fact2) + by (simp_all add: abs_fresh fresh_fact) lemma One_refl: shows "t \\<^isub>1 t" @@ -110,7 +104,7 @@ assumes a: "t1 \\<^isub>1 t2" "s1 \\<^isub>1 s2" shows "t1[x::=s1] \\<^isub>1 t2[x::=s2]" using a by (nominal_induct t1 t2 avoiding: s1 s2 x rule: One.strong_induct) - (auto simp add: substitution_lemma fresh_atm fresh_fact1) + (auto simp add: substitution_lemma fresh_atm fresh_fact) lemma better_o4_intro: assumes a: "t1 \\<^isub>1 t2" "s1 \\<^isub>1 s2" @@ -142,6 +136,12 @@ (\x p p' s'. r = p'[x::=s'] \ t = Lam [x].p \ p \\<^isub>1 p' \ s \\<^isub>1 s' \ x\(s,s'))" using a by (cases rule: One.cases) (auto simp add: lam.inject) +lemma One_App_: + assumes a: "App t s \\<^isub>1 r" + obtains t' s' where "r = App t' s'" "t \\<^isub>1 t'" "s \\<^isub>1 s'" + | x p p' s' where "r = p'[x::=s']" "t = Lam [x].p" "p \\<^isub>1 p'" "s \\<^isub>1 s'" "x\(s,s')" +using a by (cases rule: One.cases) (auto simp add: lam.inject) + lemma One_Redex: assumes a: "App (Lam [x].t) s \\<^isub>1 r" "x\(s,r)" shows "(\t' s'. r = App (Lam [x].t') s' \ t \\<^isub>1 t' \ s \\<^isub>1 s') \ @@ -171,7 +171,7 @@ equivariance Dev nominal_inductive Dev - by (simp_all add: abs_fresh fresh_fact2) + by (simp_all add: abs_fresh fresh_fact) lemma better_d4_intro: assumes a: "t1 \\<^isub>d t2" "s1 \\<^isub>d s2" @@ -190,7 +190,7 @@ assumes a: "M\\<^isub>d N" shows "x\M \ x\N" using a -by (induct) (auto simp add: abs_fresh fresh_fact1 fresh_fact2) +by (induct) (auto simp add: abs_fresh fresh_fact) lemma Dev_Lam: assumes a: "Lam [x].M \\<^isub>d N" @@ -212,10 +212,31 @@ assumes a: "t \\<^isub>d t1" "t \\<^isub>1 t2" shows "t2 \\<^isub>1 t1" using a -apply(nominal_induct avoiding: t2 rule: Dev.strong_induct) -apply(auto dest!: One_Var One_Lam One_App)[3] -apply(auto dest!: One_Redex intro: One_subst) -done +proof(nominal_induct avoiding: t2 rule: Dev.strong_induct) + case (d4 x s1 s2 t1 t1' t2) + have ih1: "\t. t1 \\<^isub>1 t \ t \\<^isub>1 t1'" + and ih2: "\s. s1 \\<^isub>1 s \ s \\<^isub>1 s2" + and fc: "x\t2" "x\s1" "x\s2" by fact+ + have "App (Lam [x].t1) s1 \\<^isub>1 t2" by fact + then obtain t' s' where "(t2 = App (Lam [x].t') s' \ t1 \\<^isub>1 t' \ s1 \\<^isub>1 s') \ + (t2 = t'[x::=s'] \ t1 \\<^isub>1 t' \ s1 \\<^isub>1 s')" + (* MARKUS: How does I do this better *) using fc by (auto dest!: One_Redex) + then show "t2 \\<^isub>1 t1'[x::=s2]" + apply - + apply(erule disjE) + apply(erule conjE)+ + apply(simp) + apply(rule o4) + using fc apply(simp) + using ih1 apply(simp) + using ih2 apply(simp) + apply(erule conjE)+ + apply(simp) + apply(rule One_subst) + using ih1 apply(simp) + using ih2 apply(simp) + done +qed (auto dest!: One_Lam One_Var One_App) lemma Diamond_for_One: assumes a: "t \\<^isub>1 t1" "t \\<^isub>1 t2"