Автор работы: Пользователь скрыл имя, 16 Октября 2011 в 13:01, лабораторная работа
Решение задачи с помощью языка Пролог.
Задание:
Комендант переселял
студентов на время ремонта общежития.
Дело это не простое. Судите сами. На
очередную комнату было 8 кандидатов,
а поселить в неё можно было
только четырёх. Пошёл комендант
расспрашивать студентов, кто с
кем жить хочет. Вот, что он услышал:
Андрей согласен на любых соседей. Борис
без Кости не переселится. Костя не хочет
жить в одной комнате с Василием. Василий
согласен жить с кем угодно. Дима не будет
переселяться без Юры. Федя не будет без
Гриши жить в одной комнате с Димой, а без
Димы не будет жить в одной комнате с Костей.
Гриша не хочет, чтобы его соседями были
Борис и Костя вместе, а кроме того он не
желает жить в одной комнате ни с Андреем,
ни с Василием. Юра даст согласие переехать
в новую комнату, если туда же переберутся
либо Борис, либо Федя. Кроме того Юра не
будет жить в одной комнате с Костей, если
туда не переедет Гриша, и не желает жить
в одной комнате ни с Андреем , ни с Василием.
Каким образом комендант смог учесть все
пожелания?
Обозначим переменной R список из двух комнат по четыре студента.
T1 = [_,_,_,_],T2 = [_,_,_,_],R = [T1,T2].
В комнату T1 будем заселять тех студентов, которые согласны переехать в получившемся составе.
Остальных несогласных
студентов поселим в комнату
T2.
Листинг программы
на языке Strawberry
Prolog:
solve(R):- T1 = [_,_,_,_],T2 =
[_,_,_,_],R = [T1,T2],
sosed(R,kostya,boris),
not_sosed(R,vasya,kostya),
sosed(R,yura,dima),
(sosed3(R,fedya,dima,grisha);
(sosed3(R,fedya,dima,kostya);
not_sosed3(R,boris,kostya,
not_sosed(R,andrey,grisha),
not_sosed(R,vasya,grisha),
(sosed(R,boris,yura);sosed(R,
(sosed3(R,yura,kostya,grisha);
not_sosed(R,andrey,yura),
not_sosed(R,vasya,yura).
sosed([L1,L2],X1,X2):-member(
not_sosed([L1,L2],X1,X2):-
member(X1,L2),member(X2,L2).
sosed3([L1,_],X1,X2,X3):-
?-solve(I),nl,write(I).
Вывод:
Задача не имеет решений в данном виде.
Условие «Гриша не хочет, чтобы его соседями были Борис и Костя вместе» исключает все возможные комбинации вариантов ответа.
Без этого условия
программа выдаёт множество вариантов
перестановок одного ответа.
Для примера:
Первоначальные попытки поселить мальчиков в две комнаты в соответствии с их пожеланиями, не увенчались успехом.