# HG changeset patch # User Christian Urban # Date 1285757101 14400 # Node ID c7534584a7a007719ab4963613ca3eb5cfb18150 # Parent 7f311ed9204d68ae3dbb10e2ddd94d0fb3aaf3bc use also induct_schema for the Let-example (permute_bn is used) diff -r 7f311ed9204d -r c7534584a7a0 Nominal/Ex/Let.thy --- a/Nominal/Ex/Let.thy Wed Sep 29 04:42:37 2010 -0400 +++ b/Nominal/Ex/Let.thy Wed Sep 29 06:45:01 2010 -0400 @@ -28,6 +28,7 @@ thm trm_assn.distinct thm trm_assn.supp thm trm_assn.fresh +thm trm_assn.exhaust lemma fin_bn: @@ -60,7 +61,7 @@ lemmas permute_bn = permute_bn_raw.simps[quot_lifted] lemma uu: - shows "alpha_bn (permute_bn p as) as" + shows "alpha_bn as (permute_bn p as)" apply(induct as rule: trm_assn.inducts(2)) apply(auto)[4] apply(simp add: permute_bn) @@ -78,72 +79,64 @@ apply(simp add: atom_eqvt) done -thm trm_assn.supp - -lemma "as \* x \ (\a\as. a \ x)" -apply(simp add: fresh_def) -apply(simp add: fresh_star_def) -oops - -inductive - test_trm :: "trm \ bool" -and test_assn :: "assn \ bool" -where - "test_trm (Var x)" -| "\test_trm t1; test_trm t2\ \ test_trm (App t1 t2)" -| "\test_trm t; {atom x} \* Lam x t\ \ test_trm (Lam x t)" -| "\test_assn as; test_trm t; set (bn as) \* Let as t\ \ test_trm (Let as t)" -| "test_assn ANil" -| "\test_trm t; test_assn as\ \ test_assn (ACons x t as)" - -declare trm_assn.fv_bn_eqvt[eqvt] -equivariance test_trm - -lemma - fixes p::"perm" - shows "test_trm (p \ t)" and "test_assn (p \ as)" -apply(induct t and as arbitrary: p and p rule: trm_assn.inducts) +lemma strong_exhaust1: + fixes c::"'a::fs" + assumes "\name ca. \c = ca; y = Var name\ \ P" + and "\trm1 trm2 ca. \c = ca; y = App trm1 trm2\ \ P" + and "\name trm ca. \{atom name} \* ca; c = ca; y = Lam name trm\ \ P" + and "\assn trm ca. \set (bn assn) \* ca; c = ca; y = Let assn trm\ \ P" + shows "P" +apply(rule_tac y="y" in trm_assn.exhaust(1)) +apply(rule assms(1)) +apply(auto)[2] +apply(rule assms(2)) +apply(auto)[2] +apply(subgoal_tac "\q. (q \ {atom name}) \* c \ supp (Lam name trm) \* q") +apply(erule exE) +apply(erule conjE) +apply(rule assms(3)) +apply(perm_simp) +apply(assumption) +apply(rule refl) +apply(drule supp_perm_eq[symmetric]) apply(simp) -apply(rule test_trm_test_assn.intros) -apply(simp) -apply(rule test_trm_test_assn.intros) -apply(assumption) -apply(assumption) -apply(simp) -apply(rule test_trm_test_assn.intros) -apply(assumption) +apply(rule at_set_avoiding2) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply(simp add: finite_supp) apply(simp add: trm_assn.fresh fresh_star_def) -apply(simp) -defer -apply(simp) -apply(rule test_trm_test_assn.intros) -apply(simp) -apply(rule test_trm_test_assn.intros) -apply(assumption) -apply(assumption) -apply(subgoal_tac "finite (set (bn (p \ assn)))") -apply(subgoal_tac "set (bn (p \ assn)) \* (Abs_lst (bn (p \ assn)) (p \ trm))") -apply(drule_tac c="()" in at_set_avoiding2) -apply(simp add: supp_Unit) -prefer 2 -apply(assumption) -apply(simp add: finite_supp) +apply(subgoal_tac "\q. (q \ (set (bn assn))) \* c \ supp ([bn assn]lst.trm) \* q") apply(erule exE) apply(erule conjE) -apply(rule_tac t = "Let (p \ assn) (p \ trm)" and - s = "Let (permute_bn pa (p \ assn)) (pa \ (p \ trm))" in subst) -apply(rule trm_assn.eq_iff(4)[THEN iffD2]) -apply(simp add: uu) -apply(drule supp_perm_eq) +apply(rule assms(4)) +apply(simp add: set_eqvt) apply(simp add: tt) -apply(rule test_trm_test_assn.intros(4)) -defer -apply(subst permute_plus[symmetric]) -apply(blast) -oops +apply(rule refl) +apply(simp) +apply(simp add: trm_assn.eq_iff) +apply(drule supp_perm_eq[symmetric]) +apply(simp) +apply(simp add: tt uu) +apply(rule at_set_avoiding2) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply(simp add: finite_supp) +apply(simp add: Abs_fresh_star) +done -(* +lemma strong_exhaust2: + assumes "\ca. \c = ca; as = ANil\ \ P" + and "\x t assn ca. \c = ca; as = ACons x t assn\ \ P" + shows "P" +apply(rule_tac y="as" in trm_assn.exhaust(2)) +apply(rule assms(1)) +apply(auto)[2] +apply(rule assms(2)) +apply(auto)[2] +done + + lemma fixes t::trm and as::assn @@ -154,7 +147,26 @@ and a4: "\as t c. \set (bn as) \* c; \d. P2 d as; \d. P1 d t\ \ P1 c (Let as t)" and a5: "\c. P2 c ANil" and a6: "\x t as c. \\d. P1 d t; \d. P2 d as\ \ P2 c (ACons x t as)" - shows "P1 c t" and "P2 c as" + shows "P1 c t" "P2 c as" +using assms +apply(induction_schema) +apply(rule_tac y="t" in strong_exhaust1) +apply(blast) +apply(blast) +apply(blast) +apply(blast) +apply(rule_tac as="as" in strong_exhaust2) +apply(blast) +apply(blast) +apply(relation "measure (sum_case (\y. size (snd y)) (\z. size (snd z)))") +apply(auto)[1] +apply(simp_all add: trm_assn.size)[7] +done + +text {* *} + + +(* proof - have x: "\(p::perm) (c::'a::fs). P1 c (p \ t)" and y: "\(p::perm) (c::'a::fs). P2 c (p \ as)"