# HG changeset patch # User Cezary Kaliszyk # Date 1290585566 -32400 # Node ID 67828f23c4e95ebd5e6df3913483757b7777cb72 # Parent b1d38940040a668757bc2f9397c14a36e2950473 Foo2 strong_exhaust for first variable. diff -r b1d38940040a -r 67828f23c4e9 Nominal/Ex/Foo2.thy --- a/Nominal/Ex/Foo2.thy Mon Nov 22 16:16:25 2010 +0900 +++ b/Nominal/Ex/Foo2.thy Wed Nov 24 16:59:26 2010 +0900 @@ -87,6 +87,17 @@ apply simp done +lemma Let2_rename2: + assumes "(supp ([[atom x, atom y]]lst. t1)) \* p" and "(atom y) \ p" + shows "Let2 x y t1 t2 = Let2 (p \ x) y (p \ t1) t2" + using assms + apply - + apply(drule supp_perm_eq[symmetric]) + apply(simp only: foo.eq_iff) + apply(simp only: eqvts) + apply simp + by (metis assms(2) atom_eqvt fresh_perm) + lemma strong_exhaust1: fixes c::"'a::fs" assumes "\name. y = Var name \ P" @@ -94,7 +105,7 @@ and "\name trm. \{atom name} \* c; y = Lam name trm\ \ P" and "\assn1 trm1 assn2 trm2. \((set (bn assn1)) \ (set (bn assn2))) \* c; y = Let1 assn1 trm1 assn2 trm2\ \ P" - and "\x1 x2 trm1 trm2. \{atom x1, atom x2} \* c; y = Let2 x1 x2 trm1 trm2\ \ P" + and "\x1 x2 trm1 trm2. \{atom x1} \* c; y = Let2 x1 x2 trm1 trm2\ \ P" shows "P" apply(rule_tac y="y" in foo.exhaust(1)) apply(rule assms(1)) @@ -142,26 +153,47 @@ apply(simp add: finite_supp) apply(simp add: finite_supp) apply(simp add: Abs_fresh_star) -thm foo.eq_iff +apply(case_tac "name1 = name2") apply(subgoal_tac - "\q. (q \ {atom name1}) \* c \ supp ([[atom name1]]lst. trm1) \* q") -apply(subgoal_tac - "\q. (q \ {atom name2}) \* c \ supp ([[atom name2]]lst. trm2) \* q") + "\q. (q \ {atom name1, atom name2}) \* c \ (supp (([[atom name1, atom name2]]lst. trm1), ([[atom name2]]lst. trm2))) \* q") apply(erule exE)+ apply(erule conjE)+ -apply(rule assms(5)) apply(perm_simp) -apply(simp (no_asm) add: fresh_star_insert) -apply(rule conjI) -apply(simp add: fresh_star_def) -apply(rotate_tac 3) -apply(simp add: fresh_star_def) -apply(simp) -apply(simp add: foo.eq_iff) -apply(drule supp_perm_eq[symmetric])+ -apply(simp add: atom_eqvt) -apply(rule conjI) -oops +apply(rule assms(5)) + +apply (simp add: fresh_star_def eqvts) +apply (simp only: supp_Pair) +apply (simp only: fresh_star_Un_elim) +apply (subst Let2_rename) +apply assumption +apply assumption +apply (rule refl) +apply(rule at_set_avoiding2) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply clarify +apply (simp add: fresh_star_def) +apply (simp add: fresh_def supp_Pair supp_Abs) +apply(subgoal_tac + "\q. (q \ {atom name1}) \* c \ (supp ((([[atom name1, atom name2]]lst. trm1)), (atom name2))) \* q") +prefer 2 +apply(rule at_set_avoiding2) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply (simp add: fresh_star_def) +apply (simp add: fresh_def supp_Pair supp_Abs supp_atom) +apply(erule exE)+ +apply(erule conjE)+ +apply(perm_simp) +apply(rule assms(5)) +apply assumption +apply clarify +apply (rule_tac x="name1" and y="name2" and ?t1.0="trm1" and ?t2.0="trm2" in Let2_rename2) +apply (simp_all add: fresh_star_Un_elim supp_Pair supp_Abs) +apply (simp add: fresh_star_def supp_atom) +done end