diff -r 478c5648e73f -r d1bdc281be2b Nominal/Ex/Foo2.thy --- a/Nominal/Ex/Foo2.thy Thu Dec 23 00:22:41 2010 +0000 +++ b/Nominal/Ex/Foo2.thy Thu Dec 23 00:46:06 2010 +0000 @@ -24,10 +24,6 @@ "bn (As x y t a) = [atom x] @ bn a" | "bn (As_Nil) = []" - - - - thm foo.bn_defs thm foo.permute_bn thm foo.perm_bn_alpha @@ -39,6 +35,7 @@ thm foo.induct thm foo.inducts thm foo.exhaust +thm foo.strong_exhaust thm foo.fv_defs thm foo.bn_defs thm foo.perm_simps @@ -50,308 +47,6 @@ thm foo.supp thm foo.fresh -lemma at_set_avoiding5: - assumes "finite xs" - and "finite (supp c)" - shows "\p. (p \ xs) \* c \ supp p = xs \ p \ xs" -using assms -apply(erule_tac c="c" in at_set_avoiding) -apply(auto) -done - - -lemma Abs_rename_lst3: - fixes x::"'a::fs" - assumes a: "(p \ (set bs)) \* (bs, x)" - shows "\q. [bs]lst. x = [p \ bs]lst. (q \ x) \ p \ bs = q \ bs" -proof - - from a have "p \ (set bs) \ (set bs) = {}" using at_fresh_star_inter - by (simp add: fresh_star_Pair fresh_star_set) - with list_renaming_perm - obtain q where *: "q \ bs = p \ bs" and **: "supp q \ set bs \ (p \ set bs)" by metis - have "[bs]lst. x = q \ ([bs]lst. x)" - apply(rule perm_supp_eq[symmetric]) - using a ** - unfolding fresh_star_Pair - unfolding Abs_fresh_star_iff - unfolding fresh_star_def - by auto - also have "\ = [q \ bs]lst. (q \ x)" by simp - also have "\ = [p \ bs]lst. (q \ x)" using * by simp - finally have "[bs]lst. x = [p \ bs]lst. (q \ x)" . - then show "\q. [bs]lst. x = [p \ bs]lst. (q \ x) \ p \ bs = q \ bs" - using * ** by metis -qed - - -lemma - fixes c::"'a::fs" - assumes a: "\assg1 trm1 assg2 trm2. \((set (bn assg1)) \ (set (bn assg2))) \* c; y = Let1 assg1 trm1 assg2 trm2\ \ P" - shows "y = Let1 assg1 trm1 assg2 trm2 \ P" -apply - -apply(subgoal_tac "\p. (p \ ((set (bn assg1)) \ (set (bn assg2)))) \* (c, bn assg1, bn assg2, trm1, trm2) \ - supp p = (set (bn assg1)) \ (set (bn assg2)) \ (p \ ((set (bn assg1)) \ (set (bn assg2))))") -defer -apply(rule at_set_avoiding5) -apply(simp add: foo.bn_finite) -apply(simp add: supp_Pair finite_supp) -apply(erule exE) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair) -apply(erule conjE)+ -thm Abs_rename_lst -apply(insert Abs_rename_lst)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="bn assg1" in meta_spec) -apply(drule_tac x="trm1" in meta_spec) -apply(insert Abs_rename_lst)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="bn assg2" in meta_spec) -apply(drule_tac x="trm2" in meta_spec) -apply(drule meta_mp) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair fresh_star_Un) -apply(drule meta_mp) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair fresh_star_Un) -apply(erule exE)+ -apply(rule a) -apply(assumption) -apply(simp only: foo.eq_iff) -apply(perm_simp add: foo.permute_bn) -apply(rule conjI) -apply(rule refl) -apply(rule conjI) -apply(rule foo.perm_bn_alpha) -apply(rule conjI) -apply(perm_simp add: foo.permute_bn) -apply(rule refl) -apply(rule foo.perm_bn_alpha) -done - -lemma - fixes c::"'a::fs" - assumes a: "\assg1 trm1 assg2 trm2. \((set (bn assg1)) \ (set (bn assg2))) \* c; y = Let1 assg1 trm1 assg2 trm2\ \ P" - shows "y = Let1 assg1 trm1 assg2 trm2 \ P" -apply - -apply(subgoal_tac "\p. (p \ ((set (bn assg1)) \ (set (bn assg2)))) \* (c, bn assg1, bn assg2, trm1, trm2) \ - supp p = (set (bn assg1)) \ (set (bn assg2)) \ (p \ ((set (bn assg1)) \ (set (bn assg2))))") -defer -apply(rule at_set_avoiding5) -apply(simp add: foo.bn_finite) -apply(simp add: supp_Pair finite_supp) -apply(erule exE) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair) -apply(erule conjE)+ -apply(insert Abs_rename_lst3)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="bn assg1" in meta_spec) -apply(drule_tac x="trm1" in meta_spec) -apply(insert Abs_rename_lst3)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="bn assg2" in meta_spec) -apply(drule_tac x="trm2" in meta_spec) -apply(drule meta_mp) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair fresh_star_Un) -apply(drule meta_mp) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair fresh_star_Un) -apply(erule exE)+ -apply(erule conjE)+ -apply(simp add: foo.permute_bn) -apply(rule a) -apply(assumption) -apply(clarify) -apply(simp (no_asm) only: foo.eq_iff) -apply(rule conjI) -apply(assumption) -apply(rule conjI) -apply(rule foo.perm_bn_alpha) -apply(rule conjI) -apply(assumption) -apply(rule foo.perm_bn_alpha) -done - - -lemma - fixes c::"'a::fs" - assumes a: "\assg1 trm1 assg2 trm2. \((set (bn assg1)) \ (set (bn assg2))) \* c; y = Let1 assg1 trm1 assg2 trm2\ \ P" - shows "y = Let1 assg1 trm1 assg2 trm2 \ P" -apply - -apply(subgoal_tac "\p. (p \ ((set (bn assg1)) \ (set (bn assg2)))) \* (c, bn assg1, bn assg2, trm1, trm2) \ - supp p = (set (bn assg1)) \ (set (bn assg2)) \ (p \ ((set (bn assg1)) \ (set (bn assg2))))") -defer -apply(rule at_set_avoiding5) -apply(simp add: foo.bn_finite) -apply(simp add: supp_Pair finite_supp) -apply(erule exE) -apply(simp add: fresh_star_Pair) -apply(erule conjE)+ -apply(simp (no_asm_use) only: foo.permute_bn set_eqvt union_eqvt) -apply(rule a) -apply(assumption) -apply(clarify) -apply(simp (no_asm) only: foo.eq_iff) -apply(rule conjI) -apply(rule trans) -apply(rule_tac p="p" in supp_perm_eq[symmetric]) -apply(rule fresh_star_supp_conv) -apply(simp (no_asm_use) add: fresh_star_def) -apply(simp (no_asm_use) add: Abs_fresh_iff)[1] -apply(rule ballI) -apply(auto simp add: fresh_Pair)[1] -apply(simp (no_asm_use) only: permute_Abs) -apply(simp (no_asm_use) only: multi_recs.fv_bn_eqvt) -apply(simp) -apply(rule at_set_avoiding5) -apply(simp add: multi_recs.bn_finite) -apply(simp add: supp_Pair finite_supp) -apply(rule finite_sets_supp) -apply(simp add: multi_recs.bn_finite) -done - - - -lemma test6: - fixes c::"'a::fs" - assumes "\name. y = Var name \ P" - and "\trm1 trm2. y = App trm1 trm2 \ P" - and "\name trm. \{atom name} \* c; y = Lam name trm\ \ P" - and "\a1 trm1 a2 trm2. \((set (bn a1)) \ (set (bn a2))) \* c; y = Let1 a1 trm1 a2 trm2\ \ P" - and "\x1 x2 trm1 trm2. {atom x1, atom x2} \* c \ y = Let2 x1 x2 trm1 trm2 \ P" - shows "P" -apply(rule_tac y="y" in foo.exhaust(1)) -apply(rule assms(1)) -apply(assumption) -apply(rule assms(2)) -apply(assumption) -(* lam case *) -apply(subgoal_tac "\p. (p \ {atom name}) \* (c, name, trm)") -apply(erule exE) -apply(insert Abs_rename_lst)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="[atom name]" in meta_spec) -apply(drule_tac x="trm" in meta_spec) -apply(simp only: fresh_star_Pair set.simps) -apply(drule meta_mp) -apply(simp add: fresh_star_def fresh_Nil fresh_Cons fresh_atom_at_base) -apply(erule exE) -apply(rule assms(3)) -apply(perm_simp) -apply(erule conjE)+ -apply(assumption) -apply(clarify) -apply(simp (no_asm) add: foo.eq_iff) -apply(perm_simp) -apply(assumption) -apply(rule at_set_avoiding1) -apply(simp) -apply(simp add: finite_supp) -(* let1 case *) -apply(subgoal_tac "\p. (p \ ((set (bn assg1)) \ (set (bn assg2)))) \* (c, bn assg1, bn assg2, trm1, trm2)") -apply(erule exE) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair) -apply(erule conjE)+ -apply(insert Abs_rename_lst)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="bn assg1" in meta_spec) -apply(drule_tac x="trm1" in meta_spec) -apply(insert Abs_rename_lst)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="bn assg2" in meta_spec) -apply(drule_tac x="trm2" in meta_spec) -apply(drule meta_mp) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair fresh_star_Un) -apply(drule meta_mp) -apply(perm_simp add: foo.permute_bn) -apply(simp add: fresh_star_Pair fresh_star_Un) -apply(erule exE)+ -apply(rule assms(4)) -apply(assumption) -apply(simp add: foo.eq_iff refl) -apply(rule conjI) -apply(perm_simp add: foo.permute_bn) -apply(rule refl) -apply(rule conjI) -apply(rule foo.perm_bn_alpha) -apply(rule conjI) -apply(perm_simp add: foo.permute_bn) -apply(rule refl) -apply(rule foo.perm_bn_alpha) -apply(rule at_set_avoiding1) -apply(simp) -apply(simp add: finite_supp) -(* let2 case *) -apply(subgoal_tac "\p. (p \ ({atom name1} \ {atom name2})) \* (c, atom name1, atom name2, trm1, trm2)") -apply(erule exE) -apply(rule assms(5)) -apply(simp only:) -apply(simp only: foo.eq_iff) -apply(insert Abs_rename_list)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="[atom name1] @ [atom name2]" in meta_spec) -apply(drule_tac x="trm1" in meta_spec) -apply(insert Abs_rename_list)[1] -apply(drule_tac x="p" in meta_spec) -apply(drule_tac x="[atom name2]" in meta_spec) -apply(drule_tac x="trm2" in meta_spec) -apply(drule meta_mp) -apply(simp only: union_eqvt fresh_star_Pair fresh_star_list fresh_star_Un, simp) -apply(auto)[1] -apply(perm_simp) -apply(auto simp add: fresh_star_def)[1] -apply(perm_simp) -apply(auto simp add: fresh_star_def)[1] -apply(perm_simp) -apply(auto simp add: fresh_star_def)[1] -apply(drule meta_mp) -apply(perm_simp) -apply(auto simp add: fresh_star_def fresh_Pair fresh_Nil fresh_Cons)[1] -apply(erule exE)+ -apply(rule exI)+ -apply(perm_simp add: foo.permute_bn) -apply(rule conjI) -prefer 2 -apply(rule conjI) -apply(assumption) -apply(assumption) -apply(simp add: fresh_star_Pair) -apply(simp add: fresh_star_def) -apply(rule at_set_avoiding1) -apply(simp) -apply(simp add: finite_supp) -done - -lemma test5: - fixes c::"'a::fs" - assumes "\name. y = Var name \ P" - and "\trm1 trm2. y = App trm1 trm2 \ P" - and "\name trm. \{atom name} \* c; y = Lam name trm\ \ P" - and "\a1 trm1 a2 trm2. \((set (bn a1)) \ (set (bn a2))) \* c; y = Let1 a1 trm1 a2 trm2\ \ P" - and "\x1 x2 trm1 trm2. \{atom x1, atom x2} \* c; y = Let2 x1 x2 trm1 trm2\ \ P" - shows "P" -apply(rule_tac y="y" in test6) -apply(erule exE)+ -apply(rule assms(1)) -apply(assumption) -apply(erule exE)+ -apply(rule assms(2)) -apply(assumption) -apply(rule assms(3)) -apply(auto)[2] -apply(erule exE)+ -apply(rule assms(4)) -apply(auto)[2] -apply(erule exE)+ -apply(rule assms(5)) -apply(auto)[2] -done - - lemma strong_induct: fixes c :: "'a :: fs" and assg :: assg and trm :: trm @@ -362,15 +57,15 @@ \((set (bn a1)) \ (set (bn a2))) \* c; \d. P2 c a1; \d. P1 d t1; \d. P2 d a2; \d. P1 d t2\ \ P1 c (Let1 a1 t1 a2 t2)" and a4: "\n1 n2 t1 t2 c. - \{atom n1, atom n2} \* c; \d. P1 d t1; \d. P1 d t2\ \ P1 c (Let2 n1 n2 t1 t2)" + \({atom n1} \ {atom n2}) \* c; \d. P1 d t1; \d. P1 d t2\ \ P1 c (Let2 n1 n2 t1 t2)" and a5: "\c. P2 c As_Nil" and a6: "\name1 name2 trm assg c. \\d. P1 d trm; \d. P2 d assg\ \ P2 c (As name1 name2 trm assg)" shows "P1 c trm" "P2 c assg" using assms apply(induction_schema) - apply(rule_tac y="trm" and c="c" in test5) + apply(rule_tac y="trm" and c="c" in foo.strong_exhaust(1)) apply(simp_all)[5] - apply(rule_tac y="assg" in foo.exhaust(2)) + apply(rule_tac ya="assg" in foo.strong_exhaust(2)) apply(simp_all)[2] apply(relation "measure (sum_case (size o snd) (size o snd))") apply(simp_all add: foo.size)