我必须在Prolog中创建一个“伟大的”关系,计算两个人之间的曾祖父母的程度。例如,如果某人是其他人的曾祖父母,那么它将返回2.
我只有父(X,Y)事实,其中X是Y的父母。
我添加了祖父母(X,Y)谓词,以确定X是否是Y的曾祖父母,实现如下:
great-grandparent(X,Y) :- parent(X,D), parent(D,F), parent(F,Y).
我实现了我的bigcount谓词:
greatcount(X,Y,1) :- great-grandparent(X,Y), !.
greatcount(X,Y,N1) :- great-grandparent(X,Z), greatcount(Z,Y,N2), N1 is N2+1.
然而,当第一个bigcount关系不匹配时,结果始终为false(或No)。怎么样?
答案 0 :(得分:0)
您确定有错误吗?这是一个成功的例子:
parent(pedro, hugo).
parent(hugo, herminia).
parent(herminia, ze).
parent(ze, quim).
parent(quim, tostas).
parent(tostas, faneca).
parent(faneca, xico).
?- greatcount(pedro, faneca, X)
2
true.
也许你错误地认为(使用我给出的例子),tostas
应该是pedro
的第二度曾祖父母,但这不符合你的定义给。请注意,根据 great-grandparent / 2 ,谓词会将递归情况中的Z
统一到ze
,然后检查父级的父级ze
{1}};在这种情况下,faneca
。否则,您需要使用以下代码:
greatcount(X,Y,1) :- great-grandparent(X,Y), !.
greatcount(X,Y,N1) :-
parent(X,D),
parent(D,F),
greatcount(F,Y,N2),
N1 is N2+1.
?- greatcount(pedro, xico, X),
3
true.
但这取决于究竟是什么构成了一个伟大的曾祖父母,因此在greatcount
的递归步骤中调整 parent / 2 目标可能会需要。