Visual Prolog 5.2 логическая задача "На выставке собак"

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

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

Доброго времени суток. Есть следующая задача: На выставке собак случилась интересная ситуация. Четыре брата - Энди, Билл, Николас и Дональд - выставили по две собаки, которых звали так же, как братьев. То есть двух собак звали Энди, двух Билл, двух - Николас и двух - Дональд. Из восьми собак было три лабрадора, три дога и два далматинца. Никто из братьев не держит двух собак одной породы. Нет двух собак одной породы с одинаковой кличкой. Никакая из собак Энди не носит имя Дональд и никакая из собак Николаса не зовется Энди. Нет дога по кличке Энди, и нет Лабрадора по кличке Дональд. У Билла нет лабрадора. Кто держит далматинцев? Какие у них клички? Собственными силами был получен такой код:
Листинг программы
  1. DOMAINS
  2. хозяин=symbol
  3. порода=symbol
  4. кличка=symbol
  5. пес=пес(хозяин,порода,кличка)
  6. псы=пес*
  7. PREDICATES
  8. nondeterm возможное_имя(хозяин)
  9. nondeterm возможная_порода(порода)
  10. nondeterm возможная_кличка(кличка)
  11. nondeterm входит(пес,псы)
  12. nondeterm условие(пес,пес)
  13. nondeterm условие(пес)
  14. nondeterm ответ(пес,пес)
  15.  
  16. CLAUSES
  17. возможное_имя(энди). возможное_имя(билл). возможное_имя(николас). возможное_имя(дональд).
  18. возможная_порода(лабрадор). возможная_порода(дог). возможная_порода(далматин).
  19. возможная_кличка(энди). возможная_кличка(билл). возможная_кличка(николас). возможная_кличка(дональд).
  20. %Принадлежность элемента списку
  21. входит(Элемент,[Элемент|_]).
  22. входит(Элемент,[_|Хвост]):-входит(Элемент,Хвост).
  23. %Никто из братьев не держит двух собак одной породы.
  24. условие(пес(Хозяин,Порода1,_),пес(Хозяин,Порода2,_)):-
  25. not(Порода1=Порода2).
  26. %Нет двух собак одной породы с одинаковой кличкой.
  27. условие(пес(_,Порода,Кличка1),пес(_,Порода,Кличка2)):-
  28. not(Кличка1=Кличка2).
  29. %Никакая из собак Энди не носит имя Дональд
  30. условие(пес(энди,_,Кличка)):-
  31. not(Кличка=дональд).
  32. %Никакая из собак Николаса не зовется Энди
  33. условие(пес(николас,_,Кличка)):-
  34. not(Кличка=энди).
  35. %Нет дога по кличке Энди
  36. условие(пес(_,Порода,Кличка)):-
  37. Порода=дог, not(Кличка=энди).
  38. %Нет Лабрадора по кличке Дональд.
  39. условие(пес(_,Порода,Кличка)):-
  40. Порода=лабрадор, not(Кличка=дональд).
  41. Билла нет лабрадора
  42. условие(пес(бил,Порода,_)):-
  43. not(Порода=лабрадор).
  44. ответ(пес(Хозяин1,далматин,Кличка1),пес(Хозяин2,далматин,Кличка2)):-
  45. %Генерация гипотезы
  46. возможное_имя(Хозяин1), возможная_кличка(Кличка1),
  47. возможное_имя(Хозяин2), возможная_кличка(Кличка2),
  48. Кличка1<>Кличка2, Хозяин1<>Хозяин2,
  49. условие(пес(Хозяин1,далматин,Кличка1)),
  50. условие(пес(Хозяин2,далматин,Кличка2)),
  51. возможная_порода(Порода1э), возможная_порода(Порода2э),
  52. возможная_порода(Порода1б), возможная_порода(Порода2б),
  53. возможная_порода(Порода1н), возможная_порода(Порода2н),
  54. возможная_порода(Порода1д), возможная_порода(Порода2д),
  55. возможная_кличка(Кличка1э), возможная_кличка(Кличка2э),
  56. возможная_кличка(Кличка1б), возможная_кличка(Кличка2б),
  57. возможная_кличка(Кличка1н), возможная_кличка(Кличка2н),
  58. возможная_кличка(Кличка1д), возможная_кличка(Кличка2д),
  59. Псы=[пес(энди,Порода1э,Кличка1э),
  60. пес(энди,Порода2э,Кличка2э),
  61. пес(билл,Порода1б,Кличка1б),
  62. пес(билл,Порода2б,Кличка2б),
  63. пес(николас,Порода1н,Кличка1н),
  64. пес(николас,Порода2н,Кличка2н),
  65. пес(дональд,Порода1д,Кличка1д),
  66. пес(дональд,Порода2д,Кличка2д)],
  67. %Проверка
  68. условие(пес(энди,Порода1э,Кличка1э),пес(энди,Порода1э,Кличка1э)),
  69. условие(пес(билл,Порода1б,Кличка1б),пес(билл,Порода2б,Кличка2б)),
  70. условие(пес(николас,Порода1н,Кличка1н),пес(николас,Порода2н,Кличка2н)),
  71. условие(пес(дональд,Порода1д,Кличка1д),пес(дональд,Порода2д,Кличка2д)),
  72. условие(пес(энди,Порода1э,Кличка1э)),
  73. условие(пес(энди,Порода2э,Кличка2э)),
  74. условие(пес(билл,Порода1б,Кличка1б)),
  75. условие(пес(билл,Порода2б,Кличка2б)),
  76. условие(пес(николас,Порода1н,Кличка1н)),
  77. условие(пес(николас,Порода1н,Кличка1н)),
  78. условие(пес(дональд,Порода1д,Кличка1д)),
  79. условие(пес(дональд,Порода2д,Кличка2д)),
  80. входит(пес(Хозяин1,далматин,Кличка1),Псы),
  81. входит(пес(Хозяин2,далматин,Кличка2),Псы).
  82. Goal
  83. ответ(пес(Чей1,Порода1,Кличка1),пес(Чей2,Порода2,Кличка2)).
