merged
authorChristian Urban <urbanc@in.tum.de>
Tue, 05 Jul 2011 04:23:33 +0200
changeset 2945 70bbd18ad194
parent 2944 8648ae682442 (current diff)
parent 2942 fac8895b109a (diff)
child 2946 d9c3cc271e62
merged
Nominal/Ex/Lambda.thy
--- a/Nominal/Ex/Lambda.thy	Tue Jul 05 04:19:02 2011 +0200
+++ b/Nominal/Ex/Lambda.thy	Tue Jul 05 04:23:33 2011 +0200
@@ -359,23 +359,13 @@
 | DBApp db db
 | DBLam db
 
-fun dbapp_in where
-  "dbapp_in None _ = None"
-| "dbapp_in (Some _ ) None = None"
-| "dbapp_in (Some x) (Some y) = Some (DBApp x y)"
-
-fun dblam_in where
-  "dblam_in None = None"
-| "dblam_in (Some x) = Some (DBLam x)"
+lemma option_map_eqvt[eqvt]:
+  "p \<bullet> (Option.map f x) = Option.map (p \<bullet> f) (p \<bullet> x)"
+  by (cases x) (simp_all, simp add: permute_fun_app_eq)
 
-lemma db_in_eqvt[eqvt]:
-  "p \<bullet> (dbapp_in x y) = dbapp_in (p \<bullet> x) (p \<bullet> y)"
-  "p \<bullet> (dblam_in x) = dblam_in (p \<bullet> x)"
-  apply (case_tac [!] x)
-  apply (simp_all add: eqvts)
-  apply (case_tac y)
-  apply (simp_all add: eqvts)
-  done
+lemma option_bind_eqvt[eqvt]:
+  shows "(p \<bullet> (Option.map f c)) = (Option.map (p \<bullet> f) (p \<bullet> c))"
+  by (cases c) (simp_all, simp add: permute_fun_app_eq)
 
 instance db :: pure
   apply default
@@ -401,8 +391,8 @@
   transdb :: "lam \<Rightarrow> name list \<Rightarrow> db option"
 where
   "transdb (Var x) l = vindex l x 0"
-| "transdb (App t1 t2) xs = dbapp_in (transdb t1 xs) (transdb t2 xs)"
-| "x \<notin> set xs \<Longrightarrow> transdb (Lam [x].t) xs = dblam_in (transdb t (x # xs))"
+| "transdb (App t1 t2) xs = Option.bind (transdb t1 xs) (\<lambda>d1. Option.bind (transdb t2 xs) (\<lambda>d2. Some (DBApp d1 d2)))"
+| "x \<notin> set xs \<Longrightarrow> transdb (Lam [x].t) xs = Option.map DBLam (transdb t (x # xs))"
   unfolding eqvt_def transdb_graph_def
   apply (rule, perm_simp, rule)
   apply(rule TrueI)
@@ -410,12 +400,11 @@
   apply (rule_tac y="a" and c="b" in lam.strong_exhaust)
   apply (auto simp add: fresh_star_def fresh_at_list)[3]
   apply(simp_all)
-  apply(erule conjE)
+  apply(elim conjE)
   apply (erule_tac c="xsa" in Abs_lst1_fcb2')
   apply (simp add: pure_fresh)
   apply(simp add: fresh_star_def fresh_at_list)
-  apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq db_in_eqvt)
-  apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq db_in_eqvt)
+  apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq eqvts eqvts_raw)+
   done
 
 termination
@@ -423,7 +412,7 @@
 
 lemma transdb_eqvt[eqvt]:
   "p \<bullet> transdb t l = transdb (p \<bullet>t) (p \<bullet>l)"
-  apply (nominal_induct t avoiding: l p rule: lam.strong_induct)
+  apply (nominal_induct t avoiding: l rule: lam.strong_induct)
   apply (simp add: vindex_eqvt)
   apply (simp_all add: permute_pure)
   apply (simp add: fresh_at_list)
@@ -439,6 +428,7 @@
   Some (DBLam (DBLam (DBApp (DBVar 1) (DBVar 0))))"
   using a by simp
 
+
 abbreviation
   mbind :: "'a option => ('a => 'b option) => 'b option"  ("_ \<guillemotright>= _" [65,65] 65) 
 where  
@@ -611,48 +601,6 @@
 apply (rule, perm_simp, rule)
 oops
 
