在prolog中创建网格中的路径

时间:2012-11-04 13:56:17

标签: path grid prolog

我必须在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

1 个答案:

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

也许这不是一个完全值得回答,但评论会有点'模糊'