Tree Prolog-计算树中的叶子数

Tree Prolog-计算树中的叶子数,tree,count,prolog,Tree,Count,Prolog,例如,如果我有一棵树,它看起来像这样: tree3(b(l(1),b(l(2),l(3)))). count_leaves(l(_), 1). count_leaves(b(B1, B2), N) :- count_leaves(B1, N1), count_leaves(B2, N2), N is N1 + N2. 我如何编写一个计算树叶数量的程序? 我希望它在使用时看起来像这样: ?- tree3(T), count_leaves(T, N). N = 3, T = b(l(1),b(

例如,如果我有一棵树,它看起来像这样:

tree3(b(l(1),b(l(2),l(3)))).
count_leaves(l(_), 1).
count_leaves(b(B1, B2), N) :- count_leaves(B1, N1), count_leaves(B2, N2), N is N1 + N2.
我如何编写一个计算树叶数量的程序? 我希望它在使用时看起来像这样:

?- tree3(T), count_leaves(T, N).

N = 3,
T = b(l(1),b(l(2),l(3)))

我想得到任何帮助

您可以这样做:

tree3(b(l(1),b(l(2),l(3)))).
count_leaves(l(_), 1).
count_leaves(b(B1, B2), N) :- count_leaves(B1, N1), count_leaves(B2, N2), N is N1 + N2.
基本上,只有一片叶子的树只有一片叶子。如果树以一个分支开始,则递归到两个分支并添加结果


您的解决方案为您提供了
,因为没有任何内容与
匹配。即使你解决了这个问题,你也不会计算叶子,而是计算内部节点。

你可以这样做:

tree3(b(l(1),b(l(2),l(3)))).
count_leaves(l(_), 1).
count_leaves(b(B1, B2), N) :- count_leaves(B1, N1), count_leaves(B2, N2), N is N1 + N2.
基本上,只有一片叶子的树只有一片叶子。如果树以一个分支开始,则递归到两个分支并添加结果


您的解决方案为您提供了
,因为没有任何内容与
匹配。即使你解决了这个问题,你也不会计算叶子,而是计算内部节点。

我试过:计数叶子(空,0)。计数叶子(树(L,R),总大小):-计数叶子(L,左大小),计数叶子(R,右大小),总大小为左大小+右大小+1。但它只是给了我一个否定的答案。我试过:count_leaves(空,0)。计数叶子(树(L,R),总大小):-计数叶子(L,左大小),计数叶子(R,右大小),总大小为左大小+右大小+1。但它只是给了我不。你能帮我做点别的吗?我现在想写一个程序,把叶子上的信息放到一个列表中。我尝试过这样做:leaves(l(),[])。叶(b(B1,B2),[L]):-叶(B1,[L1]),叶(B2,[L2])。附加(L1、L2、L)。但它给了我L=[[u A]。为什么会这样?你应该问另一个问题。我对prolog也是新手,你的解决方案中唯一奇怪的是第一行。我会把它写下来,
count\u leaves(l(u),N):-N是1。
。你能解释一下你的解决方案是如何工作的吗@svick?Prolog就是这样工作的。当您“调用”
count\u leaves(l(a),N)。
时,它会尝试将其与第一个子句匹配。第一个参数匹配(将匿名变量
\uu
a
统一,忽略该变量)。第二个参数也匹配,将
N
1
统一起来,这正是我们想要的。您的解决方案只是编写相同的代码的较长方式。(我也会用
=
而不是
is
,但那是另一个话题。)你能帮我做点别的吗?我现在想写一个程序,把叶子上的信息放到一个列表中。我尝试过这样做:leaves(l(),[])。叶(b(B1,B2),[L]):-叶(B1,[L1]),叶(B2,[L2])。附加(L1、L2、L)。但它给了我L=[[u A]。为什么会这样?你应该问另一个问题。我对prolog也是新手,你的解决方案中唯一奇怪的是第一行。我会把它写下来,
count\u leaves(l(u),N):-N是1。
。你能解释一下你的解决方案是如何工作的吗@svick?Prolog就是这样工作的。当您“调用”
count\u leaves(l(a),N)。
时,它会尝试将其与第一个子句匹配。第一个参数匹配(将匿名变量
\uu
a
统一,忽略该变量)。第二个参数也匹配,将
N
1
统一起来,这正是我们想要的。您的解决方案只是编写相同的代码的较长方式。(我也会使用
=
而不是
is
,但这是另一个主题。)