Логика такая: мы предполагаем, что есть два далматина и задаем им случайных хозяев и клички. Также мы формируем полный список псов и прогоняем его через все условия, после чего проверяем входят ли те два далматина в этот список. Проблема судя по всему такая, что элементы списка как то странно проходят через условия(или даже вообще не проверяются). Скорее всего я не понимаю чего-то важного в работе Prologa Очень рассчитываю на помощь. Знаю что такая задача уже когда-то решалась, но препод очень тщательно проверяет на плагиат, и уже один раз заворачивал, если кто-нибудь сможет подсказать как доделать мою задумку, или скорректировать ее буду очень признательна. P.S. также пыталась решить формируя список хозяев, а не псов:
Листинг программы
  1. DOMAINS
  2. имя=symbol
  3. порода=symbol
  4. кличка=symbol
  5. хозяин=хозяин(имя,порода,кличка,порода,кличка)
  6. братья=хозяин*
  7. PREDICATES
  8. nondeterm возможная_порода(порода)
  9. nondeterm возможная_кличка(кличка)
  10. nondeterm владелец(хозяин)
  11. nondeterm ответ(братья)
  12.  
  13. CLAUSES
  14. возможная_порода(лабрадор). возможная_порода(дог). возможная_порода(далматин).
  15. возможная_кличка(энди). возможная_кличка(билл). возможная_кличка(николас). возможная_кличка(дональд).
  16. %Никто из братьев не держит двух собак одной породы.
  17. владелец(хозяин(_,Порода1,_,Порода2,_)):-
  18. not(Порода1=Порода2).
  19. %Никакая из собак Энди не носит имя Дональд
  20. владелец(хозяин(энди,_,Кличка1,_,Кличка2)):-
  21. not(Кличка1=дональд), not(Кличка2=дональд).
  22. %Никакая из собак Николаса не зовется Энди
  23. владелец(хозяин(николас,_,Кличка1,_,Кличка2)):-
  24. not(Кличка1=энди), not(Кличка2=энди).
  25. %Нет дога по кличке Энди
  26. владелец(хозяин(_,Порода1,Кличка1,Порода2,Кличка2)):-
  27. Порода1=дог, not(Кличка1=энди);
  28. Порода2=дог, not(Кличка2=энди).
  29. %Нет Лабрадора по кличке Дональд.
  30. владелец(хозяин(_,Порода1,Кличка1,Порода2,Кличка2)):-
  31. Порода1=лабрадор, not(Кличка1=дональд);
  32. Порода2=лабрадор, not(Кличка2=дональд).
  33. Билла нет лабрадора
  34. владелец(хозяин(билл,Порода1,_,Порода2,_)):-
  35. not(Порода1=лабрадор), not(Порода2=лабрадор).
  36. ответ(Братья):-
  37. Братья=[хозяин(энди,Порода1э,Кличка1э,Порода2э,Кличка2э),
  38. хозяин(билл,Порода1б,Кличка1б,Порода2б,Кличка2б),
  39. хозяин(николас,Порода1н,Кличка1н,Порода2н,Кличка2н),
  40. хозяин(дональд,Порода1д,Кличка1д,Порода2д,Кличка2д)],
  41. %Генерация гипотезы
  42. возможная_порода(Порода1э), возможная_порода(Порода2э),
  43. возможная_порода(Порода1б), возможная_порода(Порода2б),
  44. возможная_порода(Порода1н), возможная_порода(Порода2н),
  45. возможная_порода(Порода1д), возможная_порода(Порода2д),
  46. возможная_кличка(Кличка1э), возможная_кличка(Кличка2э),
  47. возможная_кличка(Кличка1б), возможная_кличка(Кличка2б),
  48. возможная_кличка(Кличка1н), возможная_кличка(Кличка2н),
  49. возможная_кличка(Кличка1д), возможная_кличка(Кличка2д),
  50. %Проверка
  51. владелец(хозяин(энди,Порода1э,Кличка1э,Порода2э,Кличка2э)),
  52. владелец(хозяин(билл,Порода1б,Кличка1б,Порода2б,Кличка2б)),
  53. владелец(хозяин(николас,Порода1н,Кличка1н,Порода2н,Кличка2н)),
  54. владелец(хозяин(дональд,Порода1д,Кличка1д,Порода2д,Кличка2д)).
  55. Goal
  56. ответ(Братья).
однако проблема точно такая-же.

Решение задачи: «Visual Prolog 5.2 логическая задача "На выставке собак"»

textual
Листинг программы
  1. ?- about_dogs(HostList).
  2. dog(bill,dal,andy)
  3. dog(nik,dal,don)
  4. HostList = [dog(andy, lab, nik), dog(andy, dog, bill), dog(bill, dog, don), dog(bill, dal, andy), dog(nik, lab, bill), dog(nik, dal, don), dog(don, lab, andy), dog(don, dog, nik)] .

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

  1. Задача программы - выводить информацию о собаках.
  2. Входные данные (переменная HostList) - список собак.
  3. Структура каждой собаки:
    • имя (переменная HostName)
    • порода (переменная Breed)
    • владелец (переменная Owner)
  4. Вывод информации о каждой собаке в формате: имя, порода, владелец.
  5. Пример вывода: andy, lab, nik

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


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

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

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

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

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

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