Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных студентов на Delphi (файл записей) + Блок схемы
Метод конечных разностей для интерполяции/экстраполяции на Delphi
Расчет мер близости на отношениях на Delphi + Пояснительная записка

Задача о том кто какую читает книгу
Как-то раз случай свел в купе известного астронома, поэта, прозаика и драматурга. Это были Алексеев, Борисов, Константинов и Дмитриев. Оказалось, что каждый из них взял с собой книгу, написанную одним из пассажиров этого купе. Алексеев и Борисов углубились в чтение, предварительно обменявшись купленными книгами. Поэт читал пьесу. Прозаик, очень молодой человек, выпустивший свою первую книгу, говорил, что он никогда ничего не читает по астрономии. Борисов купил в дорогу одно из произведений Дмитриева. Никто из пассажиров не покупал и не читал книги. Написанные им самим. Что читал каждый из них? Кто кем был?

Код Visual Prolog:
/*
147 Пассажиры - книголюбы

% Как-то раз случай свел в одном купе известного историка, поэта, прозаика и драматурга.
% Это были Алексеев, Борисов, Константинов и Дмитриев.
% Оказалось, что каждый из них взял с собой книгу, написанную одним из пассажиров.
% Алексеев и Борисов, дочитав каждый свою книгу, условились на завтра обменяться ими.
% Поэт читал пьесу.
% Прозаик, очень молодой человек, выпустивший свою первую книгу, говорил, что он в жизни не читал и не читает ничего по истории.
% Борисов купил произведение Дмитриева.
% Никто из пассажиров не покупал и не читал книгу, написанную им самим.
Что читал каждый из них?
Кто кем был?
*/

CONSTANTS
tab = " " % константа для отступов при выводе результатов
Domains
жанрКниги, жанрПисателя = symbol

фамилияПисателя = symbol
возможныеФамилии = фамилияПисателя*

пассажир = книголюб(фамилияПисателя,жанрПисателя,списокКниг)
списокПассажиров = пассажир*
списокСписковПассажиров = списокПассажиров*

книга = книга(фамилияПисателя,жанрКниги)
списокКниг = книга*

predicates
nondeterm возможнаяФамилия(фамилияПисателя)
nondeterm пишетВЖанре(жанрПисателя,жанрКниги)

nondeterm списокПассажировИКниг(списокПассажиров,списокКниг)

nondeterm одинИз(списокПассажиров,списокСписковПассажиров)
nondeterm одинИз(пассажир,списокПассажиров)
nondeterm одинИз(книга,списокКниг)

nondeterm читал(пассажир,книга)
nondeterm взялССобой(пассажир,книга)

nondeterm ищемРешение(списокПассажиров)

% формирование уникального списка решений и форматный вывод в окно программы
nondeterm уникальные_решения(списокСписковПассажиров,списокСписковПассажиров,списокСписковПассажиров)
nondeterm списокРешений(списокСписковПассажиров)
nondeterm выводРешений()
nondeterm выводРешений(списокСписковПассажиров)
nondeterm печатьРешенияКтоЧтоЧитал(списокПассажиров)
nondeterm печатьРешенияКтоКемБыл(списокПассажиров)

CLAUSES
одинИз(Х,[Первый|Хвост]):- Х=Первый; одинИз(Х,Хвост).

% Как-то раз случай свел в одном купе известного историка, поэта, прозаика и драматурга.
пишетВЖанре(историк,история).
пишетВЖанре(поэт,стихи).
пишетВЖанре(прозаик,проза).
пишетВЖанре(драматург,пьеса).
% Это были Алексеев, Борисов, Константинов и Дмитриев.
возможнаяФамилия(алексеев).
возможнаяФамилия(борисов).
возможнаяФамилия(константинов).
возможнаяФамилия(дмитриев).

