计算列表中数字的出现次数

时间:2012-01-31 22:35:59

标签: list prolog

我在prolog中编写一个程序来计算列表中数字的出现次数

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([_|T],X,Z):- count(T,X,Z).

这是输出

?- count([2,23,3,45,23,44,-20],X,Y).
X = 2,
Y = 1 ;
X = 23,
Y = 2 ;
X = 23,
Y = 1 ;
X = 3,
Y = 1 ;
X = 45,
Y = 1 ;
X = 23,
Y = 1 ;
X = 44,
Y = 1 ;
X = -20,
Y = 1 ;
false.

它会多次计算相同的数字

感谢任何帮助

3 个答案:

答案 0 :(得分:18)

而不是虚拟变量_只使用另一个变量X1并确保它不与X统一。

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z).

但请注意,第二个参数X应该被实例化。所以例如count([2,23,3,45,23,44,-20],23,C)将C与2统一。如果你想要每个元素的计数使用

:- use_module(library(lists)).

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z).

countall(List,X,C) :-
    sort(List,List1),
    member(X,List1),
    count(List,X,C).

然后你得到

 ?- countall([2,23,3,45,23,44,-20],X,Y).
   X = -20,
   Y = 1 ? ;
   X = 2,
   Y = 1 ? ;
   X = 3,
   Y = 1 ? ;
   X = 23,
   Y = 2 ? ;
   X = 44,
   Y = 1 ? ;
   X = 45,
   Y = 1 ? ;
   no

答案 1 :(得分:0)

您还可以使用include谓词:

count(L, E, N) :-
    include(=(E), L, L2), length(L2, N).

答案 2 :(得分:0)

ocr(X,[],0):- !.
ocr(X,[Element|Rs],V):- X = Element -> ocr(X,Rs,Ocr), V is 1+ Ocr; ocr(X,Rs,V).
我是这样做的。这只给你一个答案并完成。