Path 在prolog中的网格中创建路径
我必须在Prolog中的网格中的两个给定点之间创建一条路径。到目前为止,我掌握的代码是:Path 在prolog中的网格中创建路径,path,grid,prolog,Path,Grid,Prolog,我必须在Prolog中的网格中的两个给定点之间创建一条路径。到目前为止,我掌握的代码是: createPath(GridSize, BeginPosition, EndPosition, VisitedPoints, Path):- nextStep(BeginPosition, NextStep, GridSize), ( NextStep \== EndPosition, -> nonmember(NextStep, Visite
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栅格。所以所有的网格都是正方形的
起始位置和结束位置如下所示:pos(X,Y)
函数nextStep查找给定位置的有效neigbor。X和Y的值必须介于1和栅格大小之间。我已经声明了下一步的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.
我应该得到的结果应该是:
X = [pos(1,2)]
因为这是连接位置(1,1)和位置(2,2)所需的点。
我的问题是,当NextStep==EndPosition时,如何停止代码运行。换句话说,我必须在“?”的位置键入什么?还是我处理这个问题的方式不对
我对Prolog非常陌生,从面向对象语言到这一步非常困难
我希望有人能回答我的问题
亲切问候,
Walle我想你只是把path的“分配”放错了地方
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
).
也许这不完全值得回答,但是一个评论会有点“模糊”我想你只是把path的“分配”放错了地方
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
).
也许这不完全值得回答,但一条评论会有点“模糊”我将路径可能不访问的点存储在VisitedPoints中。不是从点A到点B的实际点。我想将它们存储在路径中。但我明白你的想法,我会试试看;)谢谢我对你的答案做了一些修改,现在可以了!我引入了一个新的列表,在其中附加了“find”点,然后将该列表绑定到输出变量上。我将路径可能不访问的点存储在VisitedPoints中。不是从点A到点B的实际点。我想将它们存储在路径中。但我明白你的想法,我会试试看;)谢谢我对你的答案做了一些修改,现在可以了!我引入了一个新的列表,将“find”点附加到该列表中,然后将该列表绑定到输出变量上。