繁体   English   中英

如何在 Prolog 中只进行 2 次递归调用?

[英]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。 有两种构建方法:一种是硬编码两个关系,另一种是使用计数器变量递归编码。

版本一: ZY高, 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人高。 如果人ZY高,则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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM