Removed remaining cheats + some cleaning.
authorCezary Kaliszyk <kaliszyk@in.tum.de>
Fri, 26 Mar 2010 16:20:39 +0100
changeset 1656 c9d3dda79fe3
parent 1655 9cec4269b7f9
child 1657 d7dc35222afc
child 1659 758904445fb2
Removed remaining cheats + some cleaning.
Nominal/ExCoreHaskell.thy
Nominal/ExPS3.thy
Nominal/ExPS6.thy
Nominal/Fv.thy
Nominal/Lift.thy
Nominal/Manual/LamEx.thy
Nominal/Parser.thy
Nominal/ROOT.ML
Nominal/Rsp.thy
Nominal/Tacs.thy
--- a/Nominal/ExCoreHaskell.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/ExCoreHaskell.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -5,7 +5,7 @@
 (* core haskell *)
 
 ML {* val _ = recursive := false *}
-ML {* val _ = cheat_const_rsp := true *}
+
 atom_decl var
 atom_decl tvar
 
--- a/Nominal/ExPS3.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/ExPS3.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -11,17 +11,17 @@
   VarP "name"
 | AppP "exp" "exp"
 | LamP x::"name" e::"exp" bind x in e
-| LetP x::"name" p::"pat3" e1::"exp" e2::"exp" bind x in e2, bind "bp'' p" in e1
+| LetP x::"name" p::"pat3" e1::"exp" e2::"exp" bind x in e2, bind "bp p" in e1
 and pat3 =
   PVar "name"
 | PUnit
 | PPair "pat3" "pat3"
 binder
-  bp'' :: "pat3 \<Rightarrow> atom set"
+  bp :: "pat3 \<Rightarrow> atom set"
 where
-  "bp'' (PVar x) = {atom x}"
-| "bp'' (PUnit) = {}"
-| "bp'' (PPair p1 p2) = bp'' p1 \<union> bp'' p2"
+  "bp (PVar x) = {atom x}"
+| "bp (PUnit) = {}"
+| "bp (PPair p1 p2) = bp p1 \<union> bp p2"
 
 thm exp_pat3.fv
 thm exp_pat3.eq_iff
@@ -30,7 +30,7 @@
 thm exp_pat3.induct
 thm exp_pat3.distinct
 thm exp_pat3.fv
-thm exp_pat3.supp (* The bindings are too complicated *)
+thm exp_pat3.supp
 
 end
 
--- a/Nominal/ExPS6.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/ExPS6.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -8,7 +8,6 @@
 
 (* The binding structure is too complicated, so equivalence the
    way we define it is not true *)
-ML {* val _ = cheat_equivp := true *}
 
 ML {* val _ = recursive := false  *}
 nominal_datatype exp6 =
--- a/Nominal/Fv.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/Fv.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -144,13 +144,9 @@
 
 fun is_atom_fset thy (Type ("FSet.fset", [t])) = is_atom thy t
   | is_atom_fset thy _ = false;
-
-val fset_to_set = @{term "fset_to_set :: atom fset \<Rightarrow> atom set"}
 *}
 
 
-
-
 (* Like map2, only if the second list is empty passes empty lists insted of error *)
 ML {*
 fun map2i _ [] [] = []
@@ -215,6 +211,7 @@
       val ty = fastype_of t;
       val atom_ty = dest_fsetT ty --> @{typ atom};
       val fmap_ty = atom_ty --> ty --> @{typ "atom fset"};
+      val fset_to_set = @{term "fset_to_set :: atom fset \<Rightarrow> atom set"}
     in
       fset_to_set $ ((Const (@{const_name fmap}, fmap_ty) $ Const (@{const_name atom}, atom_ty) $ t))
     end;
@@ -241,8 +238,6 @@
 end;
 *}
 
