Решение загадки Эйнштейна в Прологе
Я пытаюсь разгадать загадку Эйнштейна в Прологе.
У меня возникли проблемы с программой, которую я написал. Основной метод - добавить все ограничения и позволить Прологу найти единственно возможные решения.
Проблема в том, что Пролог находит 0 решений. Я выделил ограничение, которое заставляет программу перейти от данного решения к отсутствию решений, но я не понимаю, почему.
/*There are five houses*/
exists(A, list(A,_,_,_,_)).
exists(A, list(_,A,_,_,_)).
exists(A, list(_,_,A,_,_)).
exists(A, list(_,_,_,A,_)).
exists(A, list(_,_,_,_,A)).
middle_house(A, list(_,_,A,_,_)).
first_house(A, list(A,_,_,_,_)).
nextTo(A, B, list(B,A,_,_,_)).
nextTo(A, B, list(_,B,A,_,_)).
nextTo(A, B, list(_,_,B,A,_)).
nextTo(A, B, list(_,_,_,B,A)).
nextTo(A, B, list(A,B,_,_,_)).
nextTo(A, B, list(_,A,B,_,_)).
nextTo(A, B, list(_,_,A,B,_)).
nextTo(A, B, list(_,_,_,A,B)).
/* each statement will be described using the clues
house conatins: Color,Owner, Drinks, Smokes, Pet*/
riddle(Houses):-
/*exists(house(red, englishman, _,_,_),Houses),*/
nextTo(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Houses),
exists(house(_,spanish,_,_, dog), Houses),
exists(house(green, _, coffee, _,_), Houses),
exists(house(_, ukrain, tea,_,_), Houses),
nextTo(house(white,_,_,_,_), house(green,_,_,_,_), Houses),
exists(house(_,_,_,marlbero, cat),Houses),
exists(house(yellow,_,_,time,_), Houses),
middle_house(house(_,_,milk,_,_), Houses),
first_house(house(_,norwegian,_,_,_), Houses),
nextTo(house(_,_,_,_,fox), house(_,_,_,montena,_), Houses),
nextTo(house(_,_,_,time,_), house(_,_,_,_,horse), Houses),
exists(house(_,_,orange,lucky,_), Houses),
exists(house(_,japanese,parlament,_), Houses).
Текущее решение этого заключается в следующем:
?- riddle(Houses). Houses = list( house(green, norwegian, coffee, marlbero, cat), house(white, spanish, orange, lucky, dog), house(yellow, norwegian, milk, time, fox), house(blue, ukrain, tea, montena, horse), house(_G7257, japanese, parlament, _G7260)).
и если я раскомментирую первую строку, то это же утверждение вернет false.
Я хотел бы помочь понять, почему это так. Я отметил, что в частичном решении норвежский появляется дважды, и это может указывать на проблему.
1 ответ
Вот общий способ, как вы можете решить эту проблему для себя. На самом деле, вы действительно начали в довольно многообещающем направлении: вы пытались удалить цели. Но кто виноват в вашем деле? Строка, которую вы закомментировали или остальные? Вы не можете сказать это наверняка, так как результирующая программа уже работала. Но есть очень похожий и гораздо более многообещающий способ: постарайтесь обобщить вашу программу настолько, насколько это возможно, чтобы она по-прежнему не работала. Таким образом, вы получите меньшую программу, которая отвечает за сбой. То есть внутри оставшейся видимой части должна быть ошибка!
Вот что я получил, удалив цели (добавив * перед) и заменив некоторые термины на _.
: - инициализация (загадка (_Sol)).:- op(950, фу, *). *_. Загадка (дома):- существует (дом (красный, _/*англичанин*/, _,_,_), дома), nextTo(дом (_,_/*норвежский*/, _,_,_), дом (синий, _, _, _, _), дома), *существует (дом (_, испанский, _, _, _, собака), дома), *существует (дом (зеленый, _, кофе, _, _), Дома), *существует (дом (_, украина, чай, _, _), дома), nextTo (дом (белый, _, _, _, _, _), дом (зеленый, _, _, _, _, _), Дома), *существует (дом (_,_,_,marlbero, кошка), Дома), существует (дом (желтый,_,_,_/*время*/,_), дома), *middle_house (дом (_, _, молоко, _, _), дома), *first_house (дом (_, норвежский, _, _, _), дома), *nextTo (дом (_, _, _, _, _, лиса), дом (_, _, _, montena, _), Дома), *nextTo (дом (_, _, _, время, _), дом (_, _, _, _, _, лошадь), Дома), *существует (house (_, _, orange, lucky, _), Houses), существует (house (_,_/*japanese* /, _/*parlament*/,_), Houses).
Этот фрагмент все еще терпит неудачу, таким образом, ошибка должна быть в видимой части программы.
Кажется необходимым, чтобы присутствовали все цвета дома. Есть только одна цель, которая вообще не содержит цвета дома... понимаете?