Я пытаюсь использовать Пролог для решения простой игры, в которой есть 3 игрока: Алиса, Боб и Чарли. Каждый игрок тайно выбирает карту для игры, причем карты могут быть красными или синими. Затем карты перемешиваются и переворачиваются.
Принимая точку зрения Алисы, мы знаем, какую карту она сыграла. Следовательно, если открытые карты синие, синие и красные, а Алиса играла красными, то она может сделать вывод, что и Боб, и Чарли играли синими. Я изо всех сил пытаюсь определить соответствующие причины для этого. Вот мои основные факты:
player(alice).
player(bob).
player(charlie).
color(blue).
color(red).
% The overturned cards -- all players can see these. Order is unimportant.
cards([blue, red, red]).
played(alice, blue).
Из этого мы должны сделать вывод, что Боб и Чарли играли красным. Я не знаю, как сообщить Прологу, что каждый из трех игроков сыграл ровно одну карту из факта cards([blue, red, red])
. Или, может быть, что-то вроде num_cards(blue, 1), num_cards(red, 2)
было бы лучше?
В качестве чуть более сложного примера можно использовать следующие факты для вывода о том, что Чарли сыграл красную карточку (например, если Алиса смогла посмотреть на карту, сыгранную Бобом):
player(alice).
player(bob).
player(charlie).
color(blue).
color(red).
% The overturned cards -- all players can see these. Order is unimportant.
cards([blue, red, red]).
played(alice, red).
played(bob, blue).
Самый похожий вопрос SO, который мне удалось найти, был этот, но я не был в состоянии применить это к моей проблеме. Библиотека CLPFD определенно кажется актуальной.