-ML {* @{term "\<lambda>(x, y, z). \<lambda>(x', y', z'). R x x' \<and> R2 y y' \<and> R3 z z'"} *}
-
 (* Given [R1, R2, R3] creates %(x,x'). %(y,y'). %(z,z'). R x x' \<and> R y y' \<and> R z z' *)
 ML {*
 fun mk_compound_alpha Rs =
@@ -259,8 +254,6 @@
 end;
 *}
 
-ML {* cterm_of @{theory} (mk_compound_alpha [@{term "R :: 'a \<Rightarrow> 'a \<Rightarrow> bool"}, @{term "R2 :: 'b \<Rightarrow> 'b \<Rightarrow> bool"}, @{term "R3 :: 'b \<Rightarrow> 'b \<Rightarrow> bool"}]) *}
-
 ML {* fun add_perm (p1, p2) = Const(@{const_name plus}, @{typ "perm \<Rightarrow> perm \<Rightarrow> perm"}) $ p1 $ p2 *}
 
 ML {*
@@ -645,7 +638,7 @@
 ML {*
 fun reflp_tac induct eq_iff ctxt =
   rtac induct THEN_ALL_NEW
-  simp_tac ((mk_minimal_ss ctxt) addsimps eq_iff) THEN_ALL_NEW
+  simp_tac (HOL_basic_ss addsimps eq_iff) THEN_ALL_NEW
   split_conj_tac THEN_ALL_NEW REPEAT o rtac @{thm exI[of _ "0 :: perm"]}
   THEN_ALL_NEW split_conj_tac THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps
      @{thms alpha_gen fresh_star_def fresh_zero_perm permute_zero ball_triv
@@ -662,36 +655,6 @@
 end
 *}
 
-ML {*
-fun build_alpha_alphabn fv_alphas_lst inducts eq_iff ctxt  =
-let
-  val (fvs_alphas, ls) = split_list fv_alphas_lst;
-  val (_, alpha_ts) = split_list fvs_alphas;
-  val tys = map (domain_type o fastype_of) alpha_ts;
-  val names = Datatype_Prop.make_tnames tys;
-  val names2 = Name.variant_list names names;
-  val args = map Free (names ~~ tys);
-  val args2 = map Free (names2 ~~ tys);
-  fun alpha_alphabn ((alpha, (arg, arg2)), (no, l)) =
-    if l = [] then [] else
-    let
-      val alpha_bns = map snd l;
-      val lhs = alpha $ arg $ arg2;
-      val rhs = foldr1 HOLogic.mk_conj (map (fn x => x $ arg $ arg2) alpha_bns);
-      val gl = Logic.mk_implies (HOLogic.mk_Trueprop lhs, HOLogic.mk_Trueprop rhs);
-      fun tac _ = (etac (nth inducts no) THEN_ALL_NEW TRY o rtac @{thm TrueI}
-        THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps eq_iff)) 1
-      val th = Goal.prove ctxt (names @ names2) [] gl tac;
-    in
-      Project_Rule.projects ctxt (1 upto length l) th
-    end;
-  val eqs = map alpha_alphabn ((alpha_ts ~~ (args ~~ args2)) ~~ ((0 upto (length ls - 1)) ~~ ls));
-in
-  flat eqs
-end
-*}
-
-
 lemma exi_neg: "\<exists>(pi :: perm). P pi \<Longrightarrow> (\<And>(p :: perm). P p \<Longrightarrow> Q (- p)) \<Longrightarrow> \<exists>pi. Q pi"
 apply (erule exE)
 apply (rule_tac x="-pi" in exI)
@@ -700,7 +663,7 @@
 ML {*
 fun symp_tac induct inj eqvt ctxt =
   rel_indtac induct THEN_ALL_NEW
-  simp_tac ((mk_minimal_ss ctxt) addsimps inj) THEN_ALL_NEW split_conj_tac
+  simp_tac (HOL_basic_ss addsimps inj) THEN_ALL_NEW split_conj_tac
   THEN_ALL_NEW
   REPEAT o etac @{thm exi_neg}
   THEN_ALL_NEW
@@ -710,55 +673,25 @@
   (asm_full_simp_tac (HOL_ss addsimps (eqvt @ all_eqvts ctxt)))
 *}
 
-ML {*
-fun imp_elim_tac case_rules =
-  Subgoal.FOCUS (fn {concl, context, ...} =>
-    case term_of concl of
-      _ $ (_ $ asm $ _) =>
-        let
-          fun filter_fn case_rule = (
-            case Logic.strip_assums_hyp (prop_of case_rule) of
-              ((_ $ asmc) :: _) =>
-                let
-                  val thy = ProofContext.theory_of context
-                in
-                  Pattern.matches thy (asmc, asm)
-                end
-            | _ => false)
-          val matching_rules = filter filter_fn case_rules
-        in
-         (rtac impI THEN' rotate_tac (~1) THEN' eresolve_tac matching_rules) 1
-        end
-    | _ => no_tac
-  )
-*}
-
 
 lemma exi_sum: "\<exists>(pi :: perm). P pi \<Longrightarrow> \<exists>(pi :: perm). Q pi \<Longrightarrow> (\<And>(p :: perm) (pi :: perm). P p \<Longrightarrow> Q pi \<Longrightarrow> R (pi + p)) \<Longrightarrow> \<exists>pi. R pi"
 apply (erule exE)+
 apply (rule_tac x="pia + pi" in exI)
 by auto
 
-ML {*
-fun is_ex (Const ("Ex", _) $ Abs _) = true
-  | is_ex _ = false;
-*}
 
 ML {*
-fun eetac rule = Subgoal.FOCUS_PARAMS 
-  (fn (focus) =>
-     let
-       val concl = #concl focus
-       val prems = Logic.strip_imp_prems (term_of concl)
-       val exs = filter (fn x => is_ex (HOLogic.dest_Trueprop x)) prems
-       val cexs = map (SOME o (cterm_of (ProofContext.theory_of (#context focus)))) exs
-       val thins = map (fn cex => Drule.instantiate' [] [cex] Drule.thin_rl) cexs
-     in
-     (etac rule THEN' RANGE[
-        atac,
-        eresolve_tac thins
-     ]) 1
-     end
+fun eetac rule = 
+  Subgoal.FOCUS_PARAMS (fn focus =>
+    let
+      val concl = #concl focus
+      val prems = Logic.strip_imp_prems (term_of concl)
+      val exs = filter (fn x => is_ex (HOLogic.dest_Trueprop x)) prems
+      val cexs = map (SOME o (cterm_of (ProofContext.theory_of (#context focus)))) exs
+      val thins = map (fn cex => Drule.instantiate' [] [cex] Drule.thin_rl) cexs
+    in
+      (etac rule THEN' RANGE[atac, eresolve_tac thins]) 1
+    end
   )
 *}
 
@@ -766,7 +699,7 @@
 fun transp_tac ctxt induct alpha_inj term_inj distinct cases eqvt =
   rel_indtac induct THEN_ALL_NEW
   (TRY o rtac allI THEN' imp_elim_tac cases ctxt) THEN_ALL_NEW
-  asm_full_simp_tac ((mk_minimal_ss ctxt) addsimps alpha_inj) THEN_ALL_NEW
+  asm_full_simp_tac (HOL_basic_ss addsimps alpha_inj) THEN_ALL_NEW
   split_conj_tac THEN_ALL_NEW REPEAT o (eetac @{thm exi_sum} ctxt) THEN_ALL_NEW split_conj_tac
   THEN_ALL_NEW (asm_full_simp_tac (HOL_ss addsimps (term_inj @ distinct)))
   THEN_ALL_NEW split_conj_tac THEN_ALL_NEW
@@ -815,40 +748,6 @@
 end
 *}
 
-(*
-Tests:
-prove alpha1_reflp_aux: {* fst (build_alpha_refl_gl [@{term alpha_rtrm1}, @{term alpha_bp}] ("x","y","z")) *}
-by (tactic {* reflp_tac @{thm rtrm1_bp.induct} @{thms alpha1_inj} 1 *})
-
-prove alpha1_symp_aux: {* (fst o snd) (build_alpha_refl_gl [@{term alpha_rtrm1}, @{term alpha_bp}] ("x","y","z")) *}
-by (tactic {* symp_tac @{thm alpha_rtrm1_alpha_bp.induct} @{thms alpha1_inj} @{thms alpha1_eqvt} 1 *})
-
-prove alpha1_transp_aux: {* (snd o snd) (build_alpha_refl_gl [@{term alpha_rtrm1}, @{term alpha_bp}] ("x","y","z")) *}
-by (tactic {* transp_tac @{context} @{thm alpha_rtrm1_alpha_bp.induct} @{thms alpha1_inj} @{thms rtrm1.inject bp.inject} @{thms rtrm1.distinct bp.distinct} @{thms alpha_rtrm1.cases alpha_bp.cases} @{thms alpha1_eqvt} 1 *})
-
-lemma alpha1_equivp:
-  "equivp alpha_rtrm1"
-  "equivp alpha_bp"
-apply (tactic {*
-  (simp_tac (HOL_ss addsimps @{thms equivp_reflp_symp_transp reflp_def symp_def})
-  THEN' rtac @{thm conjI} THEN' rtac @{thm allI} THEN'
-  resolve_tac (HOLogic.conj_elims @{thm alpha1_reflp_aux})
-  THEN' rtac @{thm conjI} THEN' rtac @{thm allI} THEN' rtac @{thm allI} THEN'
-  resolve_tac (HOLogic.conj_elims @{thm alpha1_symp_aux}) THEN' rtac @{thm transp_aux}
-  THEN' resolve_tac (HOLogic.conj_elims @{thm alpha1_transp_aux})
-)
-1 *})
-done*)
-
-ML {*
-fun dtyp_no_of_typ _ (TFree (n, _)) = error "dtyp_no_of_typ: Illegal free"
-  | dtyp_no_of_typ _ (TVar _) = error "dtyp_no_of_typ: Illegal schematic"
-  | dtyp_no_of_typ dts (Type (tname, Ts)) =
-      case try (find_index (curry op = tname o fst)) dts of
-        NONE => error "dtyp_no_of_typ: Illegal recursion"
-      | SOME i => i
-*}
-
 lemma not_in_union: "c \<notin> a \<union> b \<equiv> (c \<notin> a \<and> c \<notin> b)"
 by auto
 
@@ -1025,28 +924,4 @@
 end
 *}
 
-ML {*
-fun build_rsp_gl alphas fnctn ctxt =
-let
-  val typ = domain_type (fastype_of fnctn);
-  val (argl, argr) = the (AList.lookup (op=) alphas typ);
-in
-  ([HOLogic.mk_eq (fnctn $ argl, fnctn $ argr)], ctxt)
 end
-*}
-
-ML {*
-fun fvbv_rsp_tac' simps ctxt =
-  asm_full_simp_tac (HOL_basic_ss addsimps @{thms alpha_gen2}) THEN_ALL_NEW
-  asm_full_simp_tac (HOL_ss addsimps (@{thm alpha_gen} :: simps)) THEN_ALL_NEW
-  REPEAT o eresolve_tac [conjE, exE] THEN_ALL_NEW
-  asm_full_simp_tac (HOL_ss addsimps simps) THEN_ALL_NEW
-  TRY o blast_tac (claset_of ctxt)
-*}
-
-ML {*
-fun build_fvbv_rsps alphas ind simps fnctns ctxt =
-  prove_by_rel_induct alphas build_rsp_gl ind (fvbv_rsp_tac' simps) fnctns ctxt
-*}
-
-end
--- a/Nominal/Lift.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/Lift.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -3,6 +3,18 @@
 begin
 
 ML {*
+fun define_quotient_type args tac ctxt =
+let
+  val mthd = Method.SIMPLE_METHOD tac
+  val mthdt = Method.Basic (fn _ => mthd)
+  val bymt = Proof.global_terminal_proof (mthdt, NONE)
+in
+  bymt (Quotient_Type.quotient_type args ctxt)
+end
+*}
+
+(* Renames schematic variables in a theorem *)
+ML {*
 fun rename_vars fnctn thm =
 let
   val vars = Term.add_vars (prop_of thm) []
--- a/Nominal/Manual/LamEx.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/Manual/LamEx.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -95,8 +95,8 @@
        \<Longrightarrow> rLam a t \<approx>a rLam b s"
 
 lemma a3_inverse:
-  assumes "rLam a t \<approx> rLam b s"
-  shows "\<exists>pi. (rfv t - {atom a} = rfv s - {atom b} \<and> (rfv t - {atom a})\<sharp>* pi \<and> (pi \<bullet> t) \<approx> s)"
+  assumes "rLam a t \<approx>a rLam b s"
+  shows "\<exists>pi. (rfv t - {atom a} = rfv s - {atom b} \<and> (rfv t - {atom a})\<sharp>* pi \<and> (pi \<bullet> t) \<approx>a s)"
 using assms
 apply(erule_tac alpha.cases)
 apply(auto)
@@ -104,7 +104,7 @@
 
 text {* should be automatic with new version of eqvt-machinery *}
 lemma alpha_eqvt:
-  shows "t \<approx> s \<Longrightarrow> (pi \<bullet> t) \<approx> (pi \<bullet> s)"
+  shows "t \<approx>a s \<Longrightarrow> (pi \<bullet> t) \<approx>a (pi \<bullet> s)"
 apply(induct rule: alpha.induct)
 apply(simp add: a1)
 apply(simp add: a2)
@@ -126,7 +126,7 @@
 done
 
 lemma alpha_refl:
-  shows "t \<approx> t"
+  shows "t \<approx>a t"
 apply(induct t rule: rlam.induct)
 apply(simp add: a1)
 apply(simp add: a2)
@@ -136,7 +136,7 @@
 done
 
 lemma alpha_sym:
-  shows "t \<approx> s \<Longrightarrow> s \<approx> t"
+  shows "t \<approx>a s \<Longrightarrow> s \<approx>a t"
 apply(induct rule: alpha.induct)
 apply(simp add: a1)
 apply(simp add: a2)
@@ -152,7 +152,7 @@
 done
 
 lemma alpha_trans:
-  shows "t1 \<approx> t2 \<Longrightarrow> t2 \<approx> t3 \<Longrightarrow> t1 \<approx> t3"
+  shows "t1 \<approx>a t2 \<Longrightarrow> t2 \<approx>a t3 \<Longrightarrow> t1 \<approx>a t3"
 apply(induct arbitrary: t3 rule: alpha.induct)
 apply(erule alpha.cases)
 apply(simp_all)
@@ -188,22 +188,22 @@
   done
 
 lemma alpha_rfv:
-  shows "t \<approx> s \<Longrightarrow> rfv t = rfv s"
+  shows "t \<approx>a s \<Longrightarrow> rfv t = rfv s"
   apply(induct rule: alpha.induct)
   apply(simp_all)
   done
 
 inductive
-    alpha2 :: "rlam \<Rightarrow> rlam \<Rightarrow> bool" ("_ \<approx>2 _" [100, 100] 100)
+    alpha2 :: "rlam \<Rightarrow> rlam \<Rightarrow> bool" ("_ \<approx>a2 _" [100, 100] 100)
 where
-  a21: "a = b \<Longrightarrow> (rVar a) \<approx>2 (rVar b)"
-| a22: "\<lbrakk>t1 \<approx>2 t2; s1 \<approx>2 s2\<rbrakk> \<Longrightarrow> rApp t1 s1 \<approx>2 rApp t2 s2"
-| a23: "(a = b \<and> t \<approx>2 s) \<or> (a \<noteq> b \<and> ((a \<leftrightarrow> b) \<bullet> t) \<approx>2 s \<and> atom b \<notin> rfv t)\<Longrightarrow> rLam a t \<approx>2 rLam b s"
+  a21: "a = b \<Longrightarrow> (rVar a) \<approx>a2 (rVar b)"
+| a22: "\<lbrakk>t1 \<approx>a2 t2; s1 \<approx>a2 s2\<rbrakk> \<Longrightarrow> rApp t1 s1 \<approx>a2 rApp t2 s2"
+| a23: "(a = b \<and> t \<approx>a2 s) \<or> (a \<noteq> b \<and> ((a \<leftrightarrow> b) \<bullet> t) \<approx>a2 s \<and> atom b \<notin> rfv t)\<Longrightarrow> rLam a t \<approx>a2 rLam b s"
 
 lemma fv_vars:
   fixes a::name
   assumes a1: "\<forall>x \<in> rfv t - {atom a}. pi \<bullet> x = x"
-  shows "(pi \<bullet> t) \<approx>2 ((a \<leftrightarrow> (pi \<bullet> a)) \<bullet> t)"
+  shows "(pi \<bullet> t) \<approx>a2 ((a \<leftrightarrow> (pi \<bullet> a)) \<bullet> t)"
 using a1
 apply(induct t)
 apply(auto)
@@ -222,8 +222,8 @@
 
 
 lemma 
-  assumes a1: "t \<approx>2 s"
-  shows "t \<approx> s"
+  assumes a1: "t \<approx>a2 s"
+  shows "t \<approx>a s"
 using a1
 apply(induct)
 apply(rule alpha.intros)
@@ -254,8 +254,8 @@
 sorry
 
 lemma 
-  assumes a1: "t \<approx> s"
-  shows "t \<approx>2 s"
+  assumes a1: "t \<approx>a s"
+  shows "t \<approx>a2 s"
 using a1
 apply(induct)
 apply(rule alpha2.intros)
@@ -445,12 +445,12 @@
 done
 
 lemma rlam_distinct:
-  shows "\<not>(rVar nam \<approx> rApp rlam1' rlam2')"
-  and   "\<not>(rApp rlam1' rlam2' \<approx> rVar nam)"
-  and   "\<not>(rVar nam \<approx> rLam nam' rlam')"
-  and   "\<not>(rLam nam' rlam' \<approx> rVar nam)"
-  and   "\<not>(rApp rlam1 rlam2 \<approx> rLam nam' rlam')"
-  and   "\<not>(rLam nam' rlam' \<approx> rApp rlam1 rlam2)"
+  shows "\<not>(rVar nam \<approx>a rApp rlam1' rlam2')"
+  and   "\<not>(rApp rlam1' rlam2' \<approx>a rVar nam)"
+  and   "\<not>(rVar nam \<approx>a rLam nam' rlam')"
+  and   "\<not>(rLam nam' rlam' \<approx>a rVar nam)"
+  and   "\<not>(rApp rlam1 rlam2 \<approx>a rLam nam' rlam')"
+  and   "\<not>(rLam nam' rlam' \<approx>a rApp rlam1 rlam2)"
 apply auto
 apply (erule alpha.cases)
 apply (simp_all only: rlam.distinct)
--- a/Nominal/Parser.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/Parser.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -386,15 +386,16 @@
   val fv_rsp = flat (map snd fv_rsp_pre);
   val (perms_rsp, lthy11) = prove_const_rsp Binding.empty perms
     (fn _ => asm_simp_tac (HOL_ss addsimps alpha_eqvt) 1) lthy10;
+  val alpha_bn_rsp_pre = prove_alpha_bn_rsp alpha_ts alpha_induct (alpha_eq_iff @ rel_dists @ rel_dists_bn) alpha_equivp exhausts alpha_ts_bn lthy11;
+  val (alpha_bn_rsps, lthy11a) = fold_map (fn cnst => prove_const_rsp Binding.empty [cnst]
+        (fn _ => asm_simp_tac (HOL_ss addsimps alpha_bn_rsp_pre) 1)) alpha_ts_bn lthy11
+(*  val _ = map tracing (map PolyML.makestring alpha_bn_rsps);*)
   fun const_rsp_tac _ =
     if !cheat_const_rsp then Skip_Proof.cheat_tac thy
-    else let val alpha_alphabn = build_alpha_alphabn fv_alpha_all alpha_inducts alpha_eq_iff lthy11
+    else let val alpha_alphabn = prove_alpha_alphabn alpha_ts alpha_induct alpha_eq_iff alpha_ts_bn lthy11a
       in constr_rsp_tac alpha_eq_iff (fv_rsp @ bns_rsp @ reflps @ alpha_alphabn) 1 end
-  val (const_rsps, lthy11a) = fold_map (fn cnst => prove_const_rsp Binding.empty [cnst]
-    const_rsp_tac) raw_consts lthy11
-  val alpha_bn_rsp_pre = prove_alpha_bn_rsp alpha_ts alpha_induct (alpha_eq_iff @ rel_dists @ rel_dists_bn) alpha_equivp exhausts alpha_ts_bn lthy11a;
-  val (alpha_bn_rsps, lthy12) = fold_map (fn cnst => prove_const_rsp Binding.empty [cnst]
-        (fn _ => asm_simp_tac (HOL_ss addsimps alpha_bn_rsp_pre) 1)) alpha_ts_bn lthy11a
+  val (const_rsps, lthy12) = fold_map (fn cnst => prove_const_rsp Binding.empty [cnst]
+    const_rsp_tac) raw_consts lthy11a
   val qfv_names = map (unsuffix "_raw" o Long_Name.base_name o fst o dest_Const) ordered_fv_ts
   val (qfv_ts, qfv_defs, lthy12a) = quotient_lift_consts_export (qfv_names ~~ ordered_fv_ts) lthy12;
   val (qfv_ts_nobn, qfv_ts_bn) = chop (length perms) qfv_ts;
--- a/Nominal/ROOT.ML	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/ROOT.ML	Fri Mar 26 16:20:39 2010 +0100
@@ -15,8 +15,9 @@
     "ExLetRec",
     "ExTySch",
     "ExLeroy",
+    "ExPS3",
+    "ExPS7",
+    "ExCoreHaskell",
     "Test"
-(*  "ExCoreHaskell", *)
-(*  "ExPS3", *)
 (*  "ExPS6", *)
     ];
--- a/Nominal/Rsp.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/Rsp.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -3,17 +3,6 @@
 begin
 
 ML {*
-fun define_quotient_type args tac ctxt =
-let
-  val mthd = Method.SIMPLE_METHOD tac
-  val mthdt = Method.Basic (fn _ => mthd)
-  val bymt = Proof.global_terminal_proof (mthdt, NONE)
-in
-  bymt (Quotient_Type.quotient_type args ctxt)
-end
-*}
-
-ML {*
 fun const_rsp lthy const =
 let
   val nty = fastype_of (Quotient_Term.quotient_lift_const ("", const) lthy)
@@ -50,10 +39,6 @@
 *}
 
 ML {*
-fun repeat_mp thm = repeat_mp (mp OF [thm]) handle THM _ => thm
-*}
-
-ML {*
 fun prove_const_rsp bind consts tac ctxt =
 let
   val rsp_goals = map (const_rsp ctxt) consts
@@ -120,16 +105,9 @@
 
 
 ML {*
-fun mk_minimal_ss ctxt =
-  Simplifier.context ctxt empty_ss
-    setsubgoaler asm_simp_tac
-    setmksimps (mksimps [])
-*}
-
-ML {*
 fun alpha_eqvt_tac induct simps ctxt =
   rel_indtac induct THEN_ALL_NEW
-  simp_tac ((mk_minimal_ss ctxt) addsimps simps) THEN_ALL_NEW
+  simp_tac (HOL_basic_ss addsimps simps) THEN_ALL_NEW
   REPEAT o etac @{thm exi[of _ _ "p"]} THEN' split_conj_tac THEN_ALL_NEW
   asm_full_simp_tac (HOL_ss addsimps (all_eqvts ctxt @ simps)) THEN_ALL_NEW
   asm_full_simp_tac (HOL_ss addsimps 
@@ -153,8 +131,6 @@
 end
 *}
 
-ML {* fold_map build_alpha_eqvt *}
-
 ML {*
 fun build_alpha_eqvts funs tac ctxt =
 let
@@ -256,4 +232,44 @@
 end
 *}
 
+ML {*
+fun build_alpha_alpha_bn_gl alphas alpha_bn ctxt =
+let
+  val ty = domain_type (fastype_of alpha_bn);
+  val (l, r) = the (AList.lookup (op=) alphas ty);
+in
+  ([alpha_bn $ l $ r], ctxt)
 end
+*}
+
+ML {*
+fun prove_alpha_alphabn alphas ind simps alpha_bns ctxt =
+  prove_by_rel_induct alphas build_alpha_alpha_bn_gl ind
+    (fn _ => asm_full_simp_tac (HOL_ss addsimps simps)) alpha_bns ctxt
+*}
+
+ML {*
+fun build_rsp_gl alphas fnctn ctxt =
+let
+  val typ = domain_type (fastype_of fnctn);
+  val (argl, argr) = the (AList.lookup (op=) alphas typ);
+in
+  ([HOLogic.mk_eq (fnctn $ argl, fnctn $ argr)], ctxt)
+end
+*}
+
+ML {*
+fun fvbv_rsp_tac' simps ctxt =
+  asm_full_simp_tac (HOL_basic_ss addsimps @{thms alpha_gen2}) THEN_ALL_NEW
+  asm_full_simp_tac (HOL_ss addsimps (@{thm alpha_gen} :: simps)) THEN_ALL_NEW
+  REPEAT o eresolve_tac [conjE, exE] THEN_ALL_NEW
+  asm_full_simp_tac (HOL_ss addsimps simps) THEN_ALL_NEW
+  TRY o blast_tac (claset_of ctxt)
+*}
+
+ML {*
+fun build_fvbv_rsps alphas ind simps fnctns ctxt =
+  prove_by_rel_induct alphas build_rsp_gl ind (fvbv_rsp_tac' simps) fnctns ctxt
+*}
+
+end
--- a/Nominal/Tacs.thy	Fri Mar 26 10:55:13 2010 +0100
+++ b/Nominal/Tacs.thy	Fri Mar 26 16:20:39 2010 +0100
@@ -125,5 +125,46 @@
 end
 *}
 
+ML {*
+fun repeat_mp thm = repeat_mp (mp OF [thm]) handle THM _ => thm
+*}
+
+(* Introduces an implication and immediately eliminates it by cases *)
+ML {*
+fun imp_elim_tac case_rules =
+  Subgoal.FOCUS (fn {concl, context, ...} =>
+    case term_of concl of
+      _ $ (_ $ asm $ _) =>
+        let
+          fun filter_fn case_rule = (
+            case Logic.strip_assums_hyp (prop_of case_rule) of
+              ((_ $ asmc) :: _) =>
+                let
+                  val thy = ProofContext.theory_of context
+                in
+                  Pattern.matches thy (asmc, asm)
+                end
+            | _ => false)
+          val matching_rules = filter filter_fn case_rules
+        in
+         (rtac impI THEN' rotate_tac (~1) THEN' eresolve_tac matching_rules) 1
+        end
+    | _ => no_tac)
+*}
+
+ML {*
+fun is_ex (Const ("Ex", _) $ Abs _) = true
+  | is_ex _ = false;
+*}
+
+ML {*
+fun dtyp_no_of_typ _ (TFree (n, _)) = error "dtyp_no_of_typ: Illegal free"
+  | dtyp_no_of_typ _ (TVar _) = error "dtyp_no_of_typ: Illegal schematic"
+  | dtyp_no_of_typ dts (Type (tname, Ts)) =
+      case try (find_index (curry op = tname o fst)) dts of
+        NONE => error "dtyp_no_of_typ: Illegal recursion"
+      | SOME i => i
+*}
+
 end