[英]How to do only 2 recursive calls in Prolog?
isTallerThan2(X,Y) :- tallerThan(X,Y).
isTallerThan2(X,Y) :- tallerThan(X,Z), isTallerThan2(Z,Y).
我想在哪里找到比 2 人高的人。
如果我有很多关系,其中人 X 比人高,比如这个tallerThan(X,Y)
并且如果人 b 比人高并且人 c 比人高......那么我想找到所有人 c但是停在那里,找不到人d,e,f ...等。
由于您拥有 tallerThan/2 事实的数据库,并且您信任它(也就是说, tallerThan/2 是一个DAG ),因此您可以将规则编写为
isTallerThan2(X,_Y) :- tallerThan(X,A),tallerThan(X,B),A\==B.
根据您的评论,没有使用第二个参数,所以最好写成
isTallerThan2(X) :- tallerThan(X,A),tallerThan(X,B),A\==B.
isTallerThan2(X,_Y) :- isTallerThan2(X).
由于您对较小的 Person 不感兴趣,因此您只需要存储较大的 Person。 有两种构建方法:一种是硬编码两个关系,另一种是使用计数器变量递归编码。
版本一: Z
比Y
高, Y
比某人高。
tallerThan2(Z):-
tallerThan(Y,_),
tallerThan(Z,Y).
对于事实基础
tallerThan(marge, homer).
tallerThan(homer, bart).
tallerThan(bart, lisa).
tallerThan(lisa, maggie).
tallerThan(abe, maggie).
tallerThan(marge, abe).
output 是
?- tallerThan2(P).
P = marge ;
P = homer ;
P = bart ;
P = marge ;
false.
第二种方法是计算关系的数量。 你知道Y
人至少比NN
人高。 如果人Z
比Y
高,则Z
至少比N = NN+1
人高。
taller(Y,1) :-
tallerThan(Y,_).
taller(Z,N) :-
tallerThan(Z,Y),
taller(Y,NN),
N is NN+1.
现在测试:
?- taller(P,2).
P = marge ;
P = homer ;
P = bart ;
P = marge ;
false.
是一样的。 marge
出现在列表中两次,因为她比homer
高,比abe
高; 两人都比maggie
高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.