我试图了解累加器,因此我希望此实现包含它们。我已经找到了如何搜索一个简单的列表。这计算给定元素的出现次数:
find(Element,[],A,A).
find(Element, [H|Tail], A, N) :- Element = H, A1 is A + 1,
find(Element, Tail, A1, N).
find(Element, [H|Tail], A, N) :- find(Element, Tail, A, N).
现在如何使它适用于嵌套列表?
您应该简单地向匹配器添加另一个项目,这样如果H
也是列表,则首先计算出现次数:
find(Element,[],A,A).
find(Element, [Element|Tail], A, N) :-
!,
A1 is A + 1,
find(Element, Tail, A1, N).
find(Element,[[H|T]|Tail],A,N) :-
!,
find(Element,[H|T],A,R),
find(Element,Tail,R,N).
find(Element, [H|Tail], A, N) :-
find(Element, Tail, A, N).
通过将Element
(第二子句)的等式放在列表递归之前,您还可以在列表中搜索列表。换一种说法:
find([1,2],[[1,2],[3],4,[1,2]])
会回来的2
。
您可以使用cut(!
)来防止Prolog回溯。
提示:
Element = H
如果可能,请勿在正文()中统一。只需在head(find(Element,[Element|Tail],A,N)
)中重用相同的变量即可。许多Prolog编译器能够比第一种情况更好地优化后者。
提示:使用削减。您可以更频繁地使用削减来防止Prolog不确定。例如,如果你算的出现次数
5
在[5,1,2,5]
可以拿出2
,1
而且0
因为你从来没有你那最后的子句中指定H
的不等于对Element
。通过在前面的子句中删减,Prolog解释器将永远不会回退。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句