你好,感谢你抽出时间来阅读这个问题。我有以下问题:
给定一个返回大于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的数字数量的列表,例如:
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中,如果谓词调用失败且没有成功路径,则以下谓词子句就没有作用。您可以将其删除。
greater(0,[],0):-!, fail.
您的下一个子句是递归基础情况,但其表述不正确:
greater(N,[N],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, ....
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
X is X+1
是毫无意义的。一个变量只能与一个值相统一,因此一个变量不能同时为1
和2
。 - Willem Van Onsemfail
?此外,如果H <= N
,应该发生什么? - Willem Van Onsemgreater(0,[],0):-!, fail.
。如果通过其他谓词子句未能成功,则greater(0,[],0)
将失败。您的基本情况greater(N,[N],1).
是不正确的。这意味着N
大于N
,这显然是不正确的。基础案例应该是什么?当您有一个单元素列表和一个数字的情况是什么?什么时候应该成功为1? - lurker