type simproc: explicitl dependency of morphism;
authorwenzelm
Sun, 04 Feb 2007 22:02:14 +0100
changeset 22234 52ba19aaa9c2
parent 22233 c37d7404199b
child 22235 6eac7f7c3294
type simproc: explicitl dependency of morphism; added eq_simproc, morph_simproc; renamed mk_simproc' to make_simproc -- primary interface;
src/Pure/meta_simplifier.ML
--- a/src/Pure/meta_simplifier.ML	Sun Feb 04 22:02:13 2007 +0100
+++ b/src/Pure/meta_simplifier.ML	Sun Feb 04 22:02:14 2007 +0100
@@ -45,7 +45,10 @@
   val empty_ss: simpset
   val merge_ss: simpset * simpset -> simpset
   type simproc
-  val mk_simproc': string -> cterm list -> (simpset -> cterm -> thm option) -> simproc
+  val eq_simproc: simproc * simproc -> bool
+  val morph_simproc: morphism -> simproc -> simproc
+  val make_simproc: {name: string, lhss: cterm list,
+    proc: morphism -> simpset -> cterm -> thm option, identifier: thm list} -> simproc
   val mk_simproc: string -> cterm list -> (theory -> simpset -> term -> thm option) -> simproc
   val add_prems: thm list -> simpset -> simpset
   val prems_of_ss: simpset -> thm list
@@ -199,7 +202,7 @@
    {name: string,
     lhs: cterm,
     proc: simpset -> cterm -> thm option,
-    id: stamp}
+    id: stamp * thm list}
 and solver =
   Solver of
    {name: string,
@@ -234,8 +237,9 @@
 
 fun prems_of_ss (Simpset ({prems, ...}, _)) = prems;
 
-
-fun eq_proc (Proc {id = id1, ...}, Proc {id = id2, ...}) = (id1 = id2);
+fun eq_procid ((s1: stamp, ths1: thm list), (s2, ths2)) =
+  s1 = s2 andalso eq_list eq_thm (ths1, ths2);
+fun eq_proc (Proc {id = id1, ...}, Proc {id = id2, ...}) = eq_procid (id1, id2);
 
 fun mk_solver' name solver = Solver {name = name, solver = solver, id = stamp ()};
 fun mk_solver name solver = mk_solver' name (solver o prems_of_ss);
@@ -321,7 +325,7 @@
     val smps = map #thm (Net.entries rules);
     val prcs = Net.entries procs |>
       map (fn Proc {name, lhs, id, ...} => ((name, lhs), id))
-      |> partition_eq (eq_snd (op =))
+      |> partition_eq (eq_snd eq_procid)
       |> map (fn ps => (fst (fst (hd ps)), map (snd o fst) ps))
       |> Library.sort_wrt fst;
   in
@@ -604,15 +608,28 @@
 
 exception SIMPROC_FAIL of string * exn;
 
-datatype simproc = Simproc of proc list;
+datatype simproc =
+  Simproc of
+    {name: string,
+     lhss: cterm list,
+     proc: morphism -> simpset -> cterm -> thm option,
+     id: stamp * thm list};
+
+fun eq_simproc (Simproc {id = id1, ...}, Simproc {id = id2, ...}) = eq_procid (id1, id2);
 
-fun mk_simproc' name lhss proc =
-  let val id = stamp ()
-  in Simproc (lhss |> map (fn lhs => Proc {name = name, lhs = lhs, proc = proc, id = id})) end;
+fun morph_simproc phi (Simproc {name, lhss, proc, id = (s, ths)}) =
+  Simproc
+   {name = name,
+    lhss = map (Morphism.cterm phi) lhss,
+    proc = fn psi => proc (phi $> psi),
+    id = (s, Morphism.fact phi ths)};
+
+fun make_simproc {name, lhss, proc, identifier} =
+  Simproc {name = name, lhss = lhss, proc = proc, id = (stamp (), identifier)};
 
 fun mk_simproc name lhss proc =
-  mk_simproc' name lhss (fn ss => fn ct =>
-    proc (ProofContext.theory_of (the_context ss)) ss (Thm.term_of ct));
+  make_simproc {name = name, lhss = lhss, proc = fn _ => fn ss => fn ct =>
+    proc (ProofContext.theory_of (the_context ss)) ss (Thm.term_of ct), identifier = []};
 
 (* FIXME avoid global thy and Logic.varify *)
 fun simproc_i thy name = mk_simproc name o map (Thm.cterm_of thy o Logic.varify);
@@ -636,10 +653,13 @@
   handle Net.DELETE =>
     (warning ("Simplification procedure " ^ quote name ^ " not in simpset"); ss);
 
+fun prep_procs (Simproc {name, lhss, proc, id}) =
+  lhss |> map (fn lhs => Proc {name = name, lhs = lhs, proc = proc Morphism.identity, id = id});
+
 in
 
-fun ss addsimprocs ps = fold (fn Simproc procs => fold add_proc procs) ps ss;
-fun ss delsimprocs ps = fold (fn Simproc procs => fold del_proc procs) ps ss;
+fun ss addsimprocs ps = fold (fold add_proc o prep_procs) ps ss;
+fun ss delsimprocs ps = fold (fold del_proc o prep_procs) ps ss;
 
 end;
 
@@ -1238,7 +1258,7 @@
 fun rewrite_goal_rule mode prover ss i thm =
   if 0 < i  andalso  i <= nprems_of thm
   then Drule.fconv_rule (Drule.goals_conv (fn j => j=i) (rewrite_cterm mode prover ss)) thm
-  else raise THM("rewrite_goal_rule",i,[thm]);
+  else raise THM("rewrite_goal_rule", i, [thm]);
 
 
 (** meta-rewriting tactics **)