用Prolog计算家庭关系中的曾祖父母数
我必须在Prolog中创建一个“greatcount”关系,计算两个人之间的曾祖父母程度。例如,如果某人是其他人的曾祖父母,则返回2 我只有父(X,Y)事实,其中X是Y的父 我添加了曾祖父母(X,Y)谓词以确定X是否是Y的曾祖父母,实现如下:用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(
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
是一个中缀运算符。