src/Pure/General/graph.ML
changeset 31516 9801a92d52d7
parent 30290 f49d70426690
child 31540 4cfe0f756feb
equal deleted inserted replaced
31515:62fc203eed88 31516:9801a92d52d7
    46   val add_deps_acyclic: key * key list -> 'a T -> 'a T                (*exception CYCLES*)
    46   val add_deps_acyclic: key * key list -> 'a T -> 'a T                (*exception CYCLES*)
    47   val merge_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T         (*exception CYCLES*)
    47   val merge_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T         (*exception CYCLES*)
    48   val topological_order: 'a T -> key list
    48   val topological_order: 'a T -> key list
    49   val add_edge_trans_acyclic: key * key -> 'a T -> 'a T               (*exception CYCLES*)
    49   val add_edge_trans_acyclic: key * key -> 'a T -> 'a T               (*exception CYCLES*)
    50   val merge_trans_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T   (*exception CYCLES*)
    50   val merge_trans_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T   (*exception CYCLES*)
       
    51   val extend: (key -> 'a * key list) -> key list -> 'a T -> 'a T
       
    52   val make: (key -> 'a * key list) -> key list -> 'a T
    51 end;
    53 end;
    52 
    54 
    53 functor GraphFun(Key: KEY): GRAPH =
    55 functor GraphFun(Key: KEY): GRAPH =
    54 struct
    56 struct
    55 
    57 
   273 fun merge_trans_acyclic eq (G1, G2) =
   275 fun merge_trans_acyclic eq (G1, G2) =
   274   merge_acyclic eq (G1, G2)
   276   merge_acyclic eq (G1, G2)
   275   |> fold add_edge_trans_acyclic (diff_edges G1 G2)
   277   |> fold add_edge_trans_acyclic (diff_edges G1 G2)
   276   |> fold add_edge_trans_acyclic (diff_edges G2 G1);
   278   |> fold add_edge_trans_acyclic (diff_edges G2 G1);
   277 
   279 
       
   280   
       
   281 (* constructing graphs *)
       
   282 
       
   283 fun extend explore =
       
   284   let
       
   285     fun contains_node gr key = member eq_key (keys gr) key
       
   286     fun extend' key gr =
       
   287       let
       
   288         val (node, preds) = explore key
       
   289       in
       
   290         gr |> (not (contains_node gr key)) ?
       
   291           (new_node (key, node)
       
   292           #> fold extend' preds
       
   293           #> fold (add_edge o (pair key)) preds)
       
   294       end
       
   295   in fold extend' end
       
   296 
       
   297 fun make explore keys = extend explore keys empty
       
   298 
   278 
   299 
   279 (*final declarations of this structure!*)
   300 (*final declarations of this structure!*)
   280 val fold = fold_graph;
   301 val fold = fold_graph;
   281 
   302 
   282 end;
   303 end;