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

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

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

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

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

textual
Листинг программы
DOMAINS   s=string   sl=s*   sll=sl*   slll=sll*   sllll=slll*
CONSTANTS  st=[["1","Norwegian","","","",""],["2","","Blue","","",""],["3","","","Milk","",""],["4","","","","",""],["5","","","","",""]]
PREDICATES
inFact(slll)
go(sll)
solve(sllll,sll)
member(slll,sll)
insList(sll,sll,sll)
insert(sll,sll,sll)
inHouse(sl,sl,sl)
 
CLAUSES
go(Out):- findall(F,inFact(F),Facts), solve(Facts,Out).
 
solve([],st):-!.
solve([Fact|H],Out):- solve(H,O), member(Fact,F), insList(F,O,Out).
 
insList(X,P,Pn):- insert(X,P,Pn).
insList(X,[G|Y],[G|Z]):- !, insList(X,Y,Z).
 
insert([],X,X):-!.
insert([X|Y],[G|H],[Gn|Hn]):- inHouse(X,G,Gn), insert(Y,H,Hn).
 
inHouse([],X,X):-!.
inHouse([""|H],[X|Y],[X|Z]):- !, inHouse(H,Y,Z).
inHouse([X|H],[X|Y],[X|Z]):- !, inHouse(H,Y,Z).
inHouse([X|H],[""|Y],[X|Z]):- !, inHouse(H,Y,Z).
 
member([X|_],X).
member([_|X],Y):- member(X,Y).
/*************************************************************/
inFact([[["","Englishman","Red"]]]).
inFact([[["","Swede","","","","Dog"]]]).
inFact([[["","Danish","","Tea"]]]).
inFact([[["","","Green","Coffee"]]]).
inFact([[["","","","","PallMall","Chicken"]]]).
inFact([[["","","Yellow","","Dunhill"]]]).
inFact([[["","","","Beer","Winfield"]]]).
inFact([[["","German","","","Rothmans"]]]).
inFact([[["","","","","","Fish"]]]).
inFact([[["","","Green"],["","","White"]]]).
inFact([[["","","","","Marlboro"],["","","","","","Cat"]],
       [["","","","","","Cat"],["","","","","Marlboro"]]]).
inFact([[["","","","","Dunhill"],["","","","","","Horse"]],
       [["","","","","","Horse"],["","","","","Dunhill"]]]).
inFact([[["","","","","Marlboro"],["","","","Water"]],
       [["","","","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