我在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.
它会多次计算相同的数字
感谢任何帮助
答案 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).
我是这样做的。这只给你一个答案并完成。