списокПассажировИКниг(Пассажиры,Книги):-
% генерируем различные уникальные жанры
пишетВЖанре(ЖанрПисателя1,_),пишетВЖанре(ЖанрПисателя2,_),пишетВЖанре(ЖанрПисателя3,_),пишетВЖанре(ЖанрПисателя4,_),
% уникальность жанров
not(ЖанрПисателя1=ЖанрПисателя2),
not(ЖанрПисателя1=ЖанрПисателя3),not(ЖанрПисателя2=ЖанрПисателя3),
not(ЖанрПисателя1=ЖанрПисателя4),not(ЖанрПисателя2=ЖанрПисателя4),not(ЖанрПисателя3=ЖанрПисателя4),
% список пассажиров, с различными комбинациями жанров
Алексеев = книголюб(алексеев, ЖанрПисателя1 ,[_,_]),
Борисов = книголюб(борисов, ЖанрПисателя2 ,[_,_]),
Константинов = книголюб(константинов,ЖанрПисателя3 ,[_]),
Дмитриев = книголюб(дмитриев, ЖанрПисателя4 ,[_]),
% упорядоченный список пассажиров
Пассажиры=[Алексеев,Борисов,Константинов,Дмитриев],
% соответствие жанров
пишетВЖанре(ЖанрПисателя1,ЖанрКниги1),
пишетВЖанре(ЖанрПисателя2,ЖанрКниги2),
пишетВЖанре(ЖанрПисателя3,ЖанрКниги3),
пишетВЖанре(ЖанрПисателя4,ЖанрКниги4),
% жанр писател должен соответствовать жанру написанной им книги
К1 = книга(алексеев, ЖанрКниги1),
К2 = книга(борисов, ЖанрКниги2),
К3 = книга(константинов,ЖанрКниги3),
К4 = книга(дмитриев, ЖанрКниги4),
% упорядоченный список книг
Книги = [К1,К2,К3,К4].

% сопоставляет Книгу с однойИз ПрочитанныхКниг Пассажира
читал(Пассажир,Книга):-
Пассажир=книголюб(_,_,ПрочитанныеКниги),
одинИз(Книга,ПрочитанныеКниги).

взялССобой(Пассажир,Книга):-
Пассажир = книголюб(_,_,[Книга|_]),
читал(Пассажир,Книга).

ищемРешение(Пассажиры):-
% Как-то раз случай свел в одном купе известного историка, поэта, прозаика и драматурга.
% Это были Алексеев, Борисов, Константинов и Дмитриев.

% ГИПОТЕЗА %
% формируются упорядоченные списки, где у пассажиров указана фамилия и жанр (список прочитанных книг неопределён [_] или [_,_])
% отдельно формируется список книг, написанных этими писателями
списокПассажировИКниг(Пассажиры,Книги),

одинИз(Алексеев,Пассажиры),
одинИз(Борисов,Пассажиры),
одинИз(Константинов,Пассажиры),
одинИз(Дмитриев,Пассажиры),

Поэт = книголюб(_,поэт,_), одинИз(Поэт,Пассажиры),
Прозаик = книголюб(_,прозаик,_),одинИз(Прозаик,Пассажиры),

% Оказалось, что каждый из них взял с собой книгу, написанную одним из пассажиров.
% Проверка на уникальность книг. Необходима здесь, т.к.
% именно здесь мы говорим, что каждый пассажир
% читал однуИз книг, написанных другими пассажирами
одинИз(К1,Книги),
одинИз(К2,Книги),not(К1=К2),
одинИз(К3,Книги),not(К1=К3),not(К2=К3),
одинИз(К4,Книги),not(К1=К4),not(К2=К4),not(К3=К4),

