Эйндштейн Риддл Пролог - PullRequest
       49

Эйндштейн Риддл Пролог

14 голосов
/ 13 февраля 2012

Мне нужна помощь с домашним заданием по прологу для моего класса ИИ.Вопрос в том, чтобы написать пролог код для головоломки Эйнштейна.Я знаю, как написать это по-своему, но есть некоторые ограничения в домашней работе.

 there are 5 houses
 the Englishman lives in the red house
 the Spaniard owns the dog
 coffee is drunk in the green house
 the Ukrainian drinks tea
 the green house is immediately to the right of the ivory house
 the Old Gold smoker owns snails
 Kools are smoked in the yellow house
 milk is drunk in the middle house
 the Norwegian lives in the first house
 the man who smokes Chesterelds lives in the house next to the man with the fox
 3 Kools are smoked in the house next to the house where the horse is kept
 the Lucky Strike smoker drinks orange juice
 the Japanese smokes Parliaments
 the Norwegian lives next to the blue house

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

Я собирался использовать анонимные переменные house (англичанин, красный, _, _, _) .но я не знаю, как интерпретировать это для домашней работы.

Вот ограничения: вы должны использовать следующие двоичные символы предиката:

owns(N,Pet)
smokes(N, Cigarette).
drinks(N, Drink).

Кроме того, вы можете использовать любойколичество предикатов.

вот как я инициализировал факты, но я не знаю, как сформулировать правила в этом случае

next_to(X,Y) :- right_of(X,Y); right_of(Y,X).

owns(spaniard, dog).
drinks(ukrainian, tea).
smokes(japanese, parliaments).
right_of(ivory, green).
lives(englishman, red).
owns(X, snail) :- smokes(X, old_gold).
smokes(X, kools) :- owns(X, yellow).
smokes(X, lucky_strike) :- drinks(X, orange_juice).
drinks(X, coffee) :- owns(X, green_house).

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

Ответы [ 3 ]

11 голосов
/ 13 февраля 2012

Этот сайт посвящен решению таких головоломок с помощью CLP (FD).Но полная мощность CLP (FD) здесь избыточна: ваше задание может быть эффективно решено путем поиска во всем пространстве решений, когда вы адекватно описали ограничения.

Решение будет состоять из 5 домов, где каждый атрибутудовлетворить все ограничения, налагаемые описанием.

Помните, что для каждого атрибута следует использовать один и тот же символ (т. е. green и green_house неверно, выберите один из них).

Также next_to кажется неправильным: если вы наберете от 1 до 5, это может быть вычислено или перечислено, но относится к непосредственному соседу.

Итак, завершите представление данных «пространство поиска решения»,что-то вроде

Problem = [
 house(1, Nationality1, Color1, Pet1, Drinks1, Smokes1),
 house(2, Nationality2, Color2, Pet2, Drinks2, Smokes2),
 ...
],
% place constraints
member(house(_, englishman, red, _, _, _), Problem),
member(house(_, spaniard, _, dog, _, _), Problem),
...

member / 2 - это более простая встроенная часть Пролога, но в этом случае достаточно для решения проблемы: когда все ограничения введены, переменные будут привязаны к соответствующим значениям.Ключом является способность элемента недетерминированно выбрать элемент (duh) решения.

Так что, когда вам нужно выразить ограничение между 2 различными элементами, вызовите 2 элемента member,и поместите ограничения между соответствующими переменными: то есть

человек, который курит Chesterelds, живет в доме рядом с человеком с лисой

будет переведен в

....,
member(house(N, _, _, _, _, chesterelds), Problem),
member(house(M, _, _, fox, _, _), Problem),
next_to(N, M),
...

При выражении многих ограничений таким образом, остерегайтесь идентичности символов: может быть полезно кодировать каждый предикат в отдельной процедуре, чтобы избежать ненужного наложения псевдонимов.Но couterpart также верно: если один и тот же символ участвует в более чем ограничении, необходимо будет обойти символ, чтобы сузить поиск.

Я позволю вам подумать о правильном представлении«геометрических» предикатов: next_to и right_of могут быть перечислены или выражены с помощью арифметики.

8 голосов
/ 15 февраля 2012
4 голосов
/ 20 ноября 2013

Перевод Пролога может быть простым, правило по правилу, все еще следуя парадигме создания экземпляра домена путем выбора из него .Здесь это дом атрибутов дома;в связанном ответе атрибуты дома фиксируются программистом-человеком, а домен - это фактические жилые дома, что позволяет использовать очень сжатое кодирование.

Другими словами, разница в нотации : сложная нотация уже ведет нас на полпути, но это был человек, который изобрел ее и последовал ей (как программист необходимость записывать norwegian непосредственно в спецификации дома first , в соответствующем аргументе position ) - не компьютер.

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

Мы кодируем его в стиле сверху вниз .Видимо, вопрос отсутствует.Это должно быть "кто пьет воду? Кому принадлежит зебра?"* Вот как в конечном итоге определяются дома:

5 ?- zebra(_, _, HS), maplist( writeln, HS),
     false.
[smoke-kools,  color-yellow, nation-nor,    owns-fox,      drink-water |_G859]
[nation-ukr,   drink-tea,    smoke-chester, owns-horse,    color-blue  |_G853]
[nation-eng,   color-red,    smoke-oldgold, owns-snails,   drink-milk  |_G775]
[nation-spa,   owns-dog,     color-ivory,   smoke-lucky,   drink-orange|_G826]
[drink-coffee, color-green,  nation-jpn,    smoke-parlamt, owns-zebra  |_G865]
false.

или со списками атрибутов, «замороженными» по фиксированной длине и затем отсортированными,

7 ?- zebra( _, _, HS), maplist( length, HS, _), !, maplist( sort, HS, S),
     maplist( writeln, S), false.
[color-yellow, drink-water,  nation-nor,  owns-fox,    smoke-kools  ]
[color-blue,   drink-tea,    nation-ukr,  owns-horse,  smoke-chester]
[color-red,    drink-milk,   nation-eng,  owns-snails, smoke-oldgold]
[color-ivory,  drink-orange, nation-spa,  owns-dog,    smoke-lucky  ]
[color-green,  drink-coffee, nation-jpn,  owns-zebra,  smoke-parlamt]
false.

Также легкосделать предикат attr/2 принять списки из Name-Value пар , что позволяет использовать более естественный и высокоуровневый стиль кодирования с видом "расширяемых записей" - можно даже сказать "объекты" - спецификации, например

zebra( Z, W ,HS):-         
    length(       HS, 5), 
    member(  H1,  HS),    attr( H1,  [nation-eng,   color-red  ] ),
    member(  H2,  HS),    attr( H2,  [nation-spa,   owns-dog   ] ),
    member(  H3,  HS),    attr( H3,  [drink-coffee, color-green] ),
    ......

и т. д. .

...