用Prolog计算家庭关系中的曾祖父母数

用Prolog计算家庭关系中的曾祖父母数,prolog,Prolog,我必须在Prolog中创建一个“greatcount”关系,计算两个人之间的曾祖父母程度。例如,如果某人是其他人的曾祖父母,则返回2 我只有父(X,Y)事实,其中X是Y的父 我添加了曾祖父母(X,Y)谓词以确定X是否是Y的曾祖父母,实现如下: great-grandparent(X,Y) :- parent(X,D), parent(D,F), parent(F,Y). 我实现了greatcount谓词,如下所示: greatcount(X,Y,1) :- great-grandparent(

我必须在Prolog中创建一个“greatcount”关系,计算两个人之间的曾祖父母程度。例如,如果某人是其他人的曾祖父母,则返回2

我只有父(X,Y)事实,其中X是Y的父

我添加了曾祖父母(X,Y)谓词以确定X是否是Y的曾祖父母,实现如下:

great-grandparent(X,Y) :- parent(X,D), parent(D,F), parent(F,Y).
我实现了greatcount谓词,如下所示:

greatcount(X,Y,1) :- great-grandparent(X,Y), !.
greatcount(X,Y,N1) :- great-grandparent(X,Z), greatcount(Z,Y,N2), N1 is N2+1.

但是,当第一个greatcount关系不匹配时,结果总是false(或No)。怎么会这样?

你确定有错误吗?下面是一个成功的例子:

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
的二级曾祖父母,但这并不符合你给出的定义。请注意,根据曾祖父母/2,谓词将在递归情况下将
Z
统一为
ze
,然后检查
ze
的父对象的父对象;在这种情况下,
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
的递归步骤中调整父母/2目标

您确定有错误吗?下面是一个成功的例子:

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
的二级曾祖父母,但这并不符合你给出的定义。请注意,根据曾祖父母/2,谓词将在递归情况下将
Z
统一为
ze
,然后检查
ze
的父对象的父对象;在这种情况下,
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
的递归步骤中调整父母/2目标

谢谢你的启发!我确实被曾祖父母弄糊涂了。我想要的正确结果是
greatcount(X,Y,N1):-parent(X,D),greatcount(D,Y,N2),N1是N2+1。
@Digitox1n:当然,没问题!这都是关于什么是曾祖父母的问题:)谢谢你启发我!我确实被曾祖父母弄糊涂了。我想要的正确结果是
greatcount(X,Y,N1):-parent(X,D),greatcount(D,Y,N2),N1是N2+1。
@Digitox1n:当然,没问题!这完全是一个关于什么是曾祖父母的问题:)请注意,您正在定义形式规则
-(曾祖父母)
,因为
(-)/2
是一个中缀运算符。请注意,您正在定义形式规则
-(曾祖父母)
,因为
(-)/2
是一个中缀运算符。