【问题标题】:How to do only 2 recursive calls in Prolog?如何在 Prolog 中只进行 2 次递归调用?
【发布时间】:2020-12-13 06:30:41
【问题描述】:
isTallerThan2(X,Y) :- tallerThan(X,Y).
isTallerThan2(X,Y) :- tallerThan(X,Z), isTallerThan2(Z,Y).

我想在哪里找到比 2 人高的人。

如果我有很多关系,其中 X 比 Y 高,像这样 tallerThan(X,Y)and 如果 b 比 a 高,而 c 比 b 高...那么我想找到所有人 c但停在那里,找不到人 d,e,f... 等。

【问题讨论】:

  • 我不明白这是什么意思
  • 好的,它是参数的数量。好吧,它应该是 arity 2,因为我在这里没有提到另一个条件,因为我问的是更一般的 q。

标签: recursion prolog predicate


【解决方案1】:

由于您拥有 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).

【讨论】:

    【解决方案2】:

    由于您对较小的 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).
    

    输出是

    ?- 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多