Решение загадки Эйнштейна в Прологе

Я пытаюсь разгадать загадку Эйнштейна в Прологе.

У меня возникли проблемы с программой, которую я написал. Основной метод - добавить все ограничения и позволить Прологу найти единственно возможные решения.

Проблема в том, что Пролог находит 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).

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

Кажется необходимым, чтобы присутствовали все цвета дома. Есть только одна цель, которая вообще не содержит цвета дома... понимаете?

Другие вопросы по тегам