我必须在Prolog的网格中的两个给定点之间创建一条路径。我到目前为止的代码是:
createPath(GridSize, BeginPosition, EndPosition, VisitedPoints, Path):-
nextStep(BeginPosition, NextStep, GridSize),
(
NextStep \== EndPosition,
->
nonmember(NextStep, VisitedPoints),
add(NextStep, VisitedPoints, NewVisitedPoints),
add(NextStep, Path, NewPath),
createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, NewPath)
;
???
).
我的代码的一些解释:
GridSize只是一个整数。如果是2,则网格是2x2网格。所以所有的网格都是方形的。
BeginPosition和EndPosition如下所示:pos(X,Y)。
函数nextStep查找给定位置的有效neigbor。 X和Y的值必须介于1和网格大小之间。我已经声明了nextStep的4个不同的谓词:X + 1,X - 1,Y + 1和Y - 1。 这是代码:
nextStep(pos(X,Y),pos(X1,Y),GridSize):-
X1 is X + 1,
X1 =< GridSize.
nextStep(pos(X,Y),pos(X1,Y),_):-
X1 is X - 1,
X1 >= 1.
nextStep(pos(X,Y),pos(X,Y1),GridSize):-
Y1 is Y + 1,
Y1 =< GridSize.
nextStep(pos(X,Y),pos(X,Y1),_):-
Y1 is Y - 1,
Y1 >= 1.
如果给定元素没有出现在给定列表中,nonmember会返回true。
add将一个元素添加到给定列表中,并返回包含该元素的列表。
了解VisitedPoints的另一件事:最初,BeginPosition和EndPosition存储在该列表中。例如,如果我想在2x2网格中找到路径,并且我必须避免使用点pos(2,1),那么我将调用这样的函数:
createPath(2, pos(1,1), pos(2,2), [pos(1,1),pos(2,2),pos(2,1)], X).
我应该得到的结果应该是:
X = [pos(1,2)]
因为这是连接pos(1,1)和pos(2,2)所需的点。 我的问题是,当NextStep == EndPosition时,如何阻止代码运行。换句话说,我必须在'???'的位置键入什么?或者我是以错误的方式处理这个问题的?
我对Prolog很陌生,从面向对象的语言到这一步非常困难。
我希望有人能回答我的问题。
亲切的问候,
WALLE
答案 0 :(得分:1)
我认为你只是将'赋值'放在错误的地方
createPath(GridSize, BeginPosition, EndPosition, VisitedPoints, Path):-
nextStep(BeginPosition, NextStep, GridSize),
(
NextStep \== EndPosition,
->
nonmember(NextStep, VisitedPoints),
add(NextStep, VisitedPoints, NewVisitedPoints),
% add(NextStep, Path, NewPath),
% createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, NewPath)
createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, Path)
;
% ???
% bind on success the output variable, maybe add EndPosition
Path = VisitedPoints
).
也许这不是一个完全值得回答,但评论会有点'模糊'