src/Pure/defs.ML
changeset 19729 cb9e2f0c7658
parent 19727 f5895f998402
child 19760 c7e9cc10acc8
--- a/src/Pure/defs.ML	Fri May 26 22:20:02 2006 +0200
+++ b/src/Pure/defs.ML	Fri May 26 22:20:03 2006 +0200
@@ -111,24 +111,26 @@
 
 local
 
+val prt = Pretty.string_of oo pretty_const;
+fun err pp (c, args) (d, Us) s1 s2 =
+  error (s1 ^ " dependency of constant " ^ prt pp (c, args) ^ " -> " ^ prt pp (d, Us) ^ s2);
+
 fun contained (U as TVar _) (Type (_, Ts)) = exists (fn T => T = U orelse contained U T) Ts
   | contained _ _ = false;
 
+fun acyclic pp defs (c, args) (d, Us) =
+  c <> d orelse
+  exists (fn U => exists (contained U) args) Us orelse
+  is_none (match_args (args, Us)) orelse
+  err pp (c, args) (d, Us) "Circular" "";
+
 fun wellformed pp defs (c, args) (d, Us) =
-  let
-    val prt = Pretty.string_of o pretty_const pp;
-    fun err s1 s2 =
-      error (s1 ^ " dependency of constant " ^ prt (c, args) ^ " -> " ^ prt (d, Us) ^ s2);
-  in
-    exists (fn U => exists (contained U) args) Us orelse
-    (c <> d andalso forall is_TVar Us) orelse
-    (if c = d andalso is_some (match_args (args, Us)) then err "Circular" "" else
-      (case find_first (fn (Ts, _) => not (disjoint_args (Ts, Us))) (restricts_of defs d) of
-        SOME (Ts, name) =>
-          is_some (match_args (Ts, Us)) orelse
-          err "Malformed" ("\n(restriction " ^ prt (d, Ts) ^ " from " ^ quote name ^ ")")
-      | NONE => true))
-  end;
+  forall is_TVar Us orelse
+  (case find_first (fn (Ts, _) => not (disjoint_args (Ts, Us))) (restricts_of defs d) of
+    SOME (Ts, name) =>
+      err pp (c, args) (d, Us) "Malformed"
+        ("\n(restriction " ^ prt pp (d, Ts) ^ " from " ^ quote name ^ ")")
+  | NONE => true);
 
 fun reduction pp defs const deps =
   let
@@ -144,7 +146,7 @@
     val deps' =
       if forall (is_none o #1) reds then NONE
       else SOME (fold_rev add reds []);
-    val _ = forall (wellformed pp defs const) (the_default deps deps');
+    val _ = forall (acyclic pp defs const) (the_default deps deps');
   in deps' end;
 
 fun normalize pp =
@@ -162,7 +164,9 @@
       (case Symtab.fold norm_update defs (false, defs) of
         (true, defs') => norm_all defs'
       | (false, _) => defs);
-  in norm_all end;
+    fun check defs (c, {reducts, ...}: def) =
+      reducts |> forall (fn (args, deps) => forall (wellformed pp defs (c, args)) deps);
+  in norm_all #> (fn defs => tap (Symtab.forall (check defs)) defs) end;
 
 in