# HG changeset patch # User Cezary Kaliszyk # Date 1265035585 -3600 # Node ID 6f2bbe35987a7e82daf95251bacad19d4dfada50 # Parent 2ebfbd8618465d89e8d15f30c310defa79eeb7a1# Parent 7c633507a809b9fd9f60e59a47c74c2e6c9adbfb merge diff -r 7c633507a809 -r 6f2bbe35987a Quot/Examples/LamEx2.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Quot/Examples/LamEx2.thy Mon Feb 01 15:46:25 2010 +0100 @@ -0,0 +1,632 @@ +theory LamEx +imports Nominal "../QuotMain" "../QuotList" +begin + +atom_decl name + +datatype rlam = + rVar "name" +| rApp "rlam" "rlam" +| rLam "name" "rlam" + +fun + rfv :: "rlam \ name set" +where + rfv_var: "rfv (rVar a) = {a}" +| rfv_app: "rfv (rApp t1 t2) = (rfv t1) \ (rfv t2)" +| rfv_lam: "rfv (rLam a t) = (rfv t) - {a}" + +overloading + perm_rlam \ "perm :: 'x prm \ rlam \ rlam" (unchecked) +begin + +fun + perm_rlam +where + "perm_rlam pi (rVar a) = rVar (pi \ a)" +| "perm_rlam pi (rApp t1 t2) = rApp (perm_rlam pi t1) (perm_rlam pi t2)" +| "perm_rlam pi (rLam a t) = rLam (pi \ a) (perm_rlam pi t)" + +end + +declare perm_rlam.simps[eqvt] + +instance rlam::pt_name + apply(default) + apply(induct_tac [!] x rule: rlam.induct) + apply(simp_all add: pt_name2 pt_name3) + done + +instance rlam::fs_name + apply(default) + apply(induct_tac [!] x rule: rlam.induct) + apply(simp add: supp_def) + apply(fold supp_def) + apply(simp add: supp_atm) + apply(simp add: supp_def Collect_imp_eq Collect_neg_eq) + apply(simp add: supp_def) + apply(simp add: supp_def Collect_imp_eq Collect_neg_eq[symmetric]) + apply(fold supp_def) + apply(simp add: supp_atm) + done + +declare set_diff_eqvt[eqvt] + +lemma rfv_eqvt[eqvt]: + fixes pi::"name prm" + shows "(pi\rfv t) = rfv (pi\t)" +apply(induct t) +apply(simp_all) +apply(simp add: perm_set_eq) +apply(simp add: union_eqvt) +apply(simp add: set_diff_eqvt) +apply(simp add: perm_set_eq) +done + +inductive + alpha :: "rlam \ rlam \ bool" ("_ \ _" [100, 100] 100) +where + a1: "a = b \ (rVar a) \ (rVar b)" +| a2: "\t1 \ t2; s1 \ s2\ \ rApp t1 s1 \ rApp t2 s2" +| a3: "\pi::name prm. (rfv t - {a} = rfv s - {b} \ (rfv t - {a})\* pi \ (pi \ t) \ s \ (pi \ a) = b) + \ rLam a t \ rLam b s" + + + + +(* should be automatic with new version of eqvt-machinery *) +lemma alpha_eqvt: + fixes pi::"name prm" + shows "t \ s \ (pi \ t) \ (pi \ s)" +apply(induct rule: alpha.induct) +apply(simp add: a1) +apply(simp add: a2) +apply(simp) +apply(rule a3) +apply(erule conjE) +apply(erule exE) +apply(erule conjE) +apply(rule_tac x="pi \ pia" in exI) +apply(rule conjI) +apply(rule_tac pi1="rev pi" in perm_bij[THEN iffD1]) +apply(perm_simp add: eqvts) +apply(rule conjI) +apply(rule_tac pi1="rev pi" in pt_fresh_star_bij(1)[OF pt_name_inst at_name_inst, THEN iffD1]) +apply(perm_simp add: eqvts) +apply(rule conjI) +apply(subst perm_compose[symmetric]) +apply(simp) +apply(subst perm_compose[symmetric]) +apply(simp) +done + +lemma alpha_refl: + shows "t \ t" +apply(induct t rule: rlam.induct) +apply(simp add: a1) +apply(simp add: a2) +apply(rule a3) +apply(rule_tac x="[]" in exI) +apply(simp_all add: fresh_star_def fresh_list_nil) +done + +lemma alpha_sym: + shows "t \ s \ s \ t" +apply(induct rule: alpha.induct) +apply(simp add: a1) +apply(simp add: a2) +apply(rule a3) +apply(erule exE) +apply(rule_tac x="rev pi" in exI) +apply(simp) +apply(simp add: fresh_star_def fresh_list_rev) +apply(rule conjI) +apply(erule conjE)+ +apply(rotate_tac 3) +apply(drule_tac pi="rev pi" in alpha_eqvt) +apply(perm_simp) +apply(rule pt_bij2[OF pt_name_inst at_name_inst]) +apply(simp) +done + +lemma alpha_trans: + shows "t1 \ t2 \ t2 \ t3 \ t1 \ t3" +apply(induct arbitrary: t3 rule: alpha.induct) +apply(erule alpha.cases) +apply(simp_all) +apply(simp add: a1) +apply(rotate_tac 4) +apply(erule alpha.cases) +apply(simp_all) +apply(simp add: a2) +apply(rotate_tac 1) +apply(erule alpha.cases) +apply(simp_all) +apply(erule conjE)+ +apply(erule exE)+ +apply(erule conjE)+ +apply(rule a3) +apply(rule_tac x="pia @ pi" in exI) +apply(simp add: fresh_star_def fresh_list_append) +apply(simp add: pt_name2) +apply(drule_tac x="rev pia \ sa" in spec) +apply(drule mp) +apply(rotate_tac 8) +apply(drule_tac pi="rev pia" in alpha_eqvt) +apply(perm_simp) +apply(rotate_tac 11) +apply(drule_tac pi="pia" in alpha_eqvt) +apply(perm_simp) +done + +lemma alpha_equivp: + shows "equivp alpha" +apply(rule equivpI) +unfolding reflp_def symp_def transp_def +apply(auto intro: alpha_refl alpha_sym alpha_trans) +done + +lemma alpha_rfv: + shows "t \ s \ rfv t = rfv s" +apply(induct rule: alpha.induct) +apply(simp) +apply(simp) +apply(simp) +done + +quotient_type lam = rlam / alpha + by (rule alpha_equivp) + + +quotient_definition + "Var :: name \ lam" +as + "rVar" + +quotient_definition + "App :: lam \ lam \ lam" +as + "rApp" + +quotient_definition + "Lam :: name \ lam \ lam" +as + "rLam" + +quotient_definition + "fv :: lam \ name set" +as + "rfv" + +(* definition of overloaded permutation function *) +(* for the lifted type lam *) +overloading + perm_lam \ "perm :: 'x prm \ lam \ lam" (unchecked) +begin + +quotient_definition + "perm_lam :: 'x prm \ lam \ lam" +as + "perm::'x prm \ rlam \ rlam" + +end + +lemma perm_rsp[quot_respect]: + "(op = ===> alpha ===> alpha) op \ op \" + apply(auto) + (* this is propably true if some type conditions are imposed ;o) *) + sorry + +lemma fresh_rsp: + "(op = ===> alpha ===> op =) fresh fresh" + apply(auto) + (* this is probably only true if some type conditions are imposed *) + sorry + +lemma rVar_rsp[quot_respect]: + "(op = ===> alpha) rVar rVar" + by (auto intro: a1) + +lemma rApp_rsp[quot_respect]: "(alpha ===> alpha ===> alpha) rApp rApp" + by (auto intro: a2) + +lemma rLam_rsp[quot_respect]: "(op = ===> alpha ===> alpha) rLam rLam" + apply(auto) + apply(rule a3) + apply(rule_tac x="[]" in exI) + unfolding fresh_star_def + apply(simp add: fresh_list_nil) + apply(simp add: alpha_rfv) + done + +lemma rfv_rsp[quot_respect]: + "(alpha ===> op =) rfv rfv" +apply(simp add: alpha_rfv) +done + +section {* lifted theorems *} + +lemma lam_induct: + "\\name. P (Var name); + \lam1 lam2. \P lam1; P lam2\ \ P (App lam1 lam2); + \name lam. P lam \ P (Lam name lam)\ + \ P lam" + by (lifting rlam.induct) + +lemma perm_lam [simp]: + fixes pi::"'a prm" + shows "pi \ Var a = Var (pi \ a)" + and "pi \ App t1 t2 = App (pi \ t1) (pi \ t2)" + and "pi \ Lam a t = Lam (pi \ a) (pi \ t)" +apply(lifting perm_rlam.simps) +done + +instance lam::pt_name +apply(default) +apply(induct_tac [!] x rule: lam_induct) +apply(simp_all add: pt_name2 pt_name3) +done + +lemma fv_lam [simp]: + shows "fv (Var a) = {a}" + and "fv (App t1 t2) = fv t1 \ fv t2" + and "fv (Lam a t) = fv t - {a}" +apply(lifting rfv_var rfv_app rfv_lam) +done + + +lemma a1: + "a = b \ Var a = Var b" + by (lifting a1) + +lemma a2: + "\x = xa; xb = xc\ \ App x xb = App xa xc" + by (lifting a2) + +lemma a3: + "\\pi::name prm. (fv t - {a} = fv s - {b} \ (fv t - {a})\* pi \ (pi \ t) = s \ (pi \ a) = b)\ + \ Lam a t = Lam b s" + by (lifting a3) + +lemma alpha_cases: + "\a1 = a2; \a b. \a1 = Var a; a2 = Var b; a = b\ \ P; + \x xa xb xc. \a1 = App x xb; a2 = App xa xc; x = xa; xb = xc\ \ P; + \t a s b. \a1 = Lam a t; a2 = Lam b s; + \pi::name prm. fv t - {a} = fv s - {b} \ (fv t - {a}) \* pi \ (pi \ t) = s \ pi \ a = b\ \ P\ + \ P" + by (lifting alpha.cases) + +lemma alpha_induct: + "\qx = qxa; \a b. a = b \ qxb (Var a) (Var b); + \x xa xb xc. \x = xa; qxb x xa; xb = xc; qxb xb xc\ \ qxb (App x xb) (App xa xc); + \t a s b. + \\pi::name prm. fv t - {a} = fv s - {b} \ + (fv t - {a}) \* pi \ ((pi \ t) = s \ qxb (pi \ t) s) \ pi \ a = b\ \ qxb (Lam a t) (Lam b s)\ + \ qxb qx qxa" + by (lifting alpha.induct) + +lemma lam_inject [simp]: + shows "(Var a = Var b) = (a = b)" + and "(App t1 t2 = App s1 s2) = (t1 = s1 \ t2 = s2)" +apply(lifting rlam.inject(1) rlam.inject(2)) +apply(auto) +apply(drule alpha.cases) +apply(simp_all) +apply(simp add: alpha.a1) +apply(drule alpha.cases) +apply(simp_all) +apply(drule alpha.cases) +apply(simp_all) +apply(rule alpha.a2) +apply(simp_all) +done + +lemma rlam_distinct: + shows "\(rVar nam \ rApp rlam1' rlam2')" + and "\(rApp rlam1' rlam2' \ rVar nam)" + and "\(rVar nam \ rLam nam' rlam')" + and "\(rLam nam' rlam' \ rVar nam)" + and "\(rApp rlam1 rlam2 \ rLam nam' rlam')" + and "\(rLam nam' rlam' \ rApp rlam1 rlam2)" +apply auto +apply(erule alpha.cases) +apply simp_all +apply(erule alpha.cases) +apply simp_all +apply(erule alpha.cases) +apply simp_all +apply(erule alpha.cases) +apply simp_all +apply(erule alpha.cases) +apply simp_all +apply(erule alpha.cases) +apply simp_all +done + +lemma lam_distinct[simp]: + shows "Var nam \ App lam1' lam2'" + and "App lam1' lam2' \ Var nam" + and "Var nam \ Lam nam' lam'" + and "Lam nam' lam' \ Var nam" + and "App lam1 lam2 \ Lam nam' lam'" + and "Lam nam' lam' \ App lam1 lam2" +apply(lifting rlam_distinct(1) rlam_distinct(2) rlam_distinct(3) rlam_distinct(4) rlam_distinct(5) rlam_distinct(6)) +done + +lemma var_supp1: + shows "(supp (Var a)) = ((supp a)::name set)" + by (simp add: supp_def) + +lemma var_supp: + shows "(supp (Var a)) = {a::name}" + using var_supp1 by (simp add: supp_atm) + +lemma app_supp: + shows "supp (App t1 t2) = (supp t1) \ ((supp t2)::name set)" +apply(simp only: perm_lam supp_def lam_inject) +apply(simp add: Collect_imp_eq Collect_neg_eq) +done + +lemma lam_supp: + shows "supp (Lam x t) = ((supp ([x].t))::name set)" +apply(simp add: supp_def) +apply(simp add: abs_perm) +sorry + + +instance lam::fs_name +apply(default) +apply(induct_tac x rule: lam_induct) +apply(simp add: var_supp) +apply(simp add: app_supp) +apply(simp add: lam_supp abs_supp) +done + +lemma fresh_lam: + "(a \ Lam b t) \ (a = b) \ (a \ b \ a \ t)" +apply(simp add: fresh_def) +apply(simp add: lam_supp abs_supp) +apply(auto) +done + +lemma lam_induct_strong: + fixes a::"'a::fs_name" + assumes a1: "\name b. P b (Var name)" + and a2: "\lam1 lam2 b. \\c. P c lam1; \c. P c lam2\ \ P b (App lam1 lam2)" + and a3: "\name lam b. \\c. P c lam; name \ b\ \ P b (Lam name lam)" + shows "P a lam" +proof - + have "\(pi::name prm) a. P a (pi \ lam)" + proof (induct lam rule: lam_induct) + case (1 name pi) + show "P a (pi \ Var name)" + apply (simp) + apply (rule a1) + done + next + case (2 lam1 lam2 pi) + have b1: "\(pi::name prm) a. P a (pi \ lam1)" by fact + have b2: "\(pi::name prm) a. P a (pi \ lam2)" by fact + show "P a (pi \ App lam1 lam2)" + apply (simp) + apply (rule a2) + apply (rule b1) + apply (rule b2) + done + next + case (3 name lam pi a) + have b: "\(pi::name prm) a. P a (pi \ lam)" by fact + obtain c::name where fr: "c\(a, pi\name, pi\lam)" + apply(rule exists_fresh[of "(a, pi\name, pi\lam)"]) + apply(simp_all add: fs_name1) + done + from b fr have p: "P a (Lam c (([(c, pi\name)]@pi)\lam))" + apply - + apply(rule a3) + apply(blast) + apply(simp) + done + have eq: "[(c, pi\name)] \ Lam (pi \ name) (pi \ lam) = Lam (pi \ name) (pi \ lam)" + apply(rule perm_fresh_fresh) + using fr + apply(simp add: fresh_lam) + apply(simp add: fresh_lam) + done + show "P a (pi \ Lam name lam)" + apply (simp) + apply(subst eq[symmetric]) + using p + apply(simp only: perm_lam pt_name2 swap_simps) + done + qed + then have "P a (([]::name prm) \ lam)" by blast + then show "P a lam" by simp +qed + + +lemma var_fresh: + fixes a::"name" + shows "(a \ (Var b)) = (a \ b)" + apply(simp add: fresh_def) + apply(simp add: var_supp1) + done + +(* lemma hom_reg: *) + +lemma rlam_rec_eqvt: + fixes pi::"name prm" + and f1::"name \ ('a::pt_name)" + shows "(pi\rlam_rec f1 f2 f3 t) = rlam_rec (pi\f1) (pi\f2) (pi\f3) (pi\t)" +apply(induct t) +apply(simp_all) +apply(simp add: perm_fun_def) +apply(perm_simp) +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +back +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +apply(simp) +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +back +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +apply(subst pt_fun_app_eq[OF pt_name_inst at_name_inst]) +apply(simp) +done + + +lemma rlam_rec_respects: + assumes f1: "f_var \ Respects (op= ===> op=)" + and f2: "f_app \ Respects (alpha ===> alpha ===> op= ===> op= ===> op=)" + and f3: "f_lam \ Respects (op= ===> alpha ===> op= ===> op=)" + shows "rlam_rec f_var f_app f_lam \ Respects (alpha ===> op =)" +apply(simp add: mem_def) +apply(simp add: Respects_def) +apply(rule allI) +apply(rule allI) +apply(rule impI) +apply(erule alpha.induct) +apply(simp) +apply(simp) +using f2 +apply(simp add: mem_def) +apply(simp add: Respects_def) +using f3[simplified mem_def Respects_def] +apply(simp) +apply(case_tac "a=b") +apply(clarify) +apply(simp) +(* probably true *) +sorry + +function + term1_hom :: "(name \ 'a) \ + (rlam \ rlam \ 'a \ 'a \ 'a) \ + ((name \ rlam) \ (name \ 'a) \ 'a) \ rlam \ 'a" +where + "term1_hom var app abs' (rVar x) = (var x)" +| "term1_hom var app abs' (rApp t u) = + app t u (term1_hom var app abs' t) (term1_hom var app abs' u)" +| "term1_hom var app abs' (rLam x u) = + abs' (\y. [(x, y)] \ u) (\y. term1_hom var app abs' ([(x, y)] \ u))" +apply(pat_completeness) +apply(auto) +done + +lemma pi_size: + fixes pi::"name prm" + and t::"rlam" + shows "size (pi \ t) = size t" +apply(induct t) +apply(auto) +done + +termination term1_hom + apply(relation "measure (\(f1, f2, f3, t). size t)") +apply(auto simp add: pi_size) +done + +lemma lam_exhaust: + "\\name. y = Var name \ P; \rlam1 rlam2. y = App rlam1 rlam2 \ P; \name rlam. y = Lam name rlam \ P\ + \ P" +apply(lifting rlam.exhaust) +done + +(* THIS IS NOT TRUE, but it lets prove the existence of the hom function *) +lemma lam_inject': + "(Lam a x = Lam b y) = ((\c. [(a, c)] \ x) = (\c. [(b, c)] \ y))" +sorry + +function + hom :: "(name \ 'a) \ + (lam \ lam \ 'a \ 'a \ 'a) \ + ((name \ lam) \ (name \ 'a) \ 'a) \ lam \ 'a" +where + "hom f_var f_app f_lam (Var x) = f_var x" +| "hom f_var f_app f_lam (App l r) = f_app l r (hom f_var f_app f_lam l) (hom f_var f_app f_lam r)" +| "hom f_var f_app f_lam (Lam a x) = f_lam (\b. ([(a,b)] \ x)) (\b. hom f_var f_app f_lam ([(a,b)] \ x))" +defer +apply(simp_all add: lam_inject') (* inject, distinct *) +apply(tactic {* Cong_Tac.cong_tac @{thm cong} 1 *}) +apply(rule refl) +apply(rule ext) +apply(tactic {* Cong_Tac.cong_tac @{thm cong} 1 *}) +apply simp_all +apply(erule conjE)+ +apply(rule_tac x="b" in cong) +apply simp_all +apply auto +apply(rule_tac y="b" in lam_exhaust) +apply simp_all +apply auto +apply meson +apply(simp_all add: lam_inject') +apply metis +done + +termination hom + apply - +(* +ML_prf {* Size.size_thms @{theory} "LamEx.lam" *} +*) +sorry + +thm hom.simps + +lemma term1_hom_rsp: + "\(alpha ===> alpha ===> op =) f_app f_app; ((op = ===> alpha) ===> op =) f_lam f_lam\ + \ (alpha ===> op =) (term1_hom f_var f_app f_lam) (term1_hom f_var f_app f_lam)" +apply(simp) +apply(rule allI)+ +apply(rule impI) +apply(erule alpha.induct) +apply(auto)[1] +apply(auto)[1] +apply(simp) +apply(erule conjE)+ +apply(erule exE)+ +apply(erule conjE)+ +apply(clarify) +sorry + +lemma hom: " +\f_var. \f_app \ Respects(alpha ===> alpha ===> op =). +\f_lam \ Respects((op = ===> alpha) ===> op =). +\hom\Respects (alpha ===> op =). + ((\x. hom (rVar x) = f_var x) \ + (\l r. hom (rApp l r) = f_app l r (hom l) (hom r)) \ + (\x a. hom (rLam a x) = f_lam (\b. ([(a,b)]\ x)) (\b. hom ([(a,b)] \ x))))" +apply(rule allI) +apply(rule ballI)+ +apply(rule_tac x="term1_hom f_var f_app f_lam" in bexI) +apply(simp_all) +apply(simp only: in_respects) +apply(rule term1_hom_rsp) +apply(assumption)+ +done + +lemma hom': +"\hom. + ((\x. hom (Var x) = f_var x) \ + (\l r. hom (App l r) = f_app l r (hom l) (hom r)) \ + (\x a. hom (Lam a x) = f_lam (\b. ([(a,b)] \ x)) (\b. hom ([(a,b)] \ x))))" +apply (lifting hom) +done + +(* test test +lemma raw_hom_correct: + assumes f1: "f_var \ Respects (op= ===> op=)" + and f2: "f_app \ Respects (alpha ===> alpha ===> op= ===> op= ===> op=)" + and f3: "f_lam \ Respects ((op= ===> alpha) ===> (op= ===> op=) ===> op=)" + shows "\!hom\Respects (alpha ===> op =). + ((\x. hom (rVar x) = f_var x) \ + (\l r. hom (rApp l r) = f_app l r (hom l) (hom r)) \ + (\x a. hom (rLam a x) = f_lam (\b. ([(a,b)]\ x)) (\b. hom ([(a,b)] \ x))))" +unfolding Bex1_def +apply(rule ex1I) +sorry +*) + + +end + diff -r 7c633507a809 -r 6f2bbe35987a Quot/Nominal/LamEx.thy --- a/Quot/Nominal/LamEx.thy Mon Feb 01 15:32:20 2010 +0100 +++ b/Quot/Nominal/LamEx.thy Mon Feb 01 15:46:25 2010 +0100 @@ -1,5 +1,5 @@ theory LamEx -imports "Nominal2_Atoms" "Nominal2_Eqvt" "Nominal2_Supp" "../QuotMain" "Abs" +imports "Nominal2_Atoms" "Nominal2_Eqvt" "Nominal2_Supp" "../QuotMain" "Abs" "../QuotProd" begin @@ -26,13 +26,6 @@ apply(simp) done -lemma fresh_minus_perm: - fixes p::perm - shows "a \ (- p) \ a \ p" - apply(simp add: fresh_def) - apply(simp only: supp_minus_perm) - done - lemma fresh_plus: fixes p q::perm shows "\a \ p; a \ q\ \ a \ (p + q)" @@ -153,12 +146,13 @@ where a1: "a = b \ (rVar a) \ (rVar b)" | a2: "\t1 \ t2; s1 \ s2\ \ rApp t1 s1 \ rApp t2 s2" -| a3: "\pi. (rfv t - {atom a} = rfv s - {atom b} \ (rfv t - {atom a})\* pi \ (pi \ t) \ s) - \ rLam a t \ rLam b s" +| a3: "\pi. (({atom a}, t) \gen alpha rfv pi ({atom b}, s)) \ rLam a t \ rLam b s" + +thm alpha.induct lemma a3_inverse: assumes "rLam a t \ rLam b s" - shows "\pi. (rfv t - {atom a} = rfv s - {atom b} \ (rfv t - {atom a})\* pi \ (pi \ t) \ s)" + shows "\pi. (({atom a}, t) \gen alpha rfv pi ({atom b}, s))" using assms apply(erule_tac alpha.cases) apply(auto) @@ -172,11 +166,11 @@ apply(simp add: a2) apply(simp) apply(rule a3) -apply(erule conjE) apply(erule exE) -apply(erule conjE) apply(rule_tac x="pi \ pia" in exI) -apply(rule conjI) +apply(simp add: alpha_gen.simps) +apply(erule conjE)+ +apply(rule conjI)+ apply(rule_tac ?p1="- pi" in permute_eq_iff[THEN iffD1]) apply(simp add: eqvts atom_eqvt) apply(rule conjI) @@ -193,24 +187,43 @@ apply(simp add: a2) apply(rule a3) apply(rule_tac x="0" in exI) -apply(simp_all add: fresh_star_def fresh_zero_perm) +apply(rule alpha_gen_refl) +apply(assumption) done +lemma fresh_minus_perm: + fixes p::perm + shows "a \ (- p) \ a \ p" + apply(simp add: fresh_def) + apply(simp only: supp_minus_perm) + done + +lemma alpha_gen_atom_sym: + assumes a: "\pi t s. (R t s \ R (pi \ t) (pi \ s))" + shows "\pi. ({atom a}, t) \gen \x1 x2. R x1 x2 \ R x2 x1 f pi ({atom b}, s) \ + \pi. ({atom b}, s) \gen R f pi ({atom a}, t)" + apply(erule exE) + apply(rule_tac x="- pi" in exI) + apply(simp add: alpha_gen.simps) + apply(erule conjE)+ + apply(rule conjI) + apply(simp add: fresh_star_def fresh_minus_perm) + apply(subgoal_tac "R (- pi \ s) ((- pi) \ (pi \ t))") + apply simp + apply(rule a) + apply assumption + done + lemma alpha_sym: shows "t \ s \ s \ t" -apply(induct rule: alpha.induct) -apply(simp add: a1) -apply(simp add: a2) -apply(rule a3) -apply(erule exE) -apply(rule_tac x="- pi" in exI) -apply(simp) -apply(simp add: fresh_star_def fresh_minus_perm) -apply(erule conjE)+ -apply(rotate_tac 3) -apply(drule_tac pi="- pi" in alpha_eqvt) -apply(simp) -done + apply(induct rule: alpha.induct) + apply(simp add: a1) + apply(simp add: a2) + apply(rule a3) + apply(rule alpha_gen_atom_sym) + apply(rule alpha_eqvt) + apply(assumption)+ + done lemma alpha_trans: shows "t1 \ t2 \ t2 \ t3 \ t1 \ t3" @@ -225,11 +238,13 @@ apply(rotate_tac 1) apply(erule alpha.cases) apply(simp_all) +apply(simp add: alpha_gen.simps) apply(erule conjE)+ apply(erule exE)+ apply(erule conjE)+ apply(rule a3) apply(rule_tac x="pia + pi" in exI) +apply(simp add: alpha_gen.simps) apply(simp add: fresh_star_plus) apply(drule_tac x="- pia \ sa" in spec) apply(drule mp) @@ -251,89 +266,9 @@ lemma alpha_rfv: shows "t \ s \ rfv t = rfv s" apply(induct rule: alpha.induct) - apply(simp_all) + apply(simp_all add: alpha_gen.simps) done -inductive - alpha2 :: "rlam \ rlam \ bool" ("_ \2 _" [100, 100] 100) -where - a21: "a = b \ (rVar a) \2 (rVar b)" -| a22: "\t1 \2 t2; s1 \2 s2\ \ rApp t1 s1 \2 rApp t2 s2" -| a23: "(a = b \ t \2 s) \ (a \ b \ ((a \ b) \ t) \2 s \ atom b \ rfv t)\ rLam a t \2 rLam b s" - -lemma fv_vars: - fixes a::name - assumes a1: "\x \ rfv t - {atom a}. pi \ x = x" - shows "(pi \ t) \2 ((a \ (pi \ a)) \ t)" -using a1 -apply(induct t) -apply(auto) -apply(rule a21) -apply(case_tac "name = a") -apply(simp) -apply(simp) -defer -apply(rule a22) -apply(simp) -apply(simp) -apply(rule a23) -apply(case_tac "a = name") -apply(simp) -oops - - -lemma - assumes a1: "t \2 s" - shows "t \ s" -using a1 -apply(induct) -apply(rule alpha.intros) -apply(simp) -apply(rule alpha.intros) -apply(simp) -apply(simp) -apply(rule alpha.intros) -apply(erule disjE) -apply(rule_tac x="0" in exI) -apply(simp add: fresh_star_def fresh_zero_perm) -apply(erule conjE)+ -apply(drule alpha_rfv) -apply(simp) -apply(rule_tac x="(a \ b)" in exI) -apply(simp) -apply(erule conjE)+ -apply(rule conjI) -apply(drule alpha_rfv) -apply(drule sym) -apply(simp) -apply(simp add: rfv_eqvt[symmetric]) -defer -apply(subgoal_tac "atom a \ (rfv t - {atom a})") -apply(subgoal_tac "atom b \ (rfv t - {atom a})") - -defer -sorry - -lemma - assumes a1: "t \ s" - shows "t \2 s" -using a1 -apply(induct) -apply(rule alpha2.intros) -apply(simp) -apply(rule alpha2.intros) -apply(simp) -apply(simp) -apply(clarify) -apply(rule alpha2.intros) -apply(frule alpha_rfv) -apply(rotate_tac 4) -apply(drule sym) -apply(simp) -apply(drule sym) -apply(simp) -oops - quotient_type lam = rlam / alpha by (rule alpha_equivp) @@ -378,7 +313,7 @@ apply(rule a3) apply(rule_tac x="0" in exI) unfolding fresh_star_def - apply(simp add: fresh_star_def fresh_zero_perm) + apply(simp add: fresh_star_def fresh_zero_perm alpha_gen.simps) apply(simp add: alpha_rfv) done @@ -441,10 +376,60 @@ "\x = xa; xb = xc\ \ App x xb = App xa xc" by (lifting a2) -lemma a3: - "\\pi. (fv t - {atom a} = fv s - {atom b} \ (fv t - {atom a})\* pi \ (pi \ t) = s)\ - \ Lam a t = Lam b s" - apply (lifting a3) +lemma alpha_gen_rsp_pre: + assumes a5: "\t s. R t s \ R (pi \ t) (pi \ s)" + and a1: "R s1 t1" + and a2: "R s2 t2" + and a3: "\a b c d. R a b \ R c d \ R1 a c = R2 b d" + and a4: "\x y. R x y \ fv1 x = fv2 y" + shows "(a, s1) \gen R1 fv1 pi (b, s2) = (a, t1) \gen R2 fv2 pi (b, t2)" +apply (simp add: alpha_gen.simps) +apply (simp only: a4[symmetric, OF a1] a4[symmetric, OF a2]) +apply auto +apply (subst a3[symmetric]) +apply (rule a5) +apply (rule a1) +apply (rule a2) +apply (assumption) +apply (subst a3) +apply (rule a5) +apply (rule a1) +apply (rule a2) +apply (assumption) +done + +lemma [quot_respect]: "(prod_rel op = alpha ===> + (alpha ===> alpha ===> op =) ===> (alpha ===> op =) ===> op = ===> prod_rel op = alpha ===> op =) + alpha_gen alpha_gen" +apply simp +apply clarify +apply (rule alpha_gen_rsp_pre[of "alpha",OF alpha_eqvt]) +apply auto +done + +lemma pi_rep: "pi \ (rep_lam x) = rep_lam (pi \ x)" +apply (unfold rep_lam_def) +sorry + +lemma [quot_preserve]: "(prod_fun id rep_lam ---> + (abs_lam ---> abs_lam ---> id) ---> (abs_lam ---> id) ---> id ---> (prod_fun id rep_lam) ---> id) + alpha_gen = alpha_gen" +apply (simp add: expand_fun_eq) +apply (simp add: alpha_gen.simps) +apply (simp add: pi_rep) +apply (simp only: Quotient_abs_rep[OF Quotient_lam]) +apply auto +done + +lemma alpha_prs [quot_preserve]: "(rep_lam ---> rep_lam ---> id) alpha = (op =)" +apply (simp add: expand_fun_eq) +sledgehammer +sorry + + +lemma a3: + "\pi. ({atom a}, t) \gen (op =) fv pi ({atom b}, s) \ Lam a t = Lam b s" + apply (lifting a3) done lemma a3_inv: