在列表中查找N的数量

时间:2015-05-08 17:10:38

标签: list prolog

所以我正在尝试创建一个确定列表中N数的方法。我现在已经试验了一个小时左右,似乎无法获得稳固的东西。截至目前,我已经返回0.我认为它可能与我的basecase有关,但我似乎无法弄明白。像prolog这样的逻辑编程对我来说是一个新的视野,所以任何帮助都会很棒。

% base case returns 0 occurrences for empty list
numN(_,[],0).
numN(N,[Y | T], A) :- N == Y, numN(N,T,A2), A is A2+1.
numN(N, [Y | T], A) :- Y \= N, numN(N,T,A).



?- numN(X, [a,X,l,g,X], N).
N = 3.

当它应该是2.当我将basecase更改为-1时,它返回正确的值。

2 个答案:

答案 0 :(得分:1)

以下是使用累加器的一种解决方案:

%returns number of elements E in list L
numN(E,L,N) :- numN2(E,L,0,N).

numN2(E,[],Ak,Ak).
numN2(E,[E|Xs],Ak,N) :- !, Ak1 is Ak+1, numN2(E,Xs,Ak1,N).
numN2(E,[X|Xs],Ak,N) :- numN2(E,Xs,Ak,N).

编辑解决方案,谢谢@migfilg:)

答案 1 :(得分:0)

您的最后两个子句使用N作为自由变量,因此第2个子句总是成功,因为N与列表头中的任何术语统一,并且您的程序现在的解决方案将是无论其内容如何,​​都是列表的长度。在最后一个条款中你可能有错误,因为@repeat在上面评论过:你想要调用它是numX/2吗?

您需要在谓词中添加一个新参数来表示您需要计算的术语。