446 |
446 |
447 val visible_facts = Graph.all_preds access_G parents |
447 val visible_facts = Graph.all_preds access_G parents |
448 val visible_fact_set = Symtab.make_set visible_facts |
448 val visible_fact_set = Symtab.make_set visible_facts |
449 |
449 |
450 val all_nodes = |
450 val all_nodes = |
451 Graph.schedule (K I) access_G |
451 (Graph.schedule (fn _ => fn (fact, (_, feats, deps)) => (fact, feats, deps)) access_G |
452 |> List.partition (Symtab.defined visible_fact_set o fst) |
452 |> List.partition (Symtab.defined visible_fact_set o #1) |> op @) @ |
453 |> op @ |
453 (if null hints then [] else [(".goal", feats, hints)]) |
454 |
454 |
455 val (rev_depss, featss, (_, _, rev_facts), (num_feats, feat_tab, _)) = |
455 val (rev_depss, featss, (_, _, rev_facts), (num_feats, feat_tab, _)) = |
456 fold (fn (fact, (_, feats, deps)) => |
456 fold (fn (fact, feats, deps) => |
457 fn (depss, featss, fact_xtab as (_, fact_tab, _), feat_xtab) => |
457 fn (depss, featss, fact_xtab as (_, fact_tab, _), feat_xtab) => |
458 let |
458 let |
459 fun add_feat (feat, weight) (xtab as (n, tab, _)) = |
459 fun add_feat (feat, weight) (xtab as (n, tab, _)) = |
460 (case Symtab.lookup tab feat of |
460 (case Symtab.lookup tab feat of |
461 SOME i => ((i, weight), xtab) |
461 SOME i => ((i, weight), xtab) |