Prolog 如何在没有圈的有向图中写入所有路径?(序言)

Prolog 如何在没有圈的有向图中写入所有路径?(序言),prolog,Prolog,我正在使用来自的信息在prolog中测试图形搜索路径,并且在从递归函数编写时遇到了一些问题 我的代码可以找到从node1到node2的所有可能路径,但是结果(路径)以相反的顺序打印出来 edge(a, c). edge(a, d). edge(c, e). edge(e, f). edge(d, f). paths(Curr,Stop) :- Curr==Stop -> write(Curr); edge(Curr,Next), paths(Next,Stop

我正在使用来自的信息在prolog中测试图形搜索路径,并且在从递归函数编写时遇到了一些问题

我的代码可以找到从node1到node2的所有可能路径,但是结果(路径)以相反的顺序打印出来

edge(a, c).
edge(a, d).
edge(c, e). 
edge(e, f).
edge(d, f).

paths(Curr,Stop) :- 
    Curr==Stop -> write(Curr);
    edge(Curr,Next),
    paths(Next,Stop),
    write(Curr).
例如,路径(a,f)产生: feca 是的; 食品和药物管理局 对


但是,我希望结果以正确的顺序acef和adf写入,而不使用列表。

请记住,您是通过回溯找到路径的,因此您到达的最后一个节点将是第一个打印出来的节点。这迫使您编写一个谓词,在末尾打印开始节点,这意味着您需要“颠倒”解决这个问题。 其思想是使用edge(上一个,停止)而不是edge(当前,下一个)

正如您现在看到的,我们从末尾开始,递归地尝试到达起点,当我们到达起点时,整个路径从起点打印到终点。

path(edge,path,start,Stop)
使用。
edge(a, c).
edge(a, d).
edge(c, e).
edge(e, f).
edge(d, f).


paths(Start,Stop) :-
    Start==Stop -> write(Start);
    edge(Prev,Stop),
    paths(Start,Prev),
    write(Stop).