Загадка Эйнштейна На Prolog

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

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

Всем доброго времени суток! Вот недавно только узнал об одной очень извесной головоломки Эйнштейна - "Who has a fish?". И мне стало интерестно как можно решить эту головоломку при помощи Пролога. Я недавно только начал учить Prolog, поэтому моя попытка самому написать исходник не удалась. Искал в гугле исходники, но все примеры что я находил не казались мне понятными. Возможно тут есть те кто решал эту задачку...Дайте исходник и опишите текст проги, если не затруднит

Решение задачи: «Загадка Эйнштейна На Prolog»

textual
Листинг программы
  1. DOMAINS   s=string   sl=s*   sll=sl*   slll=sll*   sllll=slll*
  2. CONSTANTS  st=[["1","Norwegian","","","",""],["2","","Blue","","",""],["3","","","Milk","",""],["4","","","","",""],["5","","","","",""]]
  3. PREDICATES
  4. inFact(slll)
  5. go(sll)
  6. solve(sllll,sll)
  7. member(slll,sll)
  8. insList(sll,sll,sll)
  9. insert(sll,sll,sll)
  10. inHouse(sl,sl,sl)
  11.  
  12. CLAUSES
  13. go(Out):- findall(F,inFact(F),Facts), solve(Facts,Out).
  14.  
  15. solve([],st):-!.
  16. solve([Fact|H],Out):- solve(H,O), member(Fact,F), insList(F,O,Out).
  17.  
  18. insList(X,P,Pn):- insert(X,P,Pn).
  19. insList(X,[G|Y],[G|Z]):- !, insList(X,Y,Z).
  20.  
  21. insert([],X,X):-!.
  22. insert([X|Y],[G|H],[Gn|Hn]):- inHouse(X,G,Gn), insert(Y,H,Hn).
  23.  
  24. inHouse([],X,X):-!.
  25. inHouse([""|H],[X|Y],[X|Z]):- !, inHouse(H,Y,Z).
  26. inHouse([X|H],[X|Y],[X|Z]):- !, inHouse(H,Y,Z).
  27. inHouse([X|H],[""|Y],[X|Z]):- !, inHouse(H,Y,Z).
  28.  
  29. member([X|_],X).
  30. member([_|X],Y):- member(X,Y).
  31. /*************************************************************/
  32. inFact([[["","Englishman","Red"]]]).
  33. inFact([[["","Swede","","","","Dog"]]]).
  34. inFact([[["","Danish","","Tea"]]]).
  35. inFact([[["","","Green","Coffee"]]]).
  36. inFact([[["","","","","PallMall","Chicken"]]]).
  37. inFact([[["","","Yellow","","Dunhill"]]]).
  38. inFact([[["","","","Beer","Winfield"]]]).
  39. inFact([[["","German","","","Rothmans"]]]).
  40. inFact([[["","","","","","Fish"]]]).
  41. inFact([[["","","Green"],["","","White"]]]).
  42. inFact([[["","","","","Marlboro"],["","","","","","Cat"]],
  43.        [["","","","","","Cat"],["","","","","Marlboro"]]]).
  44. inFact([[["","","","","Dunhill"],["","","","","","Horse"]],
  45.        [["","","","","","Horse"],["","","","","Dunhill"]]]).
  46. inFact([[["","","","","Marlboro"],["","","","Water"]],
  47.        [["","","","Water"],["","","","","Marlboro"]]]).

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

  1. DOMAINS: определяются типы данных для переменных. В данном случае, s=string, sl=s, sll=sl, slll=sll, sllll=slll.
  2. CONSTANTS: определяются константы, используемые в задаче. В данном случае, это список строк [[1,Norwegian,,,,],[2,,`Blue`,,,],[3,,,Milk,,],[4,,,,,],[`5`,,,,,]].
  3. PREDICATES: определяются функции, которые будут использоваться в программе. В данном случае, это функции inFact/1, go/1, solve/2, member/2, insList/3 и insert/3.
  4. CLAUSES: определяются правила, которые преобразуют исходную информацию в результат. В данном случае, это правило для функции go/1, которое находит все факты и передает их в функцию solve/2.
  5. solve/2: рекурсивная функция, которая решает задачу. Если входной список пуст, то функция завершается. В противном случае, она рекурсивно вызывает себя для оставшейся части списка и добавляет первый элемент в результат.
  6. insList/3: функция, которая добавляет элемент в список. В данном случае, она вызывает функцию insert/3 для добавления элемента в список.
  7. insert/3: функция, которая добавляет элемент в список. Если список пуст, то элемент добавляется в начало списка. В противном случае, функция рекурсивно вызывает себя для оставшейся части списка и добавляет элемент после последнего элемента списка.
  8. inHouse/3: функция, которая проверяет, находится ли элемент в доме (списке). Если дом пуст, то элемент считается находящимся в доме. В противном случае, функция рекурсивно вызывает себя для оставшейся части дома и проверяет, является ли элемент последним элементом дома.
  9. member/2: функция, которая проверяет, является ли элемент членом списка. Если элемент является пустой строкой, то он не является членом списка. В противном случае, функция рекурсивно вызывает себя для оставшейся части списка.
  10. inFact/1: определяются факты, которые будут использоваться в задаче. В данном случае, это список фактов [[,`Englishman`,`Red`],[,Swede,,,Dog],[,`Danish`,,Tea],[,,Green,Coffee],[,,,,PallMall,Chicken],[,,Yellow,,`Dunhill`],[,,,Beer,Winfield],[,`German`,,,`Rothmans`],[,,,,,Fish],[,,Green],[,,White],[,,,,Marlboro],[,,,,Cat],[,,,,Marlboro],[,,,,Dunhill],[,,,,Horse],[,,,,Marlboro],[,,`,Water`]].

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


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

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

12   голосов , оценка 3.917 из 5

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

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

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