src/Pure/raw_simplifier.ML
changeset 71239 acc6cb1a1a67
parent 71235 d12c58e12c51
child 71318 1be996d8bb98
--- a/src/Pure/raw_simplifier.ML	Thu Dec 05 12:09:33 2019 +0000
+++ b/src/Pure/raw_simplifier.ML	Thu Dec 05 12:09:35 2019 +0000
@@ -122,6 +122,8 @@
   | cong_name (Free (a, _)) = SOME (false, a)
   | cong_name _ = NONE;
 
+structure Congtab = Table(type key = cong_name val ord = prod_ord bool_ord fast_string_ord);
+
 
 (* rewrite rules *)
 
@@ -250,7 +252,7 @@
    {rules: rrule Net.net,
     prems: thm list,
     depth: int * bool Unsynchronized.ref} *
-   {congs: (cong_name * thm) list * cong_name list,
+   {congs: thm Congtab.table * cong_name list,
     procs: proc Net.net,
     mk_rews:
      {mk: Proof.context -> thm -> thm list,
@@ -285,8 +287,8 @@
     |> map (fn Proc {name, lhs, stamp, ...} => ((name, lhs), stamp))
     |> partition_eq (eq_snd op =)
     |> map (fn ps => (fst (fst (hd ps)), map (snd o fst) ps)),
-  congs = #1 congs,
-  weak_congs = #2 congs,
+  congs = congs |> fst |> Congtab.dest,
+  weak_congs = congs |> snd,
   loopers = map fst loop_tacs,
   unsafe_solvers = map solver_name (#1 solvers),
   safe_solvers = map solver_name (#2 solvers)};
@@ -296,7 +298,7 @@
 
 fun init_ss depth mk_rews term_ord subgoal_tac solvers =
   make_simpset ((Net.empty, [], depth),
-    (([], []), Net.empty, mk_rews, term_ord, subgoal_tac, [], solvers));
+    ((Congtab.empty, []), Net.empty, mk_rews, term_ord, subgoal_tac, [], solvers));
 
 fun default_mk_sym _ th = SOME (th RS Drule.symmetric_thm);
 
@@ -326,7 +328,7 @@
       val rules' = Net.merge eq_rrule (rules1, rules2);
       val prems' = Thm.merge_thms (prems1, prems2);
       val depth' = if #1 depth1 < #1 depth2 then depth2 else depth1;
-      val congs' = AList.merge (op =) (K true) (congs1, congs2);
+      val congs' = Congtab.merge (K true) (congs1, congs2);
       val weak' = merge (op =) (weak1, weak2);
       val procs' = Net.merge eq_proc (procs1, procs2);
       val loop_tacs' = AList.merge (op =) (K true) (loop_tacs1, loop_tacs2);
@@ -678,7 +680,7 @@
       val a = the (cong_name (head_of lhs)) handle Option.Option =>
         raise SIMPLIFIER ("Congruence must start with a constant or free variable", [thm]);
       val (xs, weak) = congs;
-      val xs' = AList.update (op =) (a, Thm.trim_context thm) xs;
+      val xs' = Congtab.update (a, Thm.trim_context thm) xs;
       val weak' = if is_full_cong thm then weak else a :: weak;
     in ((xs', weak'), procs, mk_rews, term_ord, subgoal_tac, loop_tacs, solvers) end);
 
@@ -691,8 +693,8 @@
       val a = the (cong_name (head_of lhs)) handle Option.Option =>
         raise SIMPLIFIER ("Congruence must start with a constant", [thm]);
       val (xs, _) = congs;
-      val xs' = filter_out (fn (x : cong_name, _) => x = a) xs;
-      val weak' = xs' |> map_filter (fn (a, th) => if is_full_cong th then NONE else SOME a);
+      val xs' = Congtab.delete_safe a xs;
+      val weak' = Congtab.fold (fn (a, th) => if is_full_cong th then I else insert (op =) a) xs' [];
     in ((xs', weak'), procs, mk_rews, term_ord, subgoal_tac, loop_tacs, solvers) end);
 
 fun add_cong thm ctxt = add_eqcong (mk_cong ctxt thm) ctxt;
@@ -1178,7 +1180,7 @@
                   in
                     (case cong_name h of
                       SOME a =>
-                        (case AList.lookup (op =) (fst congs) a of
+                        (case Congtab.lookup (fst congs) a of
                           NONE => appc ()
                         | SOME cong =>
      (*post processing: some partial applications h t1 ... tj, j <= length ts,