1

我必须在 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 还是很陌生,从面向对象语言迈出这一步非常困难。

我希望有人能回答我的问题。

亲切的问候,

瓦勒

4

1 回答 1

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
    ).

也许这并不完全值得回答,但评论会有点“模糊”

于 2012-11-05T13:11:35.370 回答