Prolog 如何在没有圈的有向图中写入所有路径?(序言)
我正在使用来自的信息在prolog中测试图形搜索路径,并且在从递归函数编写时遇到了一些问题 我的代码可以找到从node1到node2的所有可能路径,但是结果(路径)以相反的顺序打印出来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
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).