Пролог и логические пазлы
Кажется, у меня проблема с объединением фактов в Прологе, но я не могу это подтвердить. Все выглядит так, как будто это должно работать, и я посмотрел примеры решенных логических головоломок, использующих Пролог, но безрезультатно, учитывая относительную редкость Пролога.
Это дополнительное кредитное задание, поэтому я не уверен, что оно действительно, но я искренне озадачен тем, как действовать дальше.
% Names
name(teo).
name(mira).
name(bruno).
name(igor).
%Food
food(sandwich).
food(pie).
food(hamburger).
food(pizza).
%Hobby
hobby(crosswords).
hobby(writing).
hobby(reading).
hobby(photography).
%Shirt Colour
shirt(white).
shirt(yellow).
shirt(blue).
shirt(red).
%Other
girl(mira).
student((Name, Food, Hobby, Shirt)) :-
name(Name), food(Food), hobby(Hobby), shirt(Shirt).
solution(L):-
length(L,4),
L= [student(teo, sandwich,_,_),_,_,_],
member(student(mira, pite, crosswords,_),L),
member(student(girl(GirlName),_,_,white),L),
member(student(bruno,_,_,yellow),L),
member(student(_,hamburger,writing,_),
L= [_, student(_,pie,_,_),_,_],
next(student(_,pie,_,_), student(teo,_,_,_), L),
next(student(bruno,_,_,_), student(_,pizza,_,_), L),
next(student(_,_,_,white), student(_,pizza,_,_), L),
member(student(igor,_,reading,_),L),
next(student(_,_,_,blue), student(girl(GirlName),_,_,_), L).
next(A, B, Ls) :- append(_, [A,B|_], Ls).
next(A, B, Ls) :- append(_, [B,A|_], Ls).
Проблема в том, что это не лечит solution(L)
как будто это предикат или правило, просто блок текста, поэтому я даже не могу проверить, правильно это или нет. Меня больше всего интересует, почему он даже не работает.
1 ответ
Сначала я думал, что это girl/1
виновник, как отмечали многие. Но даже при удалении всех таких вхождений ваше определение все равно не выполняется (и после исправления этой синтаксической ошибки). Вот ответственная часть, которая до сих пор не solution(L)
:
: - op (950, фу, *). *(_). решение (L):- *длина (L, 4), L = [студент (_ / *teo* /, бутерброд,_,_),_,_,_], участник (студент (_ / *mira* /, pite, _ / *кроссворды* /, _), L), *член (студент (девушка (GirlName),_,_, белый), L), *участник (студент (бруно, _, _, желтый), L), член (студент (_, гамбургер, _ / *письмо*/,_),L), L= [_, студент (_, пирог, _, _) | _ / *[_, _]* /], *следующий (студент (_, пирог, _, _), студент (тео, _, _, _), L), следующий (_/ * студент (bruno, _, _, _) * /, студент (_, пицца, _, _), L), *следующий (студент (_, _, _, белый), студент (_, пицца, _, _), L), *член (студент (игорь, _, чтение, _), L), *следующий (студент (_, _, _, синий), студент (девушка (GirlName),_,_, _), L). следующий (A, B, Ls):- добавить (_, [A,B|_], Ls). следующий (A, B, Ls):- добавить (_, [B,A|_], Ls).
Все имена не имеют значения, так же, как их хобби. Что действительно важно, так это еда!
У вас есть только четыре места, но всего пять блюд (бутерброд, пирог, пирог, гамбургер, пицца) - дайте мне только одно из них!
Это хорошая вещь в Прологе: вы можете делать такие обобщения, чтобы получить точный диагноз.