Path 在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

我必须在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栅格。所以所有的网格都是正方形的

起始位置和结束位置如下所示: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”点附加到该列表中,然后将该列表绑定到输出变量上。