diff -r b6873d123f9b -r 89715c48f728 Nominal/Ex/CPS/CPS3_DanvyFilinski.thy --- a/Nominal/Ex/CPS/CPS3_DanvyFilinski.thy Sat May 12 21:39:09 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,252 +0,0 @@ -header {* CPS transformation of Danvy and Filinski *} -theory CPS3_DanvyFilinski imports Lt begin - -nominal_primrec - CPS1 :: "lt \ (lt \ lt) \ lt" ("_*_" [100,100] 100) -and - CPS2 :: "lt \ lt \ lt" ("_^_" [100,100] 100) -where - "eqvt k \ (x~)*k = k (x~)" -| "eqvt k \ (M$N)*k = M*(%m. (N*(%n.((m $ n) $ (Lam c (k (c~)))))))" -| "eqvt k \ atom c \ (x, M) \ (Lam x M)*k = k (Lam x (Lam c (M^(c~))))" -| "\eqvt k \ (CPS1 t k) = t" -| "(x~)^l = l $ (x~)" -| "(M$N)^l = M*(%m. (N*(%n.((m $ n) $ l))))" -| "atom c \ (x, M) \ (Lam x M)^l = l $ (Lam x (Lam c (M^(c~))))" - apply (simp only: eqvt_def CPS1_CPS2_graph_def) - apply (rule, perm_simp, rule) - apply auto - apply (case_tac x) - apply (case_tac a) - apply (case_tac "eqvt b") - apply (rule_tac y="aa" in lt.strong_exhaust) - apply auto[4] - apply (rule_tac x="(name, lt)" and ?'a="name" in obtain_fresh) - apply (simp add: fresh_at_base Abs1_eq_iff) - apply (case_tac b) - apply (rule_tac y="a" in lt.strong_exhaust) - apply auto[3] - apply blast+ - apply (rule_tac x="(name, lt)" and ?'a="name" in obtain_fresh) - apply (simp add: fresh_at_base Abs1_eq_iff) ---"-" - apply (subgoal_tac "Lam c (ka (c~)) = Lam ca (ka (ca~))") - apply (simp only:) - apply (simp add: Abs1_eq_iff) - apply (case_tac "c=ca") - apply simp_all[2] - apply rule - apply (perm_simp) - apply (simp add: eqvt_def) - apply (simp add: fresh_def) - apply (rule contra_subsetD[OF supp_fun_app]) - back - apply (simp add: supp_fun_eqvt lt.supp supp_at_base) ---"-" - apply (rule arg_cong) - back - apply simp - apply (thin_tac "eqvt ka") - apply (rule_tac x="(c, ca, x, xa, M, Ma)" and ?'a="name" in obtain_fresh) - apply (subgoal_tac "Lam c (CPS1_CPS2_sumC (Inr (M, c~))) = Lam a (CPS1_CPS2_sumC (Inr (M, a~)))") - prefer 2 - apply (simp add: Abs1_eq_iff') - apply (case_tac "c = a") - apply simp_all[2] - apply rule - apply (simp add: eqvt_at_def) - apply (simp add: swap_fresh_fresh fresh_Pair_elim) - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr fresh_Pair lt.fresh fresh_at_base) - apply (subgoal_tac "Lam ca (CPS1_CPS2_sumC (Inr (Ma, ca~))) = Lam a (CPS1_CPS2_sumC (Inr (Ma, a~)))") - prefer 2 - apply (simp add: Abs1_eq_iff') - apply (case_tac "ca = a") - apply simp_all[2] - apply rule - apply (simp add: eqvt_at_def) - apply (simp add: swap_fresh_fresh fresh_Pair_elim) - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr fresh_Pair lt.fresh fresh_at_base) - apply (simp only: ) - apply (erule Abs_lst1_fcb) - apply (simp add: Abs_fresh_iff) - apply (drule sym) - apply (simp only:) - apply (simp add: Abs_fresh_iff lt.fresh) - apply clarify - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr fresh_Pair lt.fresh fresh_at_base) - apply (drule sym) - apply (drule sym) - apply (drule sym) - apply (simp only:) - apply (thin_tac "Lam a (CPS1_CPS2_sumC (Inr (M, a~))) = Lam c (CPS1_CPS2_sumC (Inr (M, c~)))") - apply (thin_tac "Lam a (CPS1_CPS2_sumC (Inr (Ma, a~))) = Lam ca (CPS1_CPS2_sumC (Inr (Ma, ca~)))") - apply (thin_tac "atom a \ (c, ca, x, xa, M, Ma)") - apply (simp add: fresh_Pair_elim) - apply (subst iffD1[OF meta_eq_to_obj_eq[OF eqvt_at_def]]) - back - back - back - apply assumption - apply (simp add: Abs1_eq_iff' fresh_Pair_elim fresh_at_base swap_fresh_fresh lt.fresh) - apply (case_tac "(atom x \ atom xa) \ c = ca") - apply simp_all[3] - apply rule - apply (case_tac "c = xa") - apply simp_all[2] - apply (rotate_tac 1) - apply (drule_tac q="(atom ca \ atom x)" in eqvt_at_perm) - apply (simp add: swap_fresh_fresh) - apply (simp add: eqvt_at_def swap_fresh_fresh) - apply (thin_tac "eqvt_at CPS1_CPS2_sumC (Inr (M, c~))") - apply (simp add: eqvt_at_def) - apply (drule_tac x="(atom ca \ atom c)" in spec) - apply simp - apply (metis (no_types) atom_eq_iff fresh_permute_iff permute_swap_cancel swap_atom_simps(3) swap_fresh_fresh) - apply (case_tac "c = xa") - apply simp - apply (subgoal_tac "((ca \ x) \ (atom x)) \ (ca \ x) \ CPS1_CPS2_sumC (Inr (Ma, ca~))") - apply (simp add: atom_eqvt eqvt_at_def) - apply (simp add: flip_fresh_fresh) - apply (subst fresh_permute_iff) - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr lt.fresh fresh_at_base fresh_Pair) - apply simp - apply clarify - apply (subgoal_tac "atom ca \ (atom x \ atom xa) \ CPS1_CPS2_sumC (Inr (M, c~))") - apply (simp add: eqvt_at_def) - apply (subgoal_tac "(atom x \ atom xa) \ atom ca \ CPS1_CPS2_sumC (Inr (M, c~))") - apply (metis Nominal2_Base.swap_commute fresh_permute_iff permute_swap_cancel2) - apply (erule fresh_eqvt_at) - apply (simp add: finite_supp supp_Inr) - apply (simp add: fresh_Inr fresh_Pair lt.fresh) - apply rule - apply (metis Nominal2_Base.swap_commute fresh_permute_iff permute_swap_cancel2) - apply (simp add: fresh_def supp_at_base) - apply (metis atom_eq_iff permute_swap_cancel2 swap_atom_simps(3)) ---"-" - apply (rule_tac x="(c, ca, x, xa, M, Ma)" and ?'a="name" in obtain_fresh) - apply (subgoal_tac "Lam c (CPS1_CPS2_sumC (Inr (M, c~))) = Lam a (CPS1_CPS2_sumC (Inr (M, a~)))") - prefer 2 - apply (simp add: Abs1_eq_iff') - apply (case_tac "c = a") - apply simp_all[2] - apply rule - apply (simp add: eqvt_at_def) - apply (simp add: swap_fresh_fresh fresh_Pair_elim) - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr fresh_Pair lt.fresh fresh_at_base) - apply (subgoal_tac "Lam ca (CPS1_CPS2_sumC (Inr (Ma, ca~))) = Lam a (CPS1_CPS2_sumC (Inr (Ma, a~)))") - prefer 2 - apply (simp add: Abs1_eq_iff') - apply (case_tac "ca = a") - apply simp_all[2] - apply rule - apply (simp add: eqvt_at_def) - apply (simp add: swap_fresh_fresh fresh_Pair_elim) - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr fresh_Pair lt.fresh fresh_at_base) - apply (simp only: ) - apply (erule Abs_lst1_fcb) - apply (simp add: Abs_fresh_iff) - apply (drule sym) - apply (simp only:) - apply (simp add: Abs_fresh_iff lt.fresh) - apply clarify - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) (* TODO put sum of fs into fs typeclass *) - apply (simp add: fresh_Inr fresh_Pair lt.fresh fresh_at_base) - apply (drule sym) - apply (drule sym) - apply (drule sym) - apply (simp only:) - apply (thin_tac "Lam a (CPS1_CPS2_sumC (Inr (M, a~))) = Lam c (CPS1_CPS2_sumC (Inr (M, c~)))") - apply (thin_tac "Lam a (CPS1_CPS2_sumC (Inr (Ma, a~))) = Lam ca (CPS1_CPS2_sumC (Inr (Ma, ca~)))") - apply (thin_tac "atom a \ (c, ca, x, xa, M, Ma)") - apply (simp add: fresh_Pair_elim) - apply (subst iffD1[OF meta_eq_to_obj_eq[OF eqvt_at_def]]) - back - back - back - apply assumption - apply (simp add: Abs1_eq_iff' fresh_Pair_elim fresh_at_base swap_fresh_fresh lt.fresh) - apply (case_tac "(atom x \ atom xa) \ c = ca") - apply simp_all[3] - apply rule - apply (case_tac "c = xa") - apply simp_all[2] - apply (rotate_tac 1) - apply (drule_tac q="(atom ca \ atom x)" in eqvt_at_perm) - apply (simp add: swap_fresh_fresh) - apply (simp add: eqvt_at_def swap_fresh_fresh) - apply (thin_tac "eqvt_at CPS1_CPS2_sumC (Inr (M, c~))") - apply (simp add: eqvt_at_def) - apply (drule_tac x="(atom ca \ atom c)" in spec) - apply simp - apply (metis (no_types) atom_eq_iff fresh_permute_iff permute_swap_cancel swap_atom_simps(3) swap_fresh_fresh) - apply (case_tac "c = xa") - apply simp - apply (subgoal_tac "((ca \ x) \ (atom x)) \ (ca \ x) \ CPS1_CPS2_sumC (Inr (Ma, ca~))") - apply (simp add: atom_eqvt eqvt_at_def) - apply (simp add: flip_fresh_fresh) - apply (subst fresh_permute_iff) - apply (erule fresh_eqvt_at) - apply (simp add: supp_Inr finite_supp) - apply (simp add: fresh_Inr lt.fresh fresh_at_base fresh_Pair) - apply simp - apply clarify - apply (subgoal_tac "atom ca \ (atom x \ atom xa) \ CPS1_CPS2_sumC (Inr (M, c~))") - apply (simp add: eqvt_at_def) - apply (subgoal_tac "(atom x \ atom xa) \ atom ca \ CPS1_CPS2_sumC (Inr (M, c~))") - apply (metis Nominal2_Base.swap_commute fresh_permute_iff permute_swap_cancel2) - apply (erule fresh_eqvt_at) - apply (simp add: finite_supp supp_Inr) - apply (simp add: fresh_Inr fresh_Pair lt.fresh) - apply rule - apply (metis Nominal2_Base.swap_commute fresh_permute_iff permute_swap_cancel2) - apply (simp add: fresh_def supp_at_base) - apply (metis atom_eq_iff permute_swap_cancel2 swap_atom_simps(3)) - done - -termination (eqvt) - by lexicographic_order - -definition psi:: "lt => lt" - where [simp]: "psi V == V*(\x. x)" - -section {* Simple consequence of CPS *} - -lemma [simp]: "eqvt (\x\lt. x)" - by (simp add: eqvt_def eqvt_bound eqvt_lambda) - -lemma value_eq1 : "isValue V \ eqvt k \ V*k = k (psi V)" - apply (cases V rule: lt.exhaust) - apply simp_all - apply (rule_tac x="(name, lt)" and ?'a="name" in obtain_fresh) - apply simp - done - -lemma value_eq2 : "isValue V \ V^K = K $ (psi V)" - apply (cases V rule: lt.exhaust) - apply simp_all - apply (rule_tac x="(name, lt)" and ?'a="name" in obtain_fresh) - apply simp - done - -lemma value_eq3' : "~isValue M \ eqvt k \ M*k = (M^(Lam n (k (Var n))))" - by (cases M rule: lt.exhaust) auto - - - -end - - -