cached ancestor computation
authorblanchet
Fri, 20 Jul 2012 22:19:46 +0200
changeset 49416e740216ca28d
parent 49415 f08425165cca
child 49417 327ebf1c42a8
cached ancestor computation
src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML
     1.1 --- a/src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML	Fri Jul 20 22:19:46 2012 +0200
     1.2 +++ b/src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML	Fri Jul 20 22:19:46 2012 +0200
     1.3 @@ -546,19 +546,20 @@
     1.4      fun enqueue_new seen name =
     1.5        not (member (op =) seen name) ? Queue.enqueue name
     1.6      fun find_maxes seen maxs names =
     1.7 -        case try Queue.dequeue names of
     1.8 -          NONE => maxs
     1.9 -        | SOME (name, names) =>
    1.10 -          if Symtab.defined tab name then
    1.11 -            let
    1.12 -              fun no_path x y = not (member (op =) (Graph.all_preds fact_G [y]) x)
    1.13 -              val maxs = maxs |> filter (fn max => no_path max name)
    1.14 -              val maxs = maxs |> forall (no_path name) maxs ? cons name
    1.15 -            in find_maxes (name :: seen) maxs names end
    1.16 -          else
    1.17 -            find_maxes (name :: seen) maxs
    1.18 -                       (Graph.Keys.fold (enqueue_new seen)
    1.19 -                                        (Graph.imm_preds fact_G name) names)
    1.20 +      case try Queue.dequeue names of
    1.21 +        NONE => map snd maxs
    1.22 +      | SOME (name, names) =>
    1.23 +        if Symtab.defined tab name then
    1.24 +          let
    1.25 +            val new = (Graph.all_preds fact_G [name], name)
    1.26 +            fun not_ancestor (_, x) (yp, _) = not (member (op =) yp x)
    1.27 +            val maxs = maxs |> filter (fn max => not_ancestor max new)
    1.28 +            val maxs = maxs |> forall (not_ancestor new) maxs ? cons new
    1.29 +          in find_maxes (name :: seen) maxs names end
    1.30 +        else
    1.31 +          find_maxes (name :: seen) maxs
    1.32 +                     (Graph.Keys.fold (enqueue_new seen)
    1.33 +                                      (Graph.imm_preds fact_G name) names)
    1.34    in find_maxes [] [] (queue_of (Graph.maximals fact_G)) end
    1.35  
    1.36  (* Generate more suggestions than requested, because some might be thrown out