Prolog验证二叉树

时间:2016-11-14 08:56:45

标签: tree prolog binary-tree

我是prolog的初学者,我想编写一个谓词,如果参数是树,则该谓词变为真。我有这个代码,但它总是假的。任何人都可以帮助我。

arb_true(nil).
arb_true([X,G,D]):- X=[_,G,D], arb_true(G), arb_true(D).

查询为arb_true([6,[4,[1,[],[]],[]],[9,[],[]]]).

2 个答案:

答案 0 :(得分:4)

通常,您不会将树表示为三个元素的列表,而是一个带有三个参数的术语。无论你决定代表一棵树,你都需要保持一致。在您当前(我假设不工作?)的解决方案中,您可以很好地混合使用两种不同的方式来表示树。

这是表示二叉树的一种方法:空树将是原子nil,而非空树将是术语tree(Value, Left, Right)。所以:

binary_tree(nil).
binary_tree(t(_, L, R)) :-
    binary_tree(L),
    binary_tree(R).

或者,如果您选择使用包含三个元素[Value, Left, Right]的列表,并将空列表[]用作空树,您将拥有:

binary_tree([]).
binary_tree([_, L, R]) :-
    binary_tree(L),
    binary_tree(R).

我会说第一个代表是比较常见的代表。在这两种情况下,如果您只想检查它是否是二叉树,您可以(并且应该)忽略“值”(tree(Value, Left, Right)中的第一个参数或[Value, Left, Right]的第一个元素。< / p>

然而:您的示例显示二进制三,也是二叉树排序,或binary search tree。要验证您是否拥有该值,您需要比较左右子树中的实际值。这不是您问题的一部分,因此您需要使用必要的详细信息对其进行编辑。

答案 1 :(得分:0)

您已经定义了arb_true(nil).子句,但是您使用空列表而不是'nil'来表示空树,因此您需要编写:

arb_true([]).

你还需要写:

arb_true([_,G,D]):-arb_true(G), arb_true(D).

而不是:

arb_true([X,G,D]):- X=[_,G,D], arb_true(G), arb_true(D).

现在查询arb_true([6,[4,[1,[],[]],[]],[9,[],[]]]).

 ?- arb_true([6,[4,[1,[],[]],[]],[9,[],[]]]).
true.