Prolog使用累加器在列表中查找元素

用户名

我试图了解累加器,因此我希望此实现包含它们。我已经找到了如何搜索一个简单的列表。这计算给定元素的出现次数:

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]可以拿出21而且0因为你从来没有你那最后的子句中指定H不等于Element通过在前面的子句中删减,Prolog解释器将永远不会回退。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 JS 中查找累加器的属性

来自分类Dev

列表累加器在Erlang

来自分类Dev

列表累加器在Erlang

来自分类Dev

SWI Prolog标量与累加器相乘

来自分类Dev

F#–使用累加器映射列表

来自分类Dev

使用累加器连接数字列表

来自分类Dev

使用Clojure中的累加器进行映射?

来自分类Dev

使用Clojure中的累加器进行映射?

来自分类Dev

球拍累加器列表功能

来自分类Dev

B-Prolog中带有累加器的嵌套循环

来自分类Dev

在分机上使用累加器

来自分类Dev

使用累加器的树的大小

来自分类Dev

使用累加器的树的大小

来自分类Dev

功能编程中是否有“折断”或“用累加器查找”的概念?

来自分类Dev

Scala Spark-使用累加器计算数据框列中的空值

来自分类Dev

Prolog-在列表中查找相邻元素

来自分类Dev

Prolog-在列表中查找偶数元素

来自分类Dev

累加器在使`reduce`方法中返回未定义

来自分类Dev

该程序在累加器中缺少什么步骤?

来自分类Dev

如何正确处理Python时钟中的累加器?

来自分类Dev

Scala 中带累加器的辅助方法

来自分类Dev

XSLT 3 中的条件流累加器

来自分类Dev

pyspark矩阵累加器

来自分类Dev

Erlang导致累加器

来自分类Dev

Data.Vector,使用累加器进行映射

来自分类Dev

使用累加器遍历Node.js异步目录

来自分类Dev

使用数组作为Scala foldLeft累加器

来自分类Dev

使用数组reduce typescript将类型赋予累加器

来自分类Dev

Haskell使用累加器与Parsec进行解析