0

我在 Prolog 中使用列表时遇到问题。我正在实现一个 Wumpus World 示例,并且需要在每次用户移动期间移动 wumpus。wumpus 的移动是在列表中预定义的,我不知道如何弹出列表的头部来设置 wumpus 的位置。Wumpus 列表将是:[left,right,up,down,...,right]。这是我到目前为止所拥有的,这显然是错误的。

我的代码并不需要确切的代码,只需要一个列表示例以及如何从列表中设置方向/值以及如何删除列表中弹出的头部将是理想的。

wumpusPath([left,up,down,right,left,down]).

moveWumpus :-
    wumpusDirection(wumpusPath),
    wumpusLocation(X,Y),
    newLocation(X,Y,wumpusDirection,X1,Y1),
    worldSize(CheckX,CheckY),
    X1 =< CheckX,
    X1 > 0,
    Y1 =< CheckY,
    Y1 > 0,
    !,
    retract(wumpusLocation(X,Y)),
    assert(wumpusLocation(X1,Y1)).
4

2 回答 2

2

请记住,可以通过头尾访问列表:如果 L = [a, b,c] 并且 L = [H | T] 则 H 与 a 统一,T 与 [b, c] 统一。

于 2012-11-04T18:02:42.400 回答
1
wumpusPath([left,up,down,right,left,down]).

wumpusDirection([D|P],D,P).                   % see below ****

moveWumpus :-
    wumpusPath(Path),                         % retrieve the Path
    wumpusDirection(Path,Direction,NewPath),  % set Direction from it ****
    wumpusLocation(X,Y),
    newLocation(X,Y,Direction,X1,Y1),
    worldSize(CheckX,CheckY),
    X1 =< CheckX,
    X1 > 0,
    Y1 =< CheckY,
    Y1 > 0,
    !,
    retractall(wumpusLocation(X,Y)),          % remember NewPath somehow too
    asserta(wumpusLocation(X1,Y1)).

但是,与其断言事实,不如让你的move谓词与参数一起工作:有些会"in",有些会"out"

moveWumpus(Path,X,Y, NewPath,X1,Y1) :-

    wumpusDirection(Path,Direction,NewPath), 

    newLocation(X,Y,Direction,X1,Y1),
    worldSize(CheckX,CheckY),
    X1 =< CheckX,
    X1 > 0,
    Y1 =< CheckY,
    Y1 > 0,
    !
    .
于 2012-11-05T09:32:07.363 回答