# HG changeset patch # User Cezary Kaliszyk # Date 1269450153 -3600 # Node ID 8b4595cb552418f8b702f92a5d22e1b6ef8f0176 # Parent b6656b707a8db65625318ecbbddf8a49bd91aaf0 Further in the strong induction proof. diff -r b6656b707a8d -r 8b4595cb5524 Nominal/ExCoreHaskell.thy --- a/Nominal/ExCoreHaskell.thy Wed Mar 24 16:06:31 2010 +0100 +++ b/Nominal/ExCoreHaskell.thy Wed Mar 24 18:02:33 2010 +0100 @@ -88,11 +88,99 @@ lemmas fv_supp=tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.supp(1-9,11,13,15) lemmas supp=tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.fv[simplified fv_supp] lemmas perm=tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.perm +lemmas eq_iff=tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.eq_iff +lemmas inducts=tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.inducts lemma fresh_star_minus_perm: "as \* - p = as \* (p :: perm)" unfolding fresh_star_def Ball_def by auto (simp_all add: fresh_minus_perm) +lemma fv_alpha1: "fv_bv_tvtk x \* pa \ alpha_bv_tvtk (pa \ x) x" +apply (induct x rule: inducts(11)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: eq_iff fresh_star_union) +apply (subst supp_perm_eq) +apply (simp_all add: fv_supp) +done + +lemma fv_alpha2: "fv_bv_tvck x \* pa \ alpha_bv_tvck (pa \ x) x" +apply (induct x rule: inducts(12)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: eq_iff fresh_star_union) +apply (subst supp_perm_eq) +apply (simp_all add: fv_supp) +done + +lemma fv_alpha3: "fv_bv_vt x \* pa \ alpha_bv_vt (pa \ x) x" +apply (induct x rule: inducts(10)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: eq_iff fresh_star_union) +apply (subst supp_perm_eq) +apply (simp_all add: fv_supp) +done + +lemma fv_alpha: "fv_bv x \* pa \ alpha_bv (pa \ x) x" +apply (induct x rule: inducts(9)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: eq_iff fresh_star_union) +apply (simp add: fv_alpha1 fv_alpha2 fv_alpha3) +apply (simp add: eqvts) +done + +lemma fin1: "finite (fv_bv_tvtk x)" +apply (induct x rule: inducts(11)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: fv_supp finite_supp) +done + +lemma fin2: "finite (fv_bv_tvck x)" +apply (induct x rule: inducts(12)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: fv_supp finite_supp) +done + +lemma fin3: "finite (fv_bv_vt x)" +apply (induct x rule: inducts(10)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: fv_supp finite_supp) +done + +lemma fin_fv_bv: "finite (fv_bv x)" +apply (induct x rule: inducts(9)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp add: fin1 fin2 fin3) +done + +lemma finb1: "finite (bv_tvtk x)" +apply (induct x rule: inducts(11)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: fv_supp finite_supp) +done + +lemma finb2: "finite (bv_tvck x)" +apply (induct x rule: inducts(12)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: fv_supp finite_supp) +done + +lemma finb3: "finite (bv_vt x)" +apply (induct x rule: inducts(10)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp_all add: fv_supp finite_supp) +done + +lemma fin_bv: "finite (bv x)" +apply (induct x rule: inducts(9)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp add: finb1 finb2 finb3) +done + +lemma "bv x \* fv_bv x" +apply (induct x rule: inducts(9)) +apply (tactic {* ALLGOALS (TRY o rtac @{thm TrueI}) *}) +apply (simp) +oops + lemma assumes a01: "\b. P1 b KStar" and a02: "\tkind1 tkind2 b. \\c. P1 c tkind1; \c. P1 c tkind2\ \ P1 b (KFun tkind1 tkind2)" @@ -152,10 +240,10 @@ P2 (b :: 'b :: pt) ckind \ P3 (c :: 'c :: {pt,fs}) ty \ P4 (d :: 'd :: pt) ty_lst \ - P5 (e :: 'e :: pt) co \ + P5 (e :: 'e :: {pt,fs}) co \ P6 (f :: 'f :: pt) co_lst \ P7 (g :: 'g :: pt) trm \ - P8 (h :: 'h :: pt) assoc_lst \ + P8 (h :: 'h :: {pt,fs}) assoc_lst \ P9 (i :: 'i :: pt) pat \ P10 (j :: 'j :: pt) vt_lst \ P11 (k :: 'k :: pt) tvtk_lst \ @@ -165,53 +253,142 @@ apply (rule tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.induct) apply (tactic {* ALLGOALS (REPEAT o rtac allI) *}) apply (tactic {* ALLGOALS (TRY o SOLVED' (simp_tac @{simpset} THEN_ALL_NEW resolve_tac @{thms assms} THEN_ALL_NEW asm_full_simp_tac @{simpset})) *}) - apply(subgoal_tac "\pa. ((pa \ (atom (p \ tvar))) \ c \ supp (Abs (p \ {atom tvar}) (p \ ty)) \* pa)") - prefer 2 + +(* GOAL1 *) + apply(subgoal_tac "\pa. ((pa \ (atom (p \ tvar))) \ c \ + supp (Abs (p \ {atom tvar}) (p \ ty)) \* pa)") + apply clarify + apply (simp only: perm) + apply(rule_tac t="TAll (p \ tvar) (p \ tkind) (p \ ty)" + and s="TAll (pa \ p \ tvar) (p \ tkind) (pa \ p \ ty)" in subst) + apply (simp only: eq_iff) + apply (rule_tac x="-pa" in exI) + apply (simp add: alphas eqvts eqvts_raw supp_Abs fv_supp) + apply (rule_tac t="supp (pa \ p \ ty) - {atom (pa \ p \ tvar)}" + and s="pa \ (p \ supp ty - {p \ atom tvar})" in subst) + apply (simp add: eqvts) + apply (simp add: eqvts[symmetric]) + apply (rule conjI) + apply (rule supp_perm_eq) + apply (simp add: eqvts) + apply (subst supp_finite_atom_set) + apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) + apply (simp add: eqvts) + apply (simp add: eqvts) + apply (subst supp_perm_eq) + apply (subst supp_finite_atom_set) + apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) + apply (simp add: eqvts) + apply assumption + apply (simp add: fresh_star_minus_perm) + apply (rule a08) + apply simp + apply(rotate_tac 1) + apply(erule_tac x="(pa + p)" in allE) + apply simp + apply (simp add: eqvts eqvts_raw) apply (rule at_set_avoiding2_atom) apply (simp add: finite_supp) apply (simp add: finite_supp) apply (simp add: fresh_def) apply (simp only: supp_Abs eqvts) apply blast + +(* GOAL2 *) + apply(subgoal_tac "\pa. ((pa \ (atom (p \ tvar))) \ e \ + supp (Abs (p \ {atom tvar}) (p \ co)) \* pa)") apply clarify apply (simp only: perm) - apply(rule_tac t="TAll (p \ tvar) (p \ tkind) (p \ ty)" and s="TAll (pa \ p \ tvar) (p \ tkind) (pa \ p \ ty)" in subst) - apply (simp only: tkind_ckind_ty_ty_lst_co_co_lst_trm_assoc_lst_pat_vt_lst_tvtk_lst_tvck_lst.eq_iff) + apply(rule_tac t="CAll (p \ tvar) (p \ ckind) (p \ co)" + and s="CAll (pa \ p \ tvar) (p \ ckind) (pa \ p \ co)" in subst) + apply (simp only: eq_iff) apply (rule_tac x="-pa" in exI) - apply (simp add: alphas) - prefer 2 - apply (rule a08) - apply simp - apply(rotate_tac 1) - apply(erule_tac x="(pa + p)" in allE) - apply simp - apply (simp add: eqvts eqvts_raw) - apply (simp add: eqvts eqvts_raw supp_Abs) + apply (simp add: alphas eqvts eqvts_raw supp_Abs fv_supp) + apply (rule_tac t="supp (pa \ p \ co) - {atom (pa \ p \ tvar)}" + and s="pa \ (p \ supp co - {p \ atom tvar})" in subst) + apply (simp add: eqvts) + apply (simp add: eqvts[symmetric]) apply (rule conjI) - apply (simp add: eqvts[symmetric]) - apply (simp add: fv_supp) - apply (rule_tac t="pa \ p \ supp ty - {pa \ p \ atom tvar}" - and s="pa \ (p \ supp ty - {p \ atom tvar})" in subst) - apply (simp add: eqvts) apply (rule supp_perm_eq) apply (simp add: eqvts) apply (subst supp_finite_atom_set) apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) apply (simp add: eqvts) apply (simp add: eqvts) - apply (simp add: fv_supp) - apply (simp add: eqvts[symmetric]) - apply (rule_tac t="pa \ p \ supp ty - {pa \ p \ atom tvar}" - and s="pa \ (p \ supp ty - {p \ atom tvar})" in subst) - apply (simp add: eqvts) apply (subst supp_perm_eq) apply (subst supp_finite_atom_set) apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) apply (simp add: eqvts) apply assumption apply (simp add: fresh_star_minus_perm) + apply (rule a15) + apply simp + apply(rotate_tac 1) + apply(erule_tac x="(pa + p)" in allE) + apply simp + apply (simp add: eqvts eqvts_raw) + apply (rule at_set_avoiding2_atom) + apply (simp add: finite_supp) + apply (simp add: finite_supp) + apply (simp add: fresh_def) + apply (simp only: supp_Abs eqvts) + apply blast + +prefer 5 +(* using a38*) + apply(subgoal_tac "\pa. ((pa \ (bv (p \ pat))) \* h \ + supp (Abs (p \ (bv pat)) (p \ trm), fv_bv (p \ pat)) \* pa)") + apply clarify + apply (simp only: perm) + apply(rule_tac t="ACons (p \ pat) (p \ trm) (p \ assoc_lst)" + and s="ACons (pa \ p \ pat) (pa \ p \ trm) (p \ assoc_lst)" in subst) + apply (simp only: eq_iff supp_Pair fresh_star_union) + apply (erule conjE) + apply (rule_tac x="-pa" in exI) + apply (simp add: alphas eqvts eqvts_raw supp_Abs fv_supp) + apply (rule_tac t="supp (pa \ p \ trm) - bv (pa \ p \ pat)" + and s="pa \ (supp (p \ trm) - bv (p \ pat))" in subst) + apply (simp add: eqvts) + apply (rule conjI) + apply (rule fv_alpha) + apply (rule_tac s="supp (fv_bv (p \ pat))" + and t="fv_bv (p \ pat)" in subst) + apply (rule supp_finite_atom_set[OF fin_fv_bv]) + apply (assumption) + apply (rule conjI) + apply (simp add: eqvts[symmetric]) + apply (rule supp_perm_eq) + apply (simp add: eqvts) + apply (subst supp_finite_atom_set) + apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) + apply (simp add: eqvts) + apply (simp add: eqvts) + apply (subst supp_perm_eq) + apply (subst supp_finite_atom_set) + apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) + apply (simp add: eqvts) + apply assumption + apply (simp add: fresh_star_minus_perm) + apply (rule a38) + apply(erule_tac x="(pa + p)" in allE) + apply simp + apply(rotate_tac 1) + apply(erule_tac x="(pa + p)" in allE) + apply simp + apply simp + apply (simp add: eqvts eqvts_raw) + apply (rule at_set_avoiding2) + apply (simp add: fin_bv) + apply (simp add: finite_supp) + apply (simp add: supp_Pair supp_Abs supp_finite_atom_set[OF fin_fv_bv] fin_fv_bv) + apply (rule finite_Diff) + apply (simp add: eqvts[symmetric] finite_eqvt[symmetric] finite_supp) + apply (simp add: True_eqvt) + apply (simp add: fresh_star_prod eqvts[symmetric]) + apply (rule conjI) + apply (simp add: fresh_star_def fresh_def supp_Abs) + apply (simp add: fresh_star_permute_iff) sorry - have g1: "P1 a (0 \ tkind)" using a[THEN conjunct1] by blast have g2: "P2 b (0 \ ckind)" using a[THEN conjunct2,THEN conjunct1] by blast have g3: "P3 c (0 \ ty) \