Пьеса = книга(_,пьеса), одинИз(Пьеса,Книги),
КнигаПоИстории = книга(_,история), одинИз(КнигаПоИстории,Книги),
ПроизведениеДмитриева = книга(дмитриев,_), одинИз(ПроизведениеДмитриева,Книги),
НаписалАлексеев = книга(алексеев,_), одинИз(НаписалАлексеев,Книги),
НаписалБорисов = книга(борисов,_), одинИз(НаписалБорисов,Книги),
НаписалКонстантинов = книга(константинов,_), одинИз(НаписалКонстантинов,Книги),
НаписалДмитриев = книга(дмитриев,_), одинИз(НаписалДмитриев,Книги),

% у пассажиров заполняется список книг, т.о. формируются все возможные комбинации решений.
% список пассажиров упорядоченный.
читал(Алексеев,К1),читал(Борисов,К2),читал(Константинов,К3),читал(Дмитриев,К4),

% ПРОВЕРКА ГИПОТЕЗЫ %

% Алексеев и Борисов, дочитав каждый свою книгу, условились на завтра обменяться ими.
Алексеев = книголюб(алексеев,_,[КнигаЧиталАлексеев,КнигаЧиталБорисов]),
Борисов = книголюб(борисов,_, [КнигаЧиталБорисов,КнигаЧиталАлексеев]),

% Поэт читал пьесу. (В смысле: поэт взял с собой пьесу
% т.е. это была его первая прочитанная книга и, возможно, единственная).
% поэт взял с собой пьесу
взялССобой(Поэт,Пьеса),

% Прозаик, очень молодой человек, выпустивший свою первую книгу, говорил, что он в жизни не читал и не читает ничего по истории.
not( читал( Прозаик, КнигаПоИстории)),

% Борисов купил произведение Дмитриева.
взялССобой(Борисов,ПроизведениеДмитриева),

% Дмитриев - не прозаик, т.к. прозаик выпустил всего одну книгу, а борисов купл одно из нескольких произведений Дмириева
одинИз(Дмитриев,Пассажиры),Дмитриев = книголюб(дмитриев,НеПрозаик,_),
not(НеПрозаик = "прозаик"),

% Никто из пассажиров не покупал и не читал книгу, написанную им самим.
not( читал( Алексеев, НаписалАлексеев)),
not( читал( Борисов, НаписалБорисов)),
not( читал( Константинов, НаписалКонстантинов)),
not( читал( Дмитриев, НаписалДмитриев)).

% процедура для фильтрации не уникальных решений
уникальные_решения([],Уникальные_Решения,Уникальные_Решения).
уникальные_решения([Решение|Хвост_Решений],Уникальные_Решения,Уникальные_Решения_Выход):-
not(одинИз(Решение,Уникальные_Решения)),
уникальные_решения(Хвост_Решений,[Решение|Уникальные_Решения],Уникальные_Решения_Выход).
уникальные_решения([Решение|Хвост_Решений],Уникальные_Решения,Уникальные_Решения_Выход):-
одинИз(Решение,Уникальные_Решения),
уникальные_решения(Хвост_Решений,Уникальные_Решения,Уникальные_Решения_Выход).

% формирует список уникальных решени
списокРешений(Список_Уникальных_Решений):-
findall(Пассажиры,ищемРешение(Пассажиры),Список_Всех_Решений),
уникальные_решения(Список_Всех_Решений,[],Список_Уникальных_Решений).

% процедура перебирает список решений и вызывает процедуру вывода каждого решения на экран в читабельном виде
выводРешений():-
списокРешений(Список_Уникальных_Решений),
выводРешений(Список_Уникальных_Решений).
выводРешений([]).
выводРешений([Решение|ОстальныеРешения]):-
nl,write("Вывод решения:"),nl,
write(tab,"Кто кем был?"),nl,
печатьРешенияКтоКемБыл(Решение),
write(tab,"Кто что читал?"),nl,
печатьРешенияКтоЧтоЧитал(Решение),
выводРешений(ОстальныеРешения).

