Список процессов в прологе

У меня проблемы с использованием списков в Прологе. Я реализую пример 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)).

2 ответа

Решение
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 предикат работы с аргументами: некоторые будут идти "в", а некоторые "из":

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,
    !
    .

Помните, что список доступен по заголовку: если L = [a, b,c] и L = [H | T], тогда H объединяется с a, а T с [b, c].

Другие вопросы по тегам