【发布时间】:2021-05-19 06:07:25
【问题描述】:
我是 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).
但仍需要删除更多重复的代码行。
【问题讨论】:
-
“这两个谓词”?我数了四。 “以更好的方式”以什么方式?
-
我的意思是
path1和path2谓词。我使用path将它们合并,但您可以看到它们是相同的预测,只是更改了connected中的参数顺序。我正在寻找一种让我只编写一个谓词来与上述代码相同的方法。 @WillNess -
"是的,我在这里问我的问题之前已经尝试过了,并且还跟踪了它,所以它不能按需要工作。说明:如果我查询路径(a,c,Path) , 它会为第一个回溯正确获取路径, 但是我需要剪切. 但是如果我查询相反方向的路径 (c,a,Path), 这将导致堆栈被填充而无需填充在事实之间“摇摆不定”。– Khalid 20 分钟前” 所以你实际上有一个实际问题的实际代码,但在你的问题中没有包含任何细节?
-
我尝试以多种方式执行您的建议,但它对我不起作用,因此我没有将其包括在内,因为它似乎是错误的。我只包含了代码的工作版本来解释它的想法并要求进行工作修改。
标签: prolog