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); |