我正在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).
Run Code Online (Sandbox Code Playgroud)
这是输出
?- 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.
Run Code Online (Sandbox Code Playgroud)
它数次数相同
任何帮助表示赞赏
sum*_*umx 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).
Run Code Online (Sandbox Code Playgroud)
但请注意,第二个参数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).
Run Code Online (Sandbox Code Playgroud)
然后你得到
?- 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
Run Code Online (Sandbox Code Playgroud)