你好,我是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.