Я реализую вариант загадки Эйнштейна, и у меня возникли некоторые проблемы.
При попытке вычислить решение я пробую это:
solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5],
%hint one goes here
%hint two goes here
%etc.
Затем я могу спросить решение, набрав:solve(Street)
Однако это подходит как решение:
- дом (цветок, еда, домашнее животное, спорт)
- дом (цветок, еда, домашнее животное, спорт)
- дом(x , еда, домашнее животное, спорт)
- дом (цветок, еда, домашнее животное, спорт)
- дом(x, цветок, домашнее животное, спорт)
Как видите, 2 раза x, остальные — это все виды продуктов, цветов, домашних животных и спорта. Но каждый тип уникален: если одному человеку нравится цветок X, никому другому X не может понравиться.
Теперь легко понять причину, по которой мое решение дает 2 x: нам дано некоторое количество подсказок, но во всех подсказках упоминаются только 4 цветка. Таким образом, Пролог не знает, что есть еще один цветок, и просто дважды использует x просто потому, что это возможно, и выполняет все остальные подсказки.
Что я хочу сказать, так это то, что все типы еды, цветов и т. д. на улице уникальны, поэтому он должен оставить пустое место, когда он уже использовал все типы. 3 будет выглядеть как: house(x , food, pet ,sport)
, а 5 будет выглядеть как: house(_, flower, pet, sport)
.
Я также пытался добавить это в подсказки: (скажем, «кактус» — это один из цветов, не упомянутых в подсказках) member(house(cactus,_,_,_), Street)
Однако на этом моя программа не заканчивается...
Подсказка может выглядеть так: is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street),
с : is_neighbour(A,B,List)
дает true
, когда A и B находятся рядом друг с другом в List
. Подсказку можно перевести так: человек, который любит футбол, живет рядом с человеком, у которого есть рыба.
Если нужно предоставить дополнительную информацию, я готов уточнить. :)