Решение логических задач - Prolog - Prolog

Формулировка задачи:

Доброго времени суток уважаемые форумчане.Прошу помочь с заданием: Студенты математического факультета Артур, Василий, Надежда и Эльвира поехали на каникулах в город Санкт-Петербург. Однако в дороге выяснилось, что им нравятся картины разных художников (Айвазовский, Босх, Левитан, Рембрандт). Поэтому на следующий день трое из ребят разошлись по различным музеям (Эрмитаж, Русский музей, Корпус Бенуа Русского музея), а Василий решил посетить музей космонавтики (однако он по-прежнему любит живопись, просто обнаружилось, что в Санкт- Петербурге нет интересующих его полотен). Известны следующие факты. В корпусе Бенуа была выставка полотен Левитана. В Русском музее не выставляются картины иностранных авторов, а в Эрмитаже почти нет русских (будем считать, что там нет Айвазовского и Левитана). Надежда любит маринистов и больше всего Айвазовского, а Эльвира предпочитает Рембрандта. Найдите, куда каждый из студентов направился и каковы его или ее вкусы. Не могу понять как записать условия. Буду рад любой помощи. Спасибо!
студенты("Артур").
студенты("Василий").
студенты("Надежда").
студенты("Эльвира").
картины("Айвазовский").
картины("Босх").
картины("Левитан").
картины("Рембрандт").
музеи("Эрмитаж").
музеи("Русский музей").
музеи("Корпус Бенуа Русского музея").
музеи("Музей космонавтики").


textual

Код к задаче: «Решение логических задач - Prolog - Prolog»

%факты
имя(артур).
имя(василий).
имя(надежда).
имя(эльвира).
 
музей(эрмитаж).
музей(русский).
музей(бенуа).
музей(космос).
 
художник(айвазовский).
художник(босх).
художник(левитан).
художник(рембрант).
 
/* unique(List) – проверка того, что ни один элемент списка не повторяется 
 * дважды. В списке нет повторяющихся элементов, если первый элемент списка 
 * не встречается в хвосте, а также, в хвосте нет повторяющихся элементов. 
 * Условием выхода из рекурсии может быть пустота исходного списка – в нем 
 * гарантированно нет повторяющихся элементов.
*/
 
unique([]):-!.
unique([Head|Tail]):-
   member(Head, Tail), !, fail;
   unique(Tail).
 
/* У студента уникальные имя, музей, художник */
 
решение(Студенты) :-
    Студенты = [студент(Имя1, Музей1, Художник1),
                студент(Имя2, Музей2, Художник2),
                студент(Имя3, Музей3, Художник3),
                студент(Имя4, Музей4, Художник4)],
    
    имя(Имя1), имя(Имя2), имя(Имя3), имя(Имя4),
    unique([Имя1,Имя2,Имя3,Имя4]),
    музей(Музей1), музей(Музей2), музей(Музей3), музей(Музей4),
    unique([Музей1,Музей2,Музей3,Музей4]),
    художник(Художник1), художник(Художник2), художник(Художник3), художник(Художник4),
    unique([Художник1,Художник2,Художник3,Художник4]),
 
/* Василий решил посетить музей космонавтики */
 
    member(студент(василий, космос, Художник1), Студенты),
    
/* В корпусе Бенуа была выставка полотен Левитана */
 
    member(студент(Имя2, бенуа, левитан), Студенты),
    
/* Надежда любит  Айвазовского */
    
    member(студент(надежда, Музей3, айвазовский), Студенты),
    
/* Эльвира предпочитает Рембрандта */
 
    member(студент(эльвира, Музей4, рембрант), Студенты),
    
/* В Русском музее не выставляются картины иностранных авторов */
    
    not(member(студент(_,эрмитаж,левитан), Студенты)),
    not(member(студент(_,эрмитаж,айвазовский), Студенты)),
        
/* в Эрмитаже нет русских */
 
    not(member(студент(_,русский,босх), Студенты)),
    not(member(студент(_,русский,рембрант), Студенты)).
        
/** <examples>
 
?- решение(Студенты).
 
*/
 
/*
 * [студент(василий, космос, босх), студент(артур, бенуа, левитан), студент(надежда, русский, айвазовский), студент(эльвира, эрмитаж, рембрант)]
*/
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

7   голосов, оценка 4.143 из 5

Источник