【发布时间】:2016-05-27 11:08:08
【问题描述】:
我正在尝试创建一个规则来计算给定列表中某个元素的出现次数,到目前为止我所尝试的似乎并没有按我预期的方式工作:
这里的第一个参数应该是列表,第二个是我们要查找的元素,最后一个是出现次数:
%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是给定列表的head,T是tail。
基本情况,例如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
这是正确的。
【问题讨论】:
-
谢谢。我确实找到了那个答案,但我仍然不明白为什么我的 not 工作。
-
别忘了:
count(L,E,C) :- aggregate(count,member(E,L),C).
标签: list count prolog clpfd prolog-dif