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