2015-05-08 36 views
3

所以我试图创建一个方法来确定列表中的N个数。我一直在尝试一个小时左右,似乎无法得到坚实的东西。截至目前,我所得到的返回值为0.我认为这可能与我的基本情况有关,但我似乎无法弄清楚。像prolog这样的逻辑编程对我来说是一个新的视野,所以任何帮助都会很棒。查找列表中的N的数量

% 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

注释不是延长讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/77340/discussion-on-question-by-jake-senior-find-the-number-of-ns-in-a-列表)。 – Taryn

+0

在你的最后一个条款中,你希望'\ =='不是'\ ='。 – migfilg

+0

@migfilg ahhhh谢谢 –

回答

0

你的最后两个分句使用N作为自由变量,所以第二条总是成功的,因为N统一与表头的任何条款,你的程序,因为它现在站立的解决方案将是列表的长度无关的内容。在最后一个条款中,您可能会在上面评论为@repeat的错字:是否您想拨打numX/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

在顶级谓词中使用剪切来避免辅助谓词的错误解决方法是一种不好的做法:您应该纠正numN2/3,并消除numN/3中的剪切。 – migfilg

+0

谢谢@migfilg,更新的解决方案。 – Roberto

+1

只是一个小细节:由于句子头部的统一而需要剪切,所以剪切应出现在':-'后面以便清楚。 – migfilg