计算列表中的特定元素 [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
谓词的第一个位置。
我想对列表中的特定元素进行计数。
?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
谓词的第一个位置。