使用累加器的树的大小

我正在尝试学习序言,并陷入玩具示例之一。binary_tree定义为:

术语“-”(减号)表示空树。术语t(L,V,R)表示具有左子树L,节点值V和右子树R的树。

现在,我正在尝试写谓词size(Tree,N)以查找树的大小。我知道可以使用以下方法:

size( -,0).
size( t(L, _,R), S) :- size(L,Ls), size(R,Rs), S is Ls + Rs + 1.

但我想使用累加器使其工作。我累了一些(和其他一些东西),但没有一个工作:

size(t(L,_,R),N):-size(t(L,_,R),0,N).

size(-,A,A).
size(t(L,_,R),A,N):- A1 is A+1,size(L,A1,N1),size(R,A1,N2), N is N1+N2.

例如测试用例:

size(t(-,n,t(-,m,-)),N).

我得到5代替2这是跟踪:

[debug] [7] 85 ?- trace,size(t(-,n,t(-,m,-)),N).
   Call: (73) size(t(-, n, t(-, m, -)), _G10307) ? creep
   Call: (74) size(t(-, _G10422, t(-, m, -)), 0, _G10307) ? creep
   Call: (75) _G10435 is 0+1 ? creep
   Exit: (75) 1 is 0+1 ? creep
   Call: (75) size(-, 1, _G10437) ? creep
   Exit: (75) size(-, 1, 1) ? creep
   Call: (75) size(t(-, m, -), 1, _G10437) ? creep
   Call: (76) _G10438 is 1+1 ? creep
   Exit: (76) 2 is 1+1 ? creep
   Call: (76) size(-, 2, _G10440) ? creep
   Exit: (76) size(-, 2, 2) ? creep
   Call: (76) size(-, 2, _G10440) ? creep
   Exit: (76) size(-, 2, 2) ? creep
   Call: (76) _G10441 is 2+2 ? creep
   Exit: (76) 4 is 2+2 ? creep
   Exit: (75) size(t(-, m, -), 1, 4) ? creep
   Call: (75) _G10307 is 1+4 ? creep
   Exit: (75) 5 is 1+4 ? creep
   Exit: (74) size(t(-, _G10422, t(-, m, -)), 0, 5) ? creep
   Exit: (73) size(t(-, n, t(-, m, -)), 5) ? creep
N = 5.

我觉得我需要有两个不同的累加器,但不确定如何做,因为我正在尝试学习这些东西,所以我会感谢任何解释(而不是直接回答)。

您两次计数子树:

size(t(L,_,R),A,N):- A1 is A+1,size(L,A1,N1),size(R,A1,N2), N is N1+N2.
                                      ^^            ^^      ^^^^^^^^

该值A1使用两次。您真正想要的是描述差异(不是差异列表,而是非常相似的东西)。

size(-, N,N).            % N-N   ... 0
size(t(L,_,R), N0,N) :-  % N-N0  ... the total size
   N1 is N0+1,           % N1-N0 ... 1
   size(L, N1,N2),       % N2-N1 ... size of L
   size(R, N2,N).        % N-N2  ... size of R

请为变量标记模式。第一个是N0,最后一个是N它们几乎像鞋带一样铺开

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用累加器的树的大小

来自分类Dev

在分机上使用累加器

来自分类Dev

pyspark矩阵累加器

来自分类Dev

列表累加器在Erlang

来自分类Dev

列表累加器在Erlang

来自分类Dev

Erlang导致累加器

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用数组作为Scala foldLeft累加器

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用累加器连接数字列表

来自分类Dev

如何使用OpenCL内核来做累加器?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何使用HashMap折叠作为累加器?

来自分类Dev

在类的无序映射中使用滚动累加器

来自分类Dev

Groovy/Scala - 使用累加器迭代时提前中止

来自分类Dev

在 xslt 3.0 中使用累加器无法正常工作

来自分类Dev

使用对象作为累加器的数组减少

来自分类Dev

球拍累加器列表功能

来自分类Dev

在序言中与累加器反向-错误

来自分类Dev

可重置的累加器行为?

来自分类Dev

用累加器遍历jQuery对象?

来自分类Dev

展开返回累加器的最后状态

来自分类Dev

如何实现timespec累加器?