Prolog中的流程列表

时间:2012-11-04 17:14:34

标签: list prolog wumpus-world

我在使用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)).

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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,
    !
    .