nth1(1, Houses, [norwegian,_,_,_,_]),
/* 1. Норвежец живёт в первом доме. */
Houses = [_,_,_,_,_],
/* 0. Всего 5 домов */
А вот, собственно, и решение:
Т.е., либо X слева от Y, либо наоборот.
neighbors(X, Y, List) :- nextto(Y, X, List) .
neighbors(X, Y, List) :- nextto(X, Y, List).
Также, нам нужно уметь сказать что 2 дома стоят рядом друг с другом. Это можно реализовать вот таким простым предикатом:
nextto(X, Y, List) истина, если X стоит перед (слева от) Y в списке List
nth1(N, List, Elem) истина, если элемент Elem в списке List стоит на N-й (счет начинается с 1) позиции
member(Elem, List) истина, если элемент Elem есть в списке List
Для этого нам понадобятся стандартные предикаты:
Дом мы будем представлять как список из 5 элементов, по одному на каждый атрибут: национальность хозяина, домашний питомец, марка сигарет, напиток и цвет дома, соответственно. Всего домов 5, потому решение будем искать среди списков (списков) длины 5.
уже очень хорошо расписал товарищ , поэтому моя задача совсем проста.
Задача уже, наверно, всем поднадоела, потому буду краток.
Под катом можно увидеть почему Пролог так хорошо подходит для решения этой задачи.
Хотел продолжить неделю задачи Эйнштейна на Хабре. После и нестандартных решений, хотелось бы показать как логические задачки можно (и нужно) решать на языках логического программирования (простите за тавтологию).
Задача Эйнштейна на Прологе
Задача Эйнштейна на Прологе / Хабрахабр
Комментариев нет:
Отправить комментарий