ОдинИз(НаписалДмитриев,Книги),
ОдинИз(НаписалКонстантинов,Книги),
ОдинИз(Прозаик,Пассажиры),
% Сталось, що кожен з них узяв с собою книгу, написану одним з пасажирів.
% Перевірка на унікальність книг необхідна тут, оскільки
% саме тут говоримо, що кожен пасажир читав одну з книг, %написаних іншими пасажирами
одинИз(К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
% ВІДПОВІДІ НА ПИТАННЯ %
выводРешений().