ОдинИз(НаписалДмитриев,Книги),

ОдинИз(НаписалКонстантинов,Книги),

ОдинИз(Прозаик,Пассажиры),

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