The non-working procedure_tac.
authorCezary Kaliszyk <kaliszyk@in.tum.de>
Tue, 24 Nov 2009 16:20:34 +0100
changeset 367 d444389fe3f9
parent 366 84621d9942f5
child 368 c5c49d240cde
The non-working procedure_tac.
FSet.thy
--- a/FSet.thy	Tue Nov 24 16:10:31 2009 +0100
+++ b/FSet.thy	Tue Nov 24 16:20:34 2009 +0100
@@ -320,11 +320,11 @@
 apply (tactic {* lift_tac_fset @{context} @{thm list_eq.intros(4)} 1 *})
 done
 
-lemma "x = xa \<longrightarrow> INSERT a x = INSERT a xa"
+lemma "x = xa \<Longrightarrow> INSERT a x = INSERT a xa"
 apply (tactic {* lift_tac_fset @{context} @{thm list_eq.intros(5)} 1 *})
 done
 
-lemma "CARD x = Suc n \<longrightarrow> (\<exists>a b. \<not> IN a b & x = INSERT a b)"
+lemma "CARD x = Suc n \<Longrightarrow> (\<exists>a b. \<not> IN a b & x = INSERT a b)"
 apply (tactic {* lift_tac_fset @{context} @{thm card1_suc} 1 *})
 done
 
@@ -332,27 +332,83 @@
 apply (tactic {* lift_tac_fset @{context} @{thm not_mem_card1} 1 *})
 done
 
-ML {* atomize_thm @{thm fold1.simps(2)} *}
-(*ML {* lift_thm_g_fset @{context} @{thm fold1.simps(2)} @{term "FOLD f g (z::'b) (INSERT a x) =
-    (if rsp_fold f then if IN a x then FOLD f g z x else f (g a) (FOLD f g z x) else z)"} *}*)
-
 lemma "\<forall>f g z a x. FOLD f g (z::'b) (INSERT a x) =
   (if rsp_fold f then if IN a x then FOLD f g z x else f (g a) (FOLD f g z x) else z)"
 apply (tactic {* lift_tac_fset @{context} @{thm fold1.simps(2)} 1 *})
 done
 
+(*
+ML {*
+fun lambda_prs_conv ctxt ctrm =
+  case (Thm.term_of ctrm) of
+    (@{term "op --->"} $ x $ y) $ (Abs (_, T, x)) =>
+      let
+        val lty = T;
+        val rty = fastype_of x;
+        val thy = ProofContext.theory_of ctxt;
+        val (lcty, rcty) = (ctyp_of thy lty, ctyp_of thy rty)
+        val inst = [SOME lcty, NONE, SOME rcty];
+        val lpi = Drule.instantiate' inst [] thm;
+ 
+      (Conv.all_conv ctrm)
+  | _ $ _ => Conv.comb_conv (lambda_prs_conv ctxt) ctrm
+  | Abs _ => Conv.abs_conv (fn (_, ctxt) => lambda_prs_conv ctxt) ctxt ctrm
+  | _ => Conv.all_conv ctrm
+*}
+
+
+ML {*
+fun lambda_prs_tac ctxt = CSUBGOAL (fn (goal, i) =>
+  CONVERSION
+    (Conv.params_conv ~1 (fn ctxt =>
+       (Conv.prems_conv ~1 (lambda_prs_conv ctxt) then_conv
+          Conv.concl_conv ~1 (lambda_prs_conv ctxt))) ctxt) i)
+*}
+*)
+
+thm map_append
+lemma "fmap f (FUNION (x::'b fset) (xa::'b fset)) = FUNION (fmap f x) (fmap f xa)"
+apply(tactic {* procedure_tac @{thm map_append} @{context} 1 *})
+apply(tactic {* prepare_tac 1 *})
+thm map_append
+apply (tactic {* lift_tac_fset @{context} @{thm map_append} 1 *})
+done
+
+
+lemma "\<lbrakk>P EMPTY; \<And>a x. P x \<Longrightarrow> P (INSERT a x)\<rbrakk> \<Longrightarrow> P l"
+apply(tactic {* procedure_tac @{thm list.induct} @{context} 1 *})
+apply(tactic {* regularize_tac @{context} rel_eqv rel_refl 1 *})
+apply(tactic {* REPEAT_ALL_NEW (r_mk_comb_tac @{context} rty quot rel_refl trans2 rsp_thms) 1 *})
+apply(tactic {* REPEAT_ALL_NEW (allex_prs_tac @{context} quot) 1 *})
+thm LAMBDA_PRS
+apply(tactic {* EqSubst.eqsubst_tac @{context} [0] @{thms LAMBDA_PRS} 1 *})
+
+apply(tactic {*  (lambda_prs_tac @{context} quot) 1 *})
+
+apply(tactic {* REPEAT_ALL_NEW (lambda_prs_tac @{context} quot) 1 *})
+
+apply(tactic {* clean_tac @{context} quot defs reps_same 1 *})
+apply (tactic {* lift_tac_fset @{context} @{thm list.induct} 1 *})
+ML {* lift_thm_fset @{context} @{thm list.induct} *}
+ML {* lift_thm_g_fset @{context} @{thm list.induct} @{term "\<lbrakk>P EMPTY; \<And>a x. P x \<Longrightarrow> P (INSERT a x)\<rbrakk> \<Longrightarrow> P l"} *}
+
+lemma "FUNION (FUNION x xa) xb = FUNION x (FUNION xa xb)"
+apply (tactic {* lift_tac_fset @{context} @{thm append_assoc} 1 *})
+done
+
+ML {* atomize_thm @{thm fold1.simps(2)} *}
+(*ML {* lift_thm_g_fset @{context} @{thm fold1.simps(2)} @{term "FOLD f g (z::'b) (INSERT a x) =
+    (if rsp_fold f then if IN a x then FOLD f g z x else f (g a) (FOLD f g z x) else z)"} *}*)
+
+
+
+ML {* lift_thm_g_fset @{context} @{thm map_append} @{term "fmap f (FUNION (x::'b fset) (xa::'b fset)) = FUNION (fmap f x) (fmap f xa)"} *}
+
+
 ML {* cterm_of @{theory} (atomize_goal @{theory} @{term "\<forall>x xa a. x = xa \<Longrightarrow> INSERT a x = INSERT a xa"}) *}
 
-(* Doesn't work with 'a, 'b, but works with 'b, 'a *)
-ML {* lift_thm_g_fset @{context} @{thm fold1.simps(2)} 
-
-ML {* lift_thm_fset @{context} @{thm append_assoc} *}
-ML {* lift_thm_g_fset @{context} @{thm append_assoc} @{term "FUNION (FUNION x xa) xb = FUNION x (FUNION xa xb)"} *}
 
 ML {* lift_thm_fset @{context} @{thm map_append} *}
-ML {* lift_thm_g_fset @{context} @{thm map_append} @{term "fmap f (FUNION (x::'b fset) (xa::'b fset)) = FUNION (fmap f x) (fmap f xa)"} *}
-ML {* lift_thm_fset @{context} @{thm list.induct} *}
-ML {* lift_thm_g_fset @{context} @{thm list.induct} @{term "\<lbrakk>P EMPTY; \<And>a x. P x \<Longrightarrow> P (INSERT a x)\<rbrakk> \<Longrightarrow> P l"} *}