在一个Prolog中合并两个谓词

在一个Prolog中合并两个谓词,prolog,Prolog,我是prolog的初学者,需要使用回溯为地铁站应用程序编写谓词path(Start,Dest,path)。给出一些事实:connected(x,y) %% Some facts (for illustration): connected(a,b). connected(b,c). connected(c,d). connected(d,e). connected(e,f). %% Direction A (e.g from b to e) path1(Start, End, [[Start,E

我是prolog的初学者,需要使用回溯为地铁站应用程序编写谓词
path(Start,Dest,path)
。给出一些事实:
connected(x,y)

%% Some facts (for illustration):
connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).

%% Direction A (e.g from b to e)
path1(Start, End, [[Start,End]]):- (connected(Start,End) ; connected(End,Start)),!.
path1(Start, End, [[Start,X]|Path]):-
    connected(Start, X),
    path1(X, End, Path).

%% Direction B (e.g from f to A)
path2(Start, End, [[Start,End]]):- (connected(Start,End) ; connected(End,Start)),!.
path2(Start, End, [[Start,X]|Path]):-
    connected(X, Start),
    path2(X, End, Path). 

%% And for the required predicate:
path(Start, End, Path):-
    path1(Start, End, Path)
    ;
    path2(Start, End, Path).
上面的谓词可以正常工作,并且符合要求,但是我想做的是以更好的方式将这两个谓词合并成一个谓词,我不知道具体怎么做。有人能帮忙吗

提前谢谢

编辑: 我将其修改为以下内容:

path(Start, End, [[Start,End]], _):- (connected(Start,End) ; connected(End,Start)),!.
path(Start, End, [[Start,X]|Path], Direction):-
    (Direction == 0,
    connected(Start, X),
    path(X, End, Path,0))
    ;
    (Direction == 1,
    connected(X, Start),
    path(X, End, Path,1))

%% And for the required predicate:
path(Start, End, Path):-
    path(Start, End, Path, 0)
    ;
    path(Start, End, Path, 1).

但是仍然需要删除更多的重复代码行。

一个可能的解决方案是:

path(Start, End, Path) :-
   path(_, Start, End, Path).

path(_, Start, Start, []).
path(Direction, Start, End, [[Start,X]|Path]) :-
   link(Direction, Start, X),
   path(Direction, X, End, Path).

link(forward,  X, Y) :- connected(X, Y).
link(backward, X, Y) :- connected(Y, X).

connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).
示例:

?- path(c, a, P).
P = [[c, b], [b, a]] ;
false.

?- path(a, c, P).
P = [[a, b], [b, c]] ;
false.

?- path(D, a,c,P).
D = forward,
P = [[a, b], [b, c]] ;
false.

?- path(D, c, a, P).
D = backward,
P = [[c, b], [b, a]] ;
false.

一种可能的解决办法是:

path(Start, End, Path) :-
   path(_, Start, End, Path).

path(_, Start, Start, []).
path(Direction, Start, End, [[Start,X]|Path]) :-
   link(Direction, Start, X),
   path(Direction, X, End, Path).

link(forward,  X, Y) :- connected(X, Y).
link(backward, X, Y) :- connected(Y, X).

connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).
示例:

?- path(c, a, P).
P = [[c, b], [b, a]] ;
false.

?- path(a, c, P).
P = [[a, b], [b, c]] ;
false.

?- path(D, a,c,P).
D = forward,
P = [[a, b], [b, c]] ;
false.

?- path(D, c, a, P).
D = backward,
P = [[c, b], [b, a]] ;
false.

“这两个谓词”?我数到四。“以更好的方式”以什么方式?我的意思是
path1
path2
谓词。我使用
path
合并了它们,但是您可以看到它们是相同的,只需更改
connected
中参数的顺序即可。我正在寻找一个wat,它使我只编写一个谓词,以执行与上述代码相同的操作@WillNess“是的,我在这里提问之前已经尝试过了,而且还跟踪了它,所以它不能按需要工作。说明:如果我查询路径(a,c,path),它会在第一次回溯时正确地得到路径,但随后我需要剪切。但是如果我查询相反方向的路径(c,a,path),这将导致堆栈被填满,而不需要填充,因为它会在事实之间“摇摆”。-哈立德20分钟前“所以你实际上有一个实际的代码,有一个实际的问题,但没有在你的问题中包含任何细节?我试着用很多方法去做你建议的事情,但它对我不起作用,所以我没有包含它,因为它看起来是错的。我只加入了代码的工作版本来解释它的想法,并要求对其进行工作修改。。特别是“这两个谓词”?我数到四。“以更好的方式”以什么方式?我的意思是
path1
path2
谓词。我使用
path
合并了它们,但是您可以看到它们是相同的,只需更改
connected
中参数的顺序即可。我正在寻找一个wat,它使我只编写一个谓词,以执行与上述代码相同的操作@WillNess“是的,我在这里提问之前已经尝试过了,而且还跟踪了它,所以它不能按需要工作。说明:如果我查询路径(a,c,path),它会在第一次回溯时正确地得到路径,但随后我需要剪切。但是如果我查询相反方向的路径(c,a,path),这将导致堆栈被填满,而不需要填充,因为它会在事实之间“摇摆”。-哈立德20分钟前“所以你实际上有一个实际的代码,有一个实际的问题,但没有在你的问题中包含任何细节?我试着用很多方法去做你建议的事情,但它对我不起作用,所以我没有包含它,因为它看起来是错的。我只加入了代码的工作版本来解释它的想法,并要求对其进行工作修改。。特别是,.nice!:)_______完美的非常感谢你的帮助。很好!:)_______完美的非常感谢你的帮助。