Назначьте набор ролей для набора людей - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь написать программу для решения этой игры . Вам не нужно проверять это на этот вопрос.

Дело в том, что есть 6 человек: Капеллан, ChiefEngineer, MedicalDoctor, Клоун, робототехника, SecurityOfficer

Они разделяют следующие роли: NukeOp, Facehugged, Киборг, Перевертыш и 2 х ОК

Моя идея - использовать факты в форме роли (человека), например NukeOp (капеллан).

Вопрос в том, как мне создать правило, которое гласит, что если один человек играет определенную роль, тогда

  1. Тот же человек не имеет никакой другой роли; например, если NukeOp (капеллан), то не Facehugged (капеллан). (Примечание: я надеюсь, что больше не встретлю монстра-отрицателя! Или я должен создать возможные факты отрицания?)
  2. Та же роль не может быть взята у других; например, если NukeOp (капеллан), то не NukeOp (клоун). Исключение: есть два парня Ok (X), поэтому должно быть два значения для X в Ok (X), прежде чем Ok (X: любое другое значение, кроме этих двух) должно быть вычислено как ложное

Я хотел бы, если возможно, получить ответ, который приведет меня к правильному мышлению, не предоставляя полного решения, таким образом, получая удовольствие от моделирования и запоминания языка:)

1 Ответ

0 голосов
/ 29 июня 2018

Думаю, будет проще, если вы будете использовать предикаты вида hasRole(Person, Role).

Чтобы убедиться, что у человека есть только одна роль:

hasSingleRole(Person, Role) :- hasRole(Person, Role), \+ ((hasRole(Person, Role2), Role \= Role2)).

Аналогично, для обеспечения уникальности роли:

hasUniqueRole(Person, Role) :- hasRole(Person, Role), \+ ((hasRole(Person2, Role), Person\= Person2)).

Можно сделать то же самое с форматом role(Person), но для этого требуется, чтобы вы явно перечислили все роли и занялись метапрограммированием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...