Не находит результат проверки - Prolog

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

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

Здравствуйте! Возникла непонятная для меня ситуация. По заданию (см ниже) необходимо найти десерт, для этого я создала 4 списка по каждому из блюд. но пролог выдает no solution после проверки, и я не знаю, как это можно изменить. кто знает, как изменить проверку, или список исходных блюд, подскажите. Задача: Три журналиста во время завтрака наблюдали за одним человеком. При этом они сделали следующие записи. Жюль. Сначала он выпил виски, затем съел утку с апельсинами и десерт. Наконец, он выпил кофе. Жак. Он выпил аперитив, а затем съел пирог и грушу "прекрасная Елена". Джим. Сначала он выпил виски, затем съел пирог и клубничный шербет. А закончил он завтрак чашкой кофе. (Внимание. Все, что написал один из журналистов,- неправда, другой сделал лишь одну ложную запись, а третий - вообще никогда не лжет.) Попытайтесь, исходя из этих противоречивых сообщений, определить, что выбрал на десерт человек, о котором шла речь? код программы:
Листинг программы
  1. DOMAINS
  2. журналист=symbol
  3. номер=integer
  4. блюдо=symbol
  5. содержание=symbol
  6. гипотеза=гипотеза(запись,содержание)
  7. запись=запись(журналист,номер)
  8. список_истинности=список_содержаний*
  9. список_содержаний=содержание*
  10. список_журналистов=журналист*
  11. список_списков=список_блюд*
  12. список_блюд=блюдо*
  13. PREDICATES
  14. nondeterm наблюдение(запись,блюдо)
  15. nondeterm один_из(журналист,список_журналистов)
  16. nondeterm один_из(список_содержаний,список_истинности)
  17. nondeterm проверка(гипотеза,список_блюд,список_блюд)
  18. nondeterm является_блюдом(блюдо,список_блюд,список_блюд)
  19. nondeterm не_является_блюдом(блюдо,список_блюд,список_блюд)
  20. nondeterm человек_съел(список_списков)
  21. nondeterm входит_в(блюдо,список_блюд)
  22. CLAUSES
  23. % Правила для формирования гипотезы
  24. один_из(Т,[Т|_]).
  25. один_из(Т,[_|Остаток_списка]):-один_из(Т,Остаток_списка).
  26. % Принадлежность элемента списку
  27. входит_в(X,[X|_]).
  28. входит_в(X,[_|Хвост]):-входит_в(X,Хвост).
  29. % Добавление и удаление элемента из списка
  30. является_блюдом(B,[],[B]).
  31. является_блюдом(B,C,C):-входит_в(B,C),!.
  32. является_блюдом(B,[H|C],[H|C1]):-
  33. является_блюдом(B,C,C1).
  34. не_является_блюдом(_,[],[]).
  35. не_является_блюдом(B,[B|T],T1):-
  36. не_является_блюдом(B,T,T1).
  37. не_является_блюдом(B,[H|T],[H|T1]):-
  38. not(B=H),
  39. не_является_блюдом(B,T,T1).
  40.  
  41. % Правила для проверки гипотезы
  42. проверка(гипотеза(Запись,истина),Список,Что_съел):-
  43. наблюдение(Запись,Блюдо),
  44. является_блюдом(Блюдо,Список,Что_съел).
  45. проверка(гипотеза(Запись,ложь),Список,Что_съел):-
  46. наблюдение(Запись,Блюдо),
  47. входит_в(Блюдо,Список),
  48. не_является_блюдом(Блюдо,Список,Что_съел).
  49.  
  50. % Описание высказываний из условий задачи
  51. %Жюль. Сначала он выпил виски, затем съел утку с апельсинами и десерт. Наконец, он выпил кофе.
  52. наблюдение(запись(жюль,1),"виски").
  53. наблюдение(запись(жюль,2),"утка_с_апельсинами").
  54. наблюдение(запись(жюль,3),"десерт").
  55. наблюдение(запись(жюль,4),"кофе").
  56. %Жак. Он выпил аперитив, а затем съел пирог и грушу "прекрасная Елена".
  57. наблюдение(запись(жак,1),"аперитив").
  58. наблюдение(запись(жак,2),"пирог").
  59. наблюдение(запись(жак,3),"груша").
  60. %Джим. Сначала он выпил виски, затем съел пирог и клубничный шербет. А закончил он завтрак чашкой кофе.
  61. наблюдение(запись(джим,1),"виски").
  62. наблюдение(запись(джим,2),"пирог").
  63. наблюдение(запись(джим,3),"клубничный_щербет").
  64. наблюдение(запись(джим,4),"кофе").
  65.  
  66. % Правила поиска решения
  67. человек_съел(Список_блюд):-
  68. % Формируем базовый список высказываний и гипотез
  69. Первое=[виски,аперитив],
  70. Второе=[утка_с_апельсинами,пирог],
  71. Десерт=[груша,клубничный_щербет,десерт],
  72. Наконец=[кофе],
  73. Список=[жюль,жак,джим],
  74. Список_истинности=[[лжет,прав,прав,прав],
  75. [прав,лжет,прав,прав],
  76. [прав,прав,лжет,прав],
  77. [прав,прав,прав,лжет]],
  78. один_из(С1,Список),
  79. Г11=гипотеза(запись(С1,1),прав),
  80. Г12=гипотеза(запись(С1,2),прав),
  81. Г13=гипотеза(запись(С1,3),прав),
  82. Г14=гипотеза(запись(С1,4),прав),
  83. один_из(С2,Список), not12),
  84. Г21=гипотеза(запись(С2,1),лжет),
  85. Г22=гипотеза(запись(С2,2),лжет),
  86. Г23=гипотеза(запись(С2,3),лжет),
  87. Г24=гипотеза(запись(С2,4),лжет),
  88. один_из(С3,Список), not13),not23),
  89. один_из([И1234],Список_истинности),
  90. Г31=гипотеза(запись(С3,1),И1),
  91. Г32=гипотеза(запись(С3,2),И2),
  92. Г33=гипотеза(запись(С3,3),И3),
  93. Г34=гипотеза(запись(С3,4),И4),
  94. проверка(Г11,Первое,Первое),
  95. проверка(Г12,Второе,Второе),
  96. проверка(Г13,Десерт,Десерт),
  97. проверка(Г14,Наконец,Наконец),
  98. проверка(Г21,Первое,Первое),
  99. проверка(Г22,Второе,Второе),
  100. проверка(Г23,Десерт,Десерт),
  101. проверка(Г24,Наконец,Наконец),
  102. проверка(Г31,Первое,Первое),
  103. проверка(Г32,Второе,Второе),
  104. проверка(Г33,Десерт,Десерт),
  105. проверка(Г34,Наконец,Наконец),
  106. Список_блюд=[Первое,Второе,Десерт,Наконец].
  107. GOAL человек_съел([_,_,На_десерт,_]).

Решение задачи: «Не находит результат проверки»

textual
Листинг программы
  1. claim(_, X, Y) :-
  2.     ( abstract(X, Y) ; abstract(Y, X) ),
  3.     !.
  4. claim(1, X, X).
  5. claim(0, X, Y) :-
  6.     X \= Y.

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


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

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

14   голосов , оценка 4 из 5

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

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

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