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