src/Pure/defs.ML
changeset 62180 27c637223722
parent 62179 e089e5b02443
child 62181 4025b5ce1901
equal deleted inserted replaced
62179:e089e5b02443 62180:27c637223722
   204 
   204 
   205 in
   205 in
   206 
   206 
   207 fun normalize context =
   207 fun normalize context =
   208   let
   208   let
       
   209     fun check_def defs (c, {reducts, ...}: def) =
       
   210       reducts |> forall (fn (args, deps) => forall (wellformed context defs (c, args)) deps);
       
   211     fun check_defs defs = Itemtab.forall (check_def defs) defs;
       
   212 
   209     fun norm_update (c, {reducts, ...}: def) (changed, defs) =
   213     fun norm_update (c, {reducts, ...}: def) (changed, defs) =
   210       let
   214       let
   211         val reducts' = reducts |> map (fn (args, deps) =>
   215         val reducts' = reducts |> map (fn (args, deps) =>
   212           (args, perhaps (reduction context defs (c, args)) deps));
   216           (args, perhaps (reduction context defs (c, args)) deps));
   213       in
   217       in
   214         if reducts = reducts' then (changed, defs)
   218         if reducts = reducts' then (changed, defs)
   215         else (true, defs |> map_def c (fn (specs, restricts, _) => (specs, restricts, reducts')))
   219         else (true, defs |> map_def c (fn (specs, restricts, _) => (specs, restricts, reducts')))
   216       end;
   220       end;
   217     fun norm_all defs =
   221     fun norm_loop defs =
   218       (case Itemtab.fold norm_update defs (false, defs) of
   222       (case Itemtab.fold norm_update defs (false, defs) of
   219         (true, defs') => norm_all defs'
   223         (true, defs') => norm_loop defs'
   220       | (false, _) => defs);
   224       | (false, _) => defs);
   221     fun check defs (c, {reducts, ...}: def) =
   225   in norm_loop #> tap check_defs end;
   222       reducts |> forall (fn (args, deps) => forall (wellformed context defs (c, args)) deps);
       
   223   in norm_all #> (fn defs => tap (Itemtab.forall (check defs)) defs) end;
       
   224 
   226 
   225 fun dependencies context (c, args) restr deps =
   227 fun dependencies context (c, args) restr deps =
   226   map_def c (fn (specs, restricts, reducts) =>
   228   map_def c (fn (specs, restricts, reducts) =>
   227     let
   229     let
   228       val restricts' = Library.merge (op =) (restricts, restr);
   230       val restricts' = Library.merge (op =) (restricts, restr);