Решение логических задач - 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>
- ?- решение(Студенты).
- */
- /*
- * [студент(василий, космос, босх), студент(артур, бенуа, левитан), студент(надежда, русский, айвазовский), студент(эльвира, эрмитаж, рембрант)]
- */
Объяснение кода листинга программы
- Объявлены факты:
- имя(артур).
- имя(василий).
- имя(надежда).
- имя(эльвира).
- музей(эрмитаж).
- музей(русский).
- музей(бенуа).
- музей(космос).
- художник(айвазовский).
- художник(босх).
- художник(левитан).
- художник(рембрант).
- Определен базовый случай для функции unique:
- unique([]):-!.
- Определен рекурсивный случай для функции 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(студент(_,русский,рембрандт), Студенты)).
- Василий решил посетить музей космонавтики:
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д