我正在尝试创建一个规则来计算给定列表中某个元素的出现次数,到目前为止我尝试过的似乎并没有按照我期望的方式工作:
这里的第一个参数应该是列表,第二个参数是我们要查找的元素,最后一个参数是出现次数:
%empty list should always return 0 occurences
count([],E,0) :- true.
%if our head is what we are looking for, count
count([E|T],E,N) :- count(T,E,N-1).
%otherwise, do not count
count([H|T],E,N) :- H \== E, count(T,E,N).
这H
是给定列表的头部和尾部。T
例如,基本情况按预期count([],1,N).
返回N = 0
,但只要列表非空,我们总是会得到false.
:
?- count([1],1,N).
false.
?- count([1,2,1,3],1,N).
false.
谁能指出我做错了什么?
更新:
将第二行替换为
count([E|T],E,N+1) :- count(T,E,N).
但我就是不明白为什么这不等于我的第一个想法。
然后我们得到
?- count([1,2,1,3],1,N).
N = 0+1+1
哪个是对的。