Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.91 KB | None | 0 0
  1. let scc_list g =
  2.   let components = C.scc_list g in
  3.   let components = List.filter (fun l ->
  4.     match l with
  5.     | [ a ] -> G.mem_edge g a a
  6.     | _ -> true
  7.   ) components in
  8.   let components = List.map (List.map G.V.label) components in
  9.   List.map (induced g) components
  10.  
  11. let not_eps =  List.filter (fun s -> s <> "")
  12.  
  13. let rec constraints_composante g =
  14.   let vertices = G.fold_vertex (fun v l -> v :: l) g [] in
  15.   let nodes = G.fold_vertex (fun v l -> G.V.label v :: l) g [] in
  16.   let nodes_constraints = List.map (fun (s,t) ->
  17.     sprintf "%s >= %s" (pprint_term s) (pprint_term t)
  18.   ) nodes in
  19.   let uts = RuleSet.elements (ut_composante nodes) in
  20.   let uts_constraints = List.map (fun (s,t) ->
  21.     sprintf "%s >= %s" (pprint_term s) (pprint_term t)
  22.   ) uts in
  23.   let uts_conjuct = String.concat " /\\ " uts_constraints in
  24.   let nodes_conjuct = String.concat " /\\ " nodes_constraints in
  25.  
  26.   let cime_disjunctions = List.map (fun v ->
  27.     let (s,t) = G.V.label v in
  28.     let ineq = sprintf "%s > %s" (pprint_term s) (pprint_term t) in
  29.     let sccs = scc_list (G.remove_vertex g v) in
  30.     let resursive_constraints = List.map constraints_composante sccs in
  31.     let resursive_constraints = not_eps resursive_constraints in
  32.     let root = String.concat " /\\ " (ineq :: not_eps [nodes_conjuct;uts_conjuct]) in
  33.     let root = sprintf "ordering_solve (order_constraints R_trs_0_algebra \"%s\")" root in
  34. (*     printf "%d sccs when removing %s\n%!" (List.length sccs) (pprint_rule (s,t)); *)
  35.     sprintf "( %s )" (String.concat " and\n" (root :: resursive_constraints))
  36.   ) vertices in
  37.  
  38. (*   printf "\n"; *)
  39.   sprintf "( %s )" (String.concat " or\n\n" cime_disjunctions)
  40.  
  41. let constraints g =
  42.   let components = scc_list g in
  43. (*   printf "root: %d sccs\n%!" (List.length components); *)
  44.   let components_constraints = List.map constraints_composante components in
  45.   String.concat " and\n\n\n" components_constraints
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement