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

Узнай цену своей работы

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

Доброго времени суток.Прошу помочь с заданием:

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

Не могу понять как записать условия. Буду рад любой помощи. Спасибо!

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

textual
Листинг программы
%факты
имя(артур).
имя(василий).
имя(надежда).
имя(эльвира).
 
музей(эрмитаж).
музей(русский).
музей(бенуа).
музей(космос).
 
художник(айвазовский).
художник(босх).
художник(левитан).
художник(рембрант).
 
/* 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>
 
?- решение(Студенты).
 
*/
 
/*
 * [студент(василий, космос, босх), студент(артур, бенуа, левитан), студент(надежда, русский, айвазовский), студент(эльвира, эрмитаж, рембрант)]
*/

Объяснение кода листинга программы

  1. Объявлены факты:
    • имя(артур).
    • имя(василий).
    • имя(надежда).
    • имя(эльвира).
    • музей(эрмитаж).
    • музей(русский).
    • музей(бенуа).
    • музей(космос).
    • художник(айвазовский).
    • художник(босх).
    • художник(левитан).
    • художник(рембрант).
  2. Определен базовый случай для функции unique:
    • unique([]):-!.
  3. Определен рекурсивный случай для функции unique:
    • unique([Head|Tail]):- member(Head, Tail), !, fail; unique(Tail).
  4. Определена функция решение:
    • решение(Студенты) :- Студенты = [студент(Имя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]), ...
  5. Определены условия для выбора студентов:
    • Василий решил посетить музей космонавтики:
      • member(студент(василий, космос, Художник1), Студенты).
    • В корпусе Бенуа была выставка полотен Левитана:
      • member(студент(Имя2, бенуа, левитан), Студенты).
    • Надежда любит Айвазовского:
      • member(студент(надежда, Музей3, айвазовский), Студенты).
    • Эльвира предпочитает Рембрандта:
      • member(студент(эльвира, Музей4, рембрандт), Студенты).
    • В Русском музее не выставляются картины иностранных авторов:
      • not(member(студент(_,эрмитаж,левитан), Студенты)).
      • not(member(студент(_,эрмитаж,айвазовский), Студенты)).
    • В Эрмитаже нет русских:
      • not(member(студент(_,русский,босх), Студенты)).
      • not(member(студент(_,русский,рембрандт), Студенты)).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

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