在prolog中实现countall



需要prolog代码来实现countall(List1,List2,N(,它计算List2 中List1中任何元素的数量

检查代码的测试用例

?- countall([a], [b, a, c, a], Number).
Number=2.
?- countall([a, b], [b, b, a, c, a], Number).
Number=4.
?- countall([a], [b, c, d], Number).
Number=0.
?- countall([e, e], [e], Number).
Number=2.
countall(List1, List2, Count):-
findall(Elem, (member(Elem, List1), member(Elem, List2)), Matches),
length(Matches, Count).

"找出清单1和清单2中Elem的所有方式,将它们汇总并计数";。

?- countall([a], [b, a, c, a], Number).
^       ^
^             ^

?- countall([a, b], [b, b, a, c, a], Number).
^             ^
^                   ^
^    ^
^       ^

不使用findalllength的替代解决方案是使用member和累加器来计数出现次数:

countall(List1,List2,Number):- 
countall(List1,List2,0,Number).
countall(_,[],Number,Number).
countall(List1,[H|List2],Acc,Number):-
member(H,List1),
AccNew is Acc + 1,
countall(List1,List2,AccNew,Number).
countall(List1,[H|List2],Acc,Number):-
not(member(H,List1)),
countall(List1,List2,Acc,Number).

如果您想要并且知道自己在做什么,您可以将countall/4的第三个子句auf中的not(member(H,List1))替换为第二个子句中的cut。

最新更新