Задача по программированию

Автор работы: Пользователь скрыл имя, 16 Октября 2011 в 13:01, лабораторная работа

Краткое описание

Решение задачи с помощью языка Пролог.

Содержимое работы - 1 файл

Пролог. Задача про коменданта.doc

— 138.00 Кб (Скачать файл)

Задание:

Комендант переселял  студентов на время ремонта общежития. Дело это не простое. Судите сами. На очередную комнату было 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);not_sosed(R,dima,fedya)),

(sosed3(R,fedya,dima,kostya);not_sosed(R,kostya,fedya)),

not_sosed3(R,boris,kostya,grisha),

not_sosed(R,andrey,grisha),

not_sosed(R,vasya,grisha),

(sosed(R,boris,yura);sosed(R,fedya,yura)),

(sosed3(R,yura,kostya,grisha);not_sosed(R,kostya,yura)),

not_sosed(R,andrey,yura),

not_sosed(R,vasya,yura). 
 

sosed([L1,L2],X1,X2):-member(X1,L1),member(X2,L1);member(X2,L2).

not_sosed([L1,L2],X1,X2):-member(X1,L1),member(X2,L2);member(X1,L2),member(X2,L1);

member(X1,L2),member(X2,L2).

sosed3([L1,_],X1,X2,X3):-member(X1,L1),member(X2,L1),member(X3,L1). 
 

?-solve(I),nl,write(I).

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

      Вывод:

Задача не имеет  решений в данном виде.

Условие «Гриша не хочет, чтобы его соседями были Борис и Костя вместе» исключает все возможные комбинации вариантов ответа.

Без этого условия  программа выдаёт множество вариантов  перестановок одного ответа. 

Для примера: 

 

 

Первоначальные  попытки поселить мальчиков в  две комнаты в соответствии с  их пожеланиями, не увенчались успехом.

Информация о работе Задача по программированию