0

Prolog でリストを使用するのに問題があります。私は Wumpus World の例を実装しており、ユーザーが移動するたびに wumpus を動かす必要があります。wumpus の動きはリストで事前定義されており、wumpus の位置を設定するためにリストの先頭をポップする方法がわかりません。Wumpus リストは次のようになります: [左、右、上、下、...、右]。ここに私がこれまでに持っているものがありますが、これは明らかに間違っています。

私のコードに正確なコードは必要ありません。リストの例と、リストから方向/値を設定する方法と、ポップされたリストの先頭を削除する方法が理想的です。

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

リストは head と tail でアクセスできることを思い出してください: 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 に答える