计算列表中的特定元素 [Prolog]

Count specific element in list [Prolog]

我想对列表中的特定元素进行计数。

?count(3,[3,3,3],C).

count(_,[],_).
count(X,[Y|R],C):- X \= Y, count(X,R,C).
count(X,[Y|R],C):- X = Y, L is C + 1, count(X,R,L).

但是我收到这个错误,我不明白为什么: 参数未充分实例化 在: [1] 计数 (3,[3,3|...],_1594)

你有小费吗?

目标 L is C + 1 中发生实例化错误,因为变量 C 在调用目标时未绑定。

一个解决方案是重写谓词以使用累加器。对您的代码进行最少的更改:

count(Element, List, Count) :-
    count(Element, List, 0, Count).

count(_, [], Count, Count).
count(X, [Y|R], Count0, Count) :-
    X \= Y,
    count(X, R, Count0, Count).
count(X, [Y|R], Count0, Count) :-
    X = Y,
    Count1 is Count0 + 1,
    count(X, R, Count1, Count).

通过您的示例调用:

| ?- count(3, [3,3,3], Count).

Count = 3 ? ;

no

请注意,这个新定义留下了一个虚假的选择点。你能改进它,使调用(第一个参数为基础)变得确定吗?提示:首先将列表参数移动到辅助 count/4 谓词的第一个位置。