OCaml не является языком логического программирования. Это обычный мультипарадигмальный, функциональный, императивный и объектно-ориентированный язык. Таким образом, нет встроенных конструкций для решения логических задач (кроме проверки типов) или чего-либо подобного.
Тем не менее, ваша проблема является типичной проблемой графов, поэтому вы можете использовать любую библиотеку графов, доступную в OCaml, чтобы решить ее, вот решение, реализованное с использованием Graphlib * кратчайшего пути алгоритм, который реализует классический алгоритм Дейкстры
open Core_kernel
open Graphlib.Std
module G = Graphlib.Make(Int)(Unit)
let graph = Graphlib.create (module G) () ~edges:[
1,2,();
2,3,();
3,4,();
3,5,();
2,5,();
5,6,();
2,6,();
]
let () =
match Graphlib.shortest_path (module G) graph 1 6 with
| None -> printf "No path\n"
| Some p ->
Path.edges p |> Sequence.iter ~f:(fun e ->
printf "Arc(%d, %d)\n" (G.Edge.src e) (G.Edge.dst e))
Вы можете установить graphlib используя opam
opam install graphlib
затем, если вы поместите вашу программу в отдельную папку и имя, скажем, check_path.ml
, вы можете собрать и запустить ее, используя ocamlbuild
, например.
$ ocamlbuild -package graphlib check_path.native --
Arc(1, 2)
Arc(2, 6)