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

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

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

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

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

Не могу понять как записать условия. Буду рад любой помощи. Спасибо!
Листинг программы
  1. студенты("Артур").
  2. студенты("Василий").
  3. студенты("Надежда").
  4. студенты("Эльвира").
  5. картины("Айвазовский").
  6. картины("Босх").
  7. картины("Левитан").
  8. картины("Рембрандт").
  9. музеи("Эрмитаж").
  10. музеи("Русский музей").
  11. музеи("Корпус Бенуа Русского музея").
  12. музеи("Музей космонавтики").

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

textual
Листинг программы
  1. %факты
  2. имя(артур).
  3. имя(василий).
  4. имя(надежда).
  5. имя(эльвира).
  6.  
  7. музей(эрмитаж).
  8. музей(русский).
  9. музей(бенуа).
  10. музей(космос).
  11.  
  12. художник(айвазовский).
  13. художник(босх).
  14. художник(левитан).
  15. художник(рембрант).
  16.  
  17. /* unique(List) – проверка того, что ни один элемент списка не повторяется
  18.  * дважды. В списке нет повторяющихся элементов, если первый элемент списка
  19.  * не встречается в хвосте, а также, в хвосте нет повторяющихся элементов.
  20.  * Условием выхода из рекурсии может быть пустота исходного списка – в нем
  21.  * гарантированно нет повторяющихся элементов.
  22. */
  23.  
  24. unique([]):-!.
  25. unique([Head|Tail]):-
  26.    member(Head, Tail), !, fail;
  27.    unique(Tail).
  28.  
  29. /* У студента уникальные имя, музей, художник */
  30.  
  31. решение(Студенты) :-
  32.     Студенты = [студент(Имя1, Музей1, Художник1),
  33.                 студент(Имя2, Музей2, Художник2),
  34.                 студент(Имя3, Музей3, Художник3),
  35.                 студент(Имя4, Музей4, Художник4)],
  36.    
  37.     имя(Имя1), имя(Имя2), имя(Имя3), имя(Имя4),
  38.     unique([Имя1,Имя2,Имя3,Имя4]),
  39.     музей(Музей1), музей(Музей2), музей(Музей3), музей(Музей4),
  40.     unique([Музей1,Музей2,Музей3,Музей4]),
  41.     художник(Художник1), художник(Художник2), художник(Художник3), художник(Художник4),
  42.     unique([Художник1,Художник2,Художник3,Художник4]),
  43.  
  44. /* Василий решил посетить музей космонавтики */
  45.  
  46.     member(студент(василий, космос, Художник1), Студенты),
  47.    
  48. /* В корпусе Бенуа была выставка полотен Левитана */
  49.  
  50.     member(студент(Имя2, бенуа, левитан), Студенты),
  51.    
  52. /* Надежда любит  Айвазовского */
  53.    
  54.     member(студент(надежда, Музей3, айвазовский), Студенты),
  55.    
  56. /* Эльвира предпочитает Рембрандта */
  57.  
  58.     member(студент(эльвира, Музей4, рембрант), Студенты),
  59.    
  60. /* В Русском музее не выставляются картины иностранных авторов */
  61.    
  62.     not(member(студент(_,эрмитаж,левитан), Студенты)),
  63.     not(member(студент(_,эрмитаж,айвазовский), Студенты)),
  64.        
  65. /* в Эрмитаже нет русских */
  66.  
  67.     not(member(студент(_,русский,босх), Студенты)),
  68.     not(member(студент(_,русский,рембрант), Студенты)).
  69.        
  70. /** <examples>
  71.  
  72. ?- решение(Студенты).
  73.  
  74. */
  75.  
  76. /*
  77.  * [студент(василий, космос, босх), студент(артур, бенуа, левитан), студент(надежда, русский, айвазовский), студент(эльвира, эрмитаж, рембрант)]
  78. */

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут