我必须在 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 查找给定位置的有效邻居。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 还是很陌生,从面向对象语言迈出这一步非常困难。
我希望有人能回答我的问题。
亲切的问候,
瓦勒