【问题标题】:Find the number of elements greater than a number in a list in PROLOG在PROLOG中的列表中查找大于数字的元素数
【发布时间】:2018-10-21 22:28:50
【问题描述】:

您好,感谢您抽出宝贵时间阅读此问题。我有以下问题:

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

大于 (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
  • 为什么在第一个子句中写fail?此外,如果H <= N 在这里会发生什么?
  • 如果列表为空,我会写失败。
  • 那么我不使用同一个变量我可以使用辅助变量。
  • 由于在 Prolog 中没有成功的查询是失败的,你不需要greater(0,[],0):-!, fail.greater(0, [], 0) 如果没有通过您的其他谓词从句成功,它将失败。您的基本情况 greater(N,[N],1). 不正确。这表示N 大于N,这当然不是真的。基本情况应该是什么?您有一个元素列表和一个数字的情况是什么?什么时候应该用 1 成功?

标签: prolog


【解决方案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 is 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 我很高兴它有所帮助。如果您认为这个答案可以接受,那么如果您可以点击接受按钮,我将非常感激。
  • 当然。最后我解决了。 greater(_,[],0).% default is 0 greater(N,[H|Q],X):- H&gt;N, greater(N,Q,X1), X is X1+1. greater(N,[H|Q],X):- H=&lt; N, greater(N,Q,X).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多