Прежде всего, спасибо, что заглянули на мой вопрос. Что касается вопроса, я работал над кодом Пролога для моделирования загадки Эйнштейна. Я думаю, что это довольно элегантное решение, это в основном список кортежей с определенными полями, такими как цвет дома, домашнее животное, национальность и т. Д. c. У меня смоделирован список, и там тоже есть подсказки, но у меня возникают проблемы при попытке смоделировать вопрос.
Дело в том, что я не хотел придерживаться простого вопроса "Кто владеет fi sh? ". Я хотел смоделировать более сложный вопрос. Например: "Какому домашнему животному принадлежит человек, который живет в доме, который вправо от красного дома владеет ?" , Кажется, что это простая проверка индекса i
в списке, который имеет кортеж с цветом red
, и возвращает поле pet
кортежа с индексом i+1
в списке, но мой опыт с Прологом довольно ограничен (это практически мой первый раз, когда я его использую), и я не совсем уверен, как это реализовать. Я предоставлю код, который у меня есть ниже. Я ценю все ответы. Спасибо.
persoane(0, []) :- ! .
persoane(N, [(_Men, _Color, _Drink, _Smoke, _Animal)|T]) :- N1 is N-1, persoane(N1,T) .
persoana(1, [H|_], H) :- ! .
persoana(N, [_|T], R) :- N1 is N-1, persoana(N1, T, R)
% Function that tests if A is to the right of B (will be used in the final question)
right(A, B, List) :- nextto(B, A, List).
% The Brit lives in the red house
hint1([(brit, red, _, _, _)|_]) .
hint1([_|T]) :- hint1(T) .
% The Swede keeps dogs as pets
hint2([(swede, _, _, _, dog)|_]) .
hint2([_|T]) :- hint2(T) .
% The Dane drinks tea
hint3([(dane, _, tea, _, _)|_]) .
hint3([_|T]) :- hint3(T) .
% The green house is on the left of the white house
hint4([(_, green, _, _, _,),(_, white, _, _, _)|_]) .
hint4([_|T]) :- hint4(T) .
% The green house owner drinks coffee
hint5([(_, green, cofee, _, _)|_]) .
hint5([_|T]) :- hint5(T) .
% The person who smokes Pall Mall rears birds
hint6([(_, _, _, pallmall, bird)|_]) .
hint6([_|T]) :- hint6(T) .
% The owner of the yellow house smokes Dunhill
hint7([(_, yellow, _, dunhill, _)|_]) .
hint7([_|T]) :- hint7(T) .
% The man living in the center house drinks milk
hint8(persoane) :- persoana(3, persoane, (_, _, milk, _, _)) .
% The Norwegian lives in the first house
hint9(persoane) :- persoana(1, persoane, (norwegian, _, _, _, _)) .
% The man who smokes Blends lives next to the one who keeps cats
hint10([(_, _, _, blend, _),(_, _, _, _, cat)|_]) .
hint10([(_, _, _, _, cat),(_, _, _, blend, _)|_]) .
hint10([_|T]) :- hint10(T) .
% The man who keeps horses lives next to the man who smokes Dunhill
hint11([(_, _, _, dunhill, _),(_, _, _, _, horse)|_]) .
hint11([(_, _, _, _, horse),(_, _, _, dunhill, _)|_]) .
hint11([_|T]) :- hint11(T) .
% The owner who smokes BlueMaster drinks beer
hint12([(_, _, beer, bluemaster, _)|_]) .
hint12([_|T]) :- hint12(T) .
% The German smokes Prince
hint13([(german, _, _, prince, _)|_]) .
hint13([_|T]) :- hint13(T) .
% The Norwegian lives next to the blue house
hint14([(norwegian, _, _, _, _),(_, blue, _, _, _)|_]) .
hint14([(_, blue, _, _, _),(norwegian, _, _, _, _)|_]) .
hint14([_|T]) :- hint14(T) .
% The man who smokes Blend has a neighbour who drinks water
hint15([(_, _, _, blend, _),(_, _, water, _, _)|_]) .
hint15([(_, _, water, _, _),(_, _, _, blend, _)|_]) .
hint15([_|T]) :- hint15(T) .
% The question: What pet does the man who lives to the right of the red house have ?
% question (right((_, _, _, _, _), (_, red, _, _, _), persoane)) .
question([(_, red, _, _, _),()])
question([_|T]) :- question(T) .
solution(persoane) :-
persoana(5, persoane),
hint1(persoane),
hint2(persoane),
hint3(persoane),
hint4(persoane),
hint5(persoane),
hint6(persoane),
hint7(persoane),
hint8(persoane),
hint9(persoane),
hint10(persoane),
hint11(persoane),
hint12(persoane),
hint13(persoane),
hint14(persoane),
hint15(persoane),
question(persoane) .