在PROLOG中查找列表中大于某个数字的元素数量

3

你好,感谢你抽出时间来阅读这个问题。我有以下问题:

给定一个返回大于X的数字数量的列表,例如:

greater (4, [1,2,3,4,5,6], N) 结果为N = 2。

下面是我的代码:

greater(0,[],0):-!, fail.
greater(N,[N],1).
greater(N,[H|Q],X):-H>N,greater(Q,N,X),X is X+1.

问题在于PROLOG只返回False而不是X的值。希望您能向我解释我做错了什么,非常感谢您。

X is X+1是毫无意义的。一个变量只能与一个值相统一,因此一个变量不能同时为12 - Willem Van Onsem
为什么你在第一个从句中写了 fail?此外,如果 H <= N,应该发生什么? - Willem Van Onsem
如果列表为空,我会写入“fail”。 - Krasnax
那么如果我不使用相同的变量,我可以使用一个辅助变量。 - Krasnax
1
由于在Prolog中缺少成功的查询就意味着失败,因此您不需要 greater(0,[],0):-!, fail.。如果通过其他谓词子句未能成功,则greater(0,[],0)将失败。您的基本情况greater(N,[N],1).是不正确的。这意味着N大于N,这显然是不正确的。基础案例应该是什么?当您有一个单元素列表和一个数字的情况是什么?什么时候应该成功为1? - lurker
显示剩余2条评论
1个回答

1

在Prolog中,如果谓词调用失败且没有成功路径,则以下谓词子句就没有作用。您可以将其删除。

greater(0,[],0):-!, fail.

您的下一个子句是递归基础情况,但其表述不正确:

greater(N,[N],1).

即使它违反了你想要计算列表中大于N的元素数量的条件,这也会成功。 N不大于N。如果您想让greater(N,[X],1)成功,那么这个条款应该是什么样子的?
在您的递归条款中,存在问题:
greater(N,[H|Q],X):-H>N,greater(Q,N,X),X is X+1.

X是X+1始终会失败,因为X的值不可能与X+1的值相同。也就是说,没有一个数字等于它自己加一。你需要使用一个辅助变量:

greater(N,[H|Q],X):-H>N,greater(Q,N,X1),X is X1+1.

最后,你还缺少了当 H =< N 的情况:
greater(N,[H|Q],X):-H=<N, ....

这个从句应该长什么样子?

@Krasnax,我很高兴能够帮到你。如果你认为这个答案可以接受,那么如果你能够点击接受按钮,我将不胜感激。 - lurker
当然。最终我解决了它。greater(_,[],0).% 默认为0 greater(N,[H|Q],X):- H>N, greater(N,Q,X1), X is X1+1. greater(N,[H|Q],X):- H=< N, greater(N,Q,X). - Krasnax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接