У меня есть динамический список, в котором хранится координата поля и владелец этого поля.
:-dynamic
board/2.
Одна запись в этом списке выглядит так:
board(e4,[w]).
Есть еще 22 позиции на доске, все похожие.
Я пытаюсь реализовать ИИ для игры, для которой предназначена доска. Я использую альфа-бета-алгоритм и поэтому должен создавать новые «доски» для оценки ситуации.
У меня есть копия оригинальной доски для работы, но теперь у меня есть функция настройки доски для текущего хода, например:
move(position,boardOld,boardNew)
Это называется рекурсивным, поэтому во втором вызове boardOld равняется boardNew, а boardNew — это oldBoard со следующим шагом в анализе.
Моя идея состояла в том, чтобы копировать старую плату в каждой итерации, но я понятия не имею, как это сделать, поскольку это
copy_predicate_clauses(boardOld(A,B),boardNew(A,B)).
добавит старую доску к новой доске, потому что список уже существует.
Я использую следующий алгоритм (не могу его скопировать, так как это изображение):
http://www.cuceinetwork.net/archivos/prolog/The_Art_of_Prolog.pdf
Страница PDF 445 (страница книги 407).
Алгоритм получает позицию как «доску» при инициализации, я не знаю, как это сделать с моим списком, и, кроме того, предложение move(Move,Position,Position1) возвращает новую доску с текущим ходом. Это называется рекурсивным, и я понятия не имею, как создать доску для позиции 1, не перезаписывая те, что были раньше.
Редактировать//
хорошо, я понял проблему. Но я уже много раз использовал этот предикат в своей игре и не хочу все менять. Я сделал это:
findall((X,Y),board(X,Y),CurrentBoard).
CurrentBoard дает мне такой список
[(e4,[w,w]),(g4,[s,w]),(b7,[r,w,s])]
Теперь я не могу использовать свои методы для определения возможных ходов.
У меня есть такие факты, как
move(e4,d5).
move(d5,e6).
указав, какой ход (от, до) возможен, и теперь я попробовал это
findall((X,Y),listMoves(CurrentBoard,X,Y),possibleMoves).
с чем-то вроде этого. Я борюсь в этот момент. Как создать список с возможными ходами. Мне каким-то образом нужно получить координату X из currentBoard, проверить, принадлежит ли мне глава списка из этой координаты (пешки на этой координате), и проверить, свободна ли координата Y (до).
listMoves([Coordinate|[Head|Tail]], X, Y) :-
move(X,Y),
ownField(X,Coordinate,Head),
board/2
— это предикат, а не список), и он не подходит для этой цели. Вам лучше создать явные списки для состояния вашей доски и передать их всем, потому что манипулировать фактическими списками намного проще, чем манипулировать фактами в динамическом хранилище. - person Daniel Lyons   schedule 14.01.2016possibleMoves
- это атом, а не переменная в Прологе. :) - person Daniel Lyons   schedule 14.01.2016[Coordinate|[Head|Tail]]
эквивалентно[Coordinate,Head|Tail]
, что, вероятно, не то, что вам нужно. На самом деле это может помочь проиллюстрировать, почему неразумно использовать,/2
, как если бы в Прологе были пары; вы можете слишком легко запутаться. - person Daniel Lyons   schedule 14.01.2016CurrentBoard
и извлечь их? У вас есть идея, как генерировать ходы от X до Y с цветом пешки w? Я думаю, что не понимаю вашей идеи, как это сделать ... довольно поздно в Европе, завтра уже проверю ответы ... спасибо, хотя - person Sven182   schedule 14.01.2016