diff -r c55aa6cb1518 -r 6e518b436740 Nominal/Ex/Lambda.thy --- a/Nominal/Ex/Lambda.thy Wed Jun 01 13:35:37 2011 +0900 +++ b/Nominal/Ex/Lambda.thy Wed Jun 01 13:41:30 2011 +0900 @@ -407,70 +407,49 @@ apply (simp_all add: insert_absorb UnI2 finite_set supp_of_finite_insert supp_at_base) done -nominal_primrec - trans :: "lam \ name list \ nat \ db option" +fun + vindex :: "name list \ name \ nat \ db option" where - "trans (Var x) [] n = None" -| "trans (Var x) (h # t) n = - (if h = x then Some (DBVar n) else trans (Var x) t (n + 1))" -| "trans (App t1 t2) xs n = dbapp_in (trans t1 xs n) (trans t2 xs n)" -| "x \ set xs \ trans (Lam [x].t) xs n = dblam_in (trans t (x # xs) n)" + "vindex [] v n = None" +| "vindex (h # t) v n = (if v = h then (Some (DBVar n)) else (vindex t v (Suc n)))" + +lemma vindex_eqvt[eqvt]: + "(p \ vindex l v n) = vindex (p \ l) (p \ v) (p \ n)" + by (induct l arbitrary: n) (simp_all add: permute_pure) + +nominal_primrec + trans :: "lam \ name list \ db option" +where + "trans (Var x) l = vindex l x 0" +| "trans (App t1 t2) xs = dbapp_in (trans t1 xs) (trans t2 xs)" +| "x \ set xs \ trans (Lam [x].t) xs = dblam_in (trans t (x # xs))" unfolding eqvt_def trans_graph_def apply (rule, perm_simp, rule) apply (case_tac x) apply (rule_tac y="a" and c="b" in lam.strong_exhaust) - apply (case_tac b) apply (auto simp add: fresh_star_def fresh_at_list) apply (rule_tac f="dblam_in" in arg_cong) apply (erule Abs1_eq_fdest) apply (simp_all add: pure_fresh) apply (subgoal_tac "(atom x \ atom xa) \ xsa = xsa") - apply (subgoal_tac "(atom x \ atom xa) \ na = na") apply (simp add: eqvt_at_def) - apply (simp add: permute_pure) apply (metis atom_name_def swap_fresh_fresh fresh_at_list) done termination - apply (relation "measure (\(t,l,_). size t + size t + length l)") - apply (simp_all add: lam.size) - done + by (relation "measure (\(t,_). size t)") (simp_all add: lam.size) lemma trans_eqvt[eqvt]: - "p \ trans t l n = trans (p \t) (p \l) (p \n)" -proof (nominal_induct t avoiding: l p arbitrary: n rule: lam.strong_induct) - fix name l n p - show "p \ trans (Var name) l n = - trans (p \ Var name) (p \ l) (p \ n)" - apply (induct l arbitrary: n) - apply simp - apply auto - apply (simp add: permute_pure) - done -next - fix lam1 lam2 l n p - assume - "\b ba n. ba \ trans lam1 b n = trans (ba \ lam1) (ba \ b) (ba \ n)" - " \b ba n. ba \ trans lam2 b n = trans (ba \ lam2) (ba \ b) (ba \ n)" - then show "p \ trans (App lam1 lam2) l n = - trans (p \ App lam1 lam2) (p \ l) (p \ n)" - by (simp add: db_in_eqvt) -next - fix name :: name and l :: "name list" and p :: perm - fix lam n - assume - "atom name \ l" - "atom name \ p" - "\b ba n. ba \ trans lam b n = trans (ba \ lam) (ba \ b) (ba \ n)" - then show - "p \ trans (Lam [name]. lam) l n = - trans (p \ Lam [name]. lam) (p \ l) (p \ n)" + "p \ trans t l = trans (p \t) (p \l)" + apply (nominal_induct t avoiding: l p rule: lam.strong_induct) + apply (simp add: vindex_eqvt) + apply (simp_all add: permute_pure) apply (simp add: fresh_at_list) apply (subst trans.simps) apply (simp add: fresh_at_list[symmetric]) - apply (simp add: db_in_eqvt) + apply (drule_tac x="name # l" in meta_spec) + apply auto done -qed lemma db_trans_test: assumes a: "y \ x"