% вывод каждого решения на экран в читабельном виде
% ответ на вопрос: "Кто кем был?"
печатьРешенияКтоКемБыл([]).
печатьРешенияКтоКемБыл(Пассажиры):-
Пассажиры = [Первый|Остальные],
Первый = книголюб(Фамилия,Жанр,_),
write(tab,tab,Фамилия, " был ", Жанр,"ом"),nl,
печатьРешенияКтоКемБыл(Остальные).
% ответ на вопрос: "Кто что читал?"
печатьРешенияКтоЧтоЧитал([]).
печатьРешенияКтоЧтоЧитал(Пассажиры):-
Пассажиры = [Первый|Остальные],
Первый = книголюб(Фамилия,_,СписокКниг),
write(tab,tab,Фамилия, " читал ", СписокКниг),nl,
печатьРешенияКтоЧтоЧитал(Остальные).

goal
% ОТВЕТЫ НА ВОПРОСЫ %
выводРешений().




Код Prolog:
DOMAINS s=string sl=s* sll=sl*
CONSTANTS
names=["Alekseev","Borisov","Konstantinov","Dmitriev"]
prof=["astronomiya","poeziya","proza","drama"]
PREDICATES
solve(sl,sl,sl,sll)
getProf(integer,s,sll,sl,sl,s)
nonC(sll)
member(sl,s,sl) member(sll,sl,sll)
CLAUSES
solve([M|Men],Nms1,Prfs2,[[M,Pr,Avt,PrA]|H]):- solve(Men,Nms0,Prfs0,H),
getProf(0,M,H,Prfs0,Prfs1,Pr), member(Nms0,Avt,Nms1),
Avt<>M, getProf(1,Avt,H,Prfs1,Prfs2,PrA), not(nonC([[M,Pr,Avt,PrA]|H])).
solve([],names,prof,[]).
/***************************************************/
getProf(0,M,H,X,X,Pr):- member(H,[_,_,M,Pr],_),!.
getProf(1,M,H,X,X,Pr):- member(H,[M,Pr|_],_),!.
getProf(_,_,_,X,Y,Pr):- member(X,Pr,Y).
/***************************************************/
nonC([["Alekseev","proza"|_],["Borisov",_,_,"astronomiya"]|_]).
nonC([["Alekseev",_,_,"astronomiya"],["Borisov","proza"|_]|_]).
nonC([["Alekseev",_,X,_]|_]):- X<>"Dmitriev".
nonC([["Borisov",_,X,_]|_]):-X<>"Konstantinov".
nonC([[_,"poeziya",_,X]|_]):- X<>"drama".
nonC([[_,"proza",_,"astronomiya"]|_]).
nonC([["Dmitriev","proza"|_]|_]).
/***************************************************/
member([X|Y],X,Y).
member([X|Y],Z,[X|H]):- member(Y,Z,H).


Опубликовал Kest June 17 2009 11:34:18 · 0 Комментариев · 11892 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
XPmenu
THttpScan v4.1
Программа рисует ...
Binary2XMLDemo (Р...
База данных: Книж...
Bitmap [для кнопок]
CS:Source - монит...
SearchAndReplace
Prolog Interprete...
Создание фракталов
Х. М. Дейтел, П. ...
Программирование ...
Delphi 6/7 базы д...
PBFoldder
Последнее загруж...
Панель Наша Кнопка
PolyFlow
VFW
Анекдоты с ostrie.ru
Comdrv

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Ставки на спорт в ...
компьютеров:: если...
Кэширование узла (...
14.4. Алгоритм сор...
Переписать текст и...
внести параметры в...
Краткая характерис...
Указатель this
Можно ли играть бе...
Создание индекса (...
Установка голубого...
Office 365 уже сег...
Класс TTalk
Основные принципы ...
Заблуждения и недо...
Нарушения правильн...
для проектирования...
Раздел описания ме...
Оболочка независим...
Объяснение решения
PNG - самый соврем...
Упражнение 2: прое...
Организация информ...
Современное состоя...
Процедура DetectGr...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?