-text {* tests of functions containing if and case *}
-
-consts P :: "lam \<Rightarrow> bool"
-
-nominal_primrec  
-  A :: "lam => lam"
-where  
-  "A (App M N) = (if (True \<or> P M) then (A M) else (A N))"
-| "A (Var x) = (Var x)" 
-| "A (App M N) = (if True then M else A N)"
-oops
-
-nominal_primrec  
-  C :: "lam => lam"
-where  
-  "C (App M N) = (case (True \<or> P M) of True \<Rightarrow> (A M) | False \<Rightarrow> (A N))"
-| "C (Var x) = (Var x)" 
-| "C (App M N) = (if True then M else C N)"
-oops
-
-nominal_primrec  
-  A :: "lam => lam"
-where  
-  "A (Lam [x].M) = (Lam [x].M)"
-| "A (Var x) = (Var x)"
-| "A (App M N) = (if True then M else A N)"
-oops
-
-nominal_primrec  
-  B :: "lam => lam"
-where  
-  "B (Lam [x].M) = (Lam [x].M)"
-| "B (Var x) = (Var x)"
-| "B (App M N) = (if True then M else (B N))"
-unfolding eqvt_def
-unfolding B_graph_def
-apply(perm_simp)
-apply(rule allI)
-apply(rule refl)
-oops
-
-
 lemma test:
   assumes "t = s"
   and "supp p \<sharp>* t" "supp p \<sharp>* x"
@@ -720,6 +668,88 @@
 
 termination by lexicographic_order
 
+lemma abs_same_binder:
+  fixes t ta s sa :: "_ :: fs"
+  assumes "sort_of (atom x) = sort_of (atom y)"
+  shows "[[atom x]]lst. t = [[atom y]]lst. ta \<and> [[atom x]]lst. s = [[atom y]]lst. sa
+     \<longleftrightarrow> [[atom x]]lst. (t, s) = [[atom y]]lst. (ta, sa)"
+  by (cases "atom x = atom y") (auto simp add: Abs1_eq_iff assms fresh_Pair)
+
+nominal_primrec
+  aux2 :: "lam \<Rightarrow> lam \<Rightarrow> bool"
+where
+  "aux2 (Var x) (Var y) = (x = y)"
+| "aux2 (App t1 t2) (App s1 s2) = (aux2 t1 s1 \<and> aux2 t2 s2)"
+| "aux2 (Var x) (App t1 t2) = False"
+| "aux2 (Var x) (Lam [y].t) = False"
+| "aux2 (App t1 t2) (Var x) = False"
+| "aux2 (App t1 t2) (Lam [x].t) = False"
+| "aux2 (Lam [x].t) (Var y) = False"
+| "aux2 (Lam [x].t) (App t1 t2) = False"
+| "x = y \<Longrightarrow> aux2 (Lam [x].t) (Lam [y].s) = aux2 t s"
+  apply(simp add: eqvt_def aux2_graph_def)
+  apply(rule, perm_simp, rule, rule)
+  apply(case_tac x)
+  apply(rule_tac y="a" and c="b" in lam.strong_exhaust)
+  apply(rule_tac y="b" in lam.exhaust)
+  apply(auto)[3]
+  apply(rule_tac y="b" in lam.exhaust)
+  apply(auto)[3]
+  apply(rule_tac y="b" and c="(name, lam)" in lam.strong_exhaust)
+  apply(auto)[3]
+  apply(drule_tac x="name" in meta_spec)
+  apply(drule_tac x="name" in meta_spec)
+  apply(drule_tac x="lam" in meta_spec)
+  apply(drule_tac x="(name \<leftrightarrow> namea) \<bullet> lama" in meta_spec)
+  apply(simp add: Abs1_eq_iff fresh_star_def fresh_Pair_elim fresh_at_base lam.fresh flip_def)
+  apply (metis Nominal2_Base.swap_commute fresh_permute_iff sort_of_atom_eq swap_atom_simps(2))
+  apply simp_all
+  apply (simp add: abs_same_binder)
+  apply (erule_tac c="()" in Abs_lst1_fcb2)
+  apply (simp_all add: pure_fresh fresh_star_def eqvt_at_def)
+  done
+
+text {* tests of functions containing if and case *}
+
+consts P :: "lam \<Rightarrow> bool"
+
+nominal_primrec  
+  A :: "lam => lam"
+where  
+  "A (App M N) = (if (True \<or> P M) then (A M) else (A N))"
+| "A (Var x) = (Var x)" 
+| "A (App M N) = (if True then M else A N)"
+oops
+
+nominal_primrec  
+  C :: "lam => lam"
+where  
+  "C (App M N) = (case (True \<or> P M) of True \<Rightarrow> (A M) | False \<Rightarrow> (A N))"
+| "C (Var x) = (Var x)" 
+| "C (App M N) = (if True then M else C N)"
+oops
+
+nominal_primrec  
+  A :: "lam => lam"
+where  
+  "A (Lam [x].M) = (Lam [x].M)"
+| "A (Var x) = (Var x)"
+| "A (App M N) = (if True then M else A N)"
+oops
+
+nominal_primrec  
+  B :: "lam => lam"
+where  
+  "B (Lam [x].M) = (Lam [x].M)"
+| "B (Var x) = (Var x)"
+| "B (App M N) = (if True then M else (B N))"
+unfolding eqvt_def
+unfolding B_graph_def
+apply(perm_simp)
+apply(rule allI)
+apply(rule refl)
+oops
+
 end