如何用prolog解决俄罗斯套娃问题?



你好,我是prolog新手,我想解决下面的问题:

/* 2. Russian nesting dolls:
* Write a knowledge base using the predicate directlyIn/2 which encodes which doll 
* is directly contained in which other doll. Then, define a recursive predicate in/2, 
* that tells us which doll is (directly or indirectly) contained in which other dolls.*/
%% Predicates
directlyIn(katarina, olga).
directlyIn(olga, natasha).
directlyIn(natasha, irina).
%% Rules
in(X, Y) :- directlyIn(X, Y).
in(X,Y) :-
directlyIn(X,Z),
in(Z,Y).

为什么下面的查询返回的是false而不是true?

?- in(katerina,natasha).

了解您在描述中告诉我们的内容,您说查询:

?- in(katerina, natasha).

返回false。但请注意,拼写使所有不同。如果您希望看到"katerina"的结果,您应该将这个原子包含在您的知识库中,如下所示:

directlyIn(katarina, olga).  % All letters make difference here
directlyIn(katerina, olga).  % ?- katerina == katarina. --> true.  They are different

否则,只需将名称更正为"katarina",它将返回正确的答案。如果您不想在达到目标后找到更多的结果,您可以在递归规则的基本情况中放入一个简单的cut操作符(!):

in(X, Y) :- directlyIn(X, Y), !.  % Notice the '!' symbol, it tells the 
% backtracking mechanism NOT to search 
% for more answers to your query.

最新更新