tuned;
authorwenzelm
Fri, 11 Oct 2019 16:40:33 +0200
changeset 70833 e30911cfbd7b
parent 70832 86e272f26afc
child 70834 614ca81fa28e
tuned;
src/Pure/proofterm.ML
--- a/src/Pure/proofterm.ML	Fri Oct 11 16:32:52 2019 +0200
+++ b/src/Pure/proofterm.ML	Fri Oct 11 16:40:33 2019 +0200
@@ -1916,41 +1916,42 @@
     fun do_expand a prop =
       exists (fn (b, NONE) => a = b | (b, SOME prop') => a = b andalso prop = prop') thms;
 
-    fun expand maxidx prfs (AbsP (s, t, prf)) =
-          let val (maxidx', prfs', prf') = expand maxidx prfs prf
-          in (maxidx', prfs', AbsP (s, t, prf')) end
-      | expand maxidx prfs (Abst (s, T, prf)) =
-          let val (maxidx', prfs', prf') = expand maxidx prfs prf
-          in (maxidx', prfs', Abst (s, T, prf')) end
-      | expand maxidx prfs (prf1 %% prf2) =
+    fun expand seen maxidx (AbsP (s, t, prf)) =
+          let val (seen', maxidx', prf') = expand seen maxidx prf
+          in (seen', maxidx', AbsP (s, t, prf')) end
+      | expand seen maxidx (Abst (s, T, prf)) =
+          let val (seen', maxidx', prf') = expand seen maxidx prf
+          in (seen', maxidx', Abst (s, T, prf')) end
+      | expand seen maxidx (prf1 %% prf2) =
           let
-            val (maxidx', prfs', prf1') = expand maxidx prfs prf1;
-            val (maxidx'', prfs'', prf2') = expand maxidx' prfs' prf2;
-          in (maxidx'', prfs'', prf1' %% prf2') end
-      | expand maxidx prfs (prf % t) =
-          let val (maxidx', prfs', prf') = expand maxidx prfs prf
-          in (maxidx', prfs', prf' % t) end
-      | expand maxidx prfs (prf as PThm ({name = a, prop, types = SOME Ts, ...}, thm_body)) =
+            val (seen', maxidx', prf1') = expand seen maxidx prf1;
+            val (seen'', maxidx'', prf2') = expand seen' maxidx' prf2;
+          in (seen'', maxidx'', prf1' %% prf2') end
+      | expand seen maxidx (prf % t) =
+          let val (seen', maxidx', prf') = expand seen maxidx prf
+          in (seen', maxidx', prf' % t) end
+      | expand seen maxidx (prf as PThm ({name = a, prop, types = SOME Ts, ...}, thm_body)) =
           if do_expand a prop then
             let
-              val (maxidx', prfs', prf') =
-                (case AList.lookup (op =) prfs (a, prop) of
+              val (seen', maxidx', prf') =
+                (case AList.lookup (op =) seen (a, prop) of
                   NONE =>
                     let
                       val prf1 =
                         thm_body_proof_open thm_body
                         |> reconstruct_proof thy prop
                         |> forall_intr_vfs_prf prop;
-                      val (maxidx1, prfs1, prf2) = expand (maxidx_proof prf1 ~1) prfs prf1
-                      val prfs2 = ((a, prop), (maxidx1, prf2)) :: prfs1;
-                    in (maxidx1, prfs2, prf2) end
-                | SOME (maxidx1, prf1) => (maxidx1, prfs, prf1));
+                      val (seen1, maxidx1, prf2) = expand_init seen prf1
+                      val seen2 = ((a, prop), (maxidx1, prf2)) :: seen1;
+                    in (seen2, maxidx1, prf2) end
+                | SOME (maxidx1, prf1) => (seen, maxidx1, prf1));
               val prf'' = prf' |> incr_indexes (maxidx + 1) |> app_types (maxidx + 1) prop Ts;
-            in (maxidx' + maxidx + 1, prfs', prf'') end
-          else (maxidx, prfs, prf)
-      | expand maxidx prfs prf = (maxidx, prfs, prf);
+            in (seen', maxidx' + maxidx + 1, prf'') end
+          else (seen, maxidx, prf)
+      | expand seen maxidx prf = (seen, maxidx, prf)
+    and expand_init seen prf = expand seen (maxidx_proof prf ~1) prf;
 
-  in #3 (expand (maxidx_proof prf ~1) [] prf) end;
+  in #3 (expand_init [] prf) end;
 
 end;