Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
authorchaieb
Sun, 08 Jul 2007 19:01:28 +0200
changeset 23648 bccbf6138c30
parent 23647 89286c4e7928
child 23649 4d865f3e4405
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
src/HOL/ex/reflection.ML
--- a/src/HOL/ex/reflection.ML	Sun Jul 08 19:01:26 2007 +0200
+++ b/src/HOL/ex/reflection.ML	Sun Jul 08 19:01:28 2007 +0200
@@ -7,12 +7,12 @@
 
 signature REFLECTION = sig
   val genreify_tac: Proof.context -> thm list -> term option -> int -> tactic
-  val reflection_tac: Proof.context -> thm list -> term option -> int -> tactic
+  val reflection_tac: Proof.context -> thm list -> thm list -> term option -> int -> tactic
   val gen_reflection_tac: Proof.context -> (cterm -> thm)
-    -> thm list -> term option -> int -> tactic
+    -> thm list -> thm list -> term option -> int -> tactic
 end;
 
-structure Reflection  : REFLECTION 
+structure Reflection : REFLECTION
 = struct
 
 val ext2 = thm "ext2";
@@ -149,7 +149,8 @@
     end)
       handle MATCH => decomp_genreif da congs (t,ctxt)))
   end;
-          (* looks for the atoms equation and instantiates it with the right number *)
+
+ (* looks for the atoms equation and instantiates it with the right number *)
 
 
 fun mk_decompatom eqs (t,ctxt) =
@@ -256,9 +257,24 @@
 in ps ~~ (Variable.export ctxt' ctxt congs)
 end
 
+fun partition P [] = ([],[])
+  | partition P (x::xs) = 
+     let val (yes,no) = partition P xs
+     in if P x then (x::yes,no) else (yes, x::no) end
+
+fun rearrange congs = 
+let 
+ fun P (_, th) = 
+  let val @{term "Trueprop"}$(Const ("op =",_) $l$_) = concl_of th
+  in can dest_Var l end
+ val (yes,no) = partition P congs 
+ in no @ yes end
+
+
+
 fun genreif ctxt raw_eqs t =
  let 
-  val congs = mk_congs ctxt raw_eqs 
+  val congs = rearrange (mk_congs ctxt raw_eqs)
   val th = divide_and_conquer (decomp_genreif (mk_decompatom raw_eqs) congs) (t,ctxt)
   fun is_listVar (Var (_,t)) = can dest_listT t
        | is_listVar _ = false
@@ -274,13 +290,19 @@
 in FWD trans [th'',th']
 end
 
-fun genreflect ctxt conv corr_thm raw_eqs t =
-    let val th = FWD trans [genreif ctxt raw_eqs t, corr_thm RS sym]
-        val ft = (Thm.dest_arg1 o Thm.dest_arg o Thm.dest_arg o cprop_of) th
-        val rth = conv ft
-    in simplify (HOL_basic_ss addsimps raw_eqs addsimps [nth_Cons_0, nth_Cons_Suc])
-                (simplify (HOL_basic_ss addsimps [rth]) th)
-    end
+
+fun genreflect ctxt conv corr_thms raw_eqs t =
+let 
+  val reifth = genreif ctxt raw_eqs t
+  fun trytrans [] = error "No suitable correctness theorem found"
+    | trytrans (th::ths) = 
+         (FWD trans [reifth, th RS sym] handle THM _ => trytrans ths)
+  val th = trytrans corr_thms
+  val ft = (Thm.dest_arg1 o Thm.dest_arg o Thm.dest_arg o cprop_of) th
+  val rth = conv ft
+in simplify (HOL_basic_ss addsimps raw_eqs addsimps [nth_Cons_0, nth_Cons_Suc])
+           (simplify (HOL_basic_ss addsimps [rth]) th)
+end
 
 fun genreify_tac ctxt eqs to i = (fn st =>
   let
@@ -292,11 +314,11 @@
 
     (* Reflection calls reification and uses the correctness *)
         (* theorem assumed to be the dead of the list *)
-fun gen_reflection_tac ctxt conv (corr_thm :: raw_eqs) to i = (fn st =>
+fun gen_reflection_tac ctxt conv corr_thms raw_eqs to i = (fn st =>
   let
     val P = HOLogic.dest_Trueprop (nth (prems_of st) (i - 1));
     val t = the_default P to;
-    val th = genreflect ctxt conv corr_thm raw_eqs t
+    val th = genreflect ctxt conv corr_thms raw_eqs t
       RS ssubst;
   in rtac th i st end);