在序言中计算二叉树中的零节点

Counting zero nodes in binary tree in prolog

我编写了用于计算零值节点的谓词,但计数器 Num1 工作不正确。

countZeros(empty, Num).
countZeros(tree(0, Left, Right), Num) :- 
    Num1 = Num + 1,
    countZeros(Left, Num1),
    countZeros(Right, Num1).
countZeros(tree(_, Left, Right), Num) :-
    countZeros(Left, Num),
    countZeros(Right, Num).

这是我的查询:

countZeros(tree(5,
        tree(0,
            tree(6, empty, empty),
            tree(4, empty, empty)
        ),
        tree(0,
            tree(2, empty, empty),
            tree(0, empty, empty)
        )
        )
    , 0).

谁可以帮忙?

你的计数递归计算是倒退的。您从一个未实例化的计数开始,然后加 1 直到到达一个空节点并且不更改计数。所以计数永远不会初始化也不会返回。

如果您从逻辑上考虑谓词从句并描述它们的含义,这有助于正确定义它们。例如,如果当前节点为空,则零的个数为0。这将表示为:

countZeros(empty, 0).

也可以说,如果当前节点是一个0,那么零的个数就是左边分支零的个数加上右边分支零的个数分支,加上1。这可以表示为:

countZeros(tree(0, Left, Right), Num) :-
    countZeros(Left, Num1),
    countZeros(Right, Num2),
    Num is Num1 + Num2 + 1.

类似地,如果当前节点不是0,那么零的个数就是左分支零的个数加上右分支零的个数.

countZeros(tree(X, Left, Right), Num) :-
    dif(X, 0),
    countZeros(Left, Num1),
    countZeros(Right, Num2),
    Num is Num1 + Num2.

您需要将这些操作转换为 Visual Prolog。 (我不知道 "terms are different" 的运算符,而我在上面使用 dif(X, 0)。我使用 is/2 而不是 =/2。)