在不知道节点 Prolog 的情况下查找关系的所有路径

Find all paths for a relation without knowing nodes Prolog

我想获取关系中的所有路径,但如果没有给出结束节点,我不知道如何执行此操作。我已经尝试了多种方法来实现这个,这是我目前拥有的...

    图(Rel,S,T,[S|Cons],N):-
       调用(Rel, S, X),
       (X = T;图(Rel,X,T,[X|Cons],N))。

当我用...测试它时

graph(myRelation, _, _, _, _), false.

它只是无限循环。我假设这是因为除了关系之外没有给我任何术语变量但是我想当我使用 call 时它会分配 X 所以我可以用这种方式填充路径 ([S|Cons])。

你在这里定义了一个谓词,它每次都会调用自己(除非 call(Rel, S, X) 失败,但即使那样也永远没有办法 "retrieve" 结果),你需要一个停止条件。

该条件是当源S和目标T相同时,在这种情况下,我们return作为包含S的列表的路径,以及 N=0:

graph(_, S, S, [S], 0).

此外,在递归情况下,我们必须使用 N 和 "path":

进行适当的簿记
graph(Rel, S, T, [S|Rest], N) :-
    call(Rel, S, X),
    N1 #= N-1,
    graph(Rel, X, T, Rest, N1).

所以完整地,我们得到:

:- use_module(library(clpfd)).

graph(_, S, S, [S], 0).
graph(Rel, S, T, [S|Rest], N) :-
    N #> 0,
    call(Rel, S, X),
    N1 #= N-1,
    graph(Rel, X, T, Rest, N1).