所以我正在尝试创建一个确定列表中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时,它返回正确的值。
答案 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
吗?
您需要在谓词中添加一个新参数来表示您需要计算的术语。