我是prolog的初学者,我想编写一个谓词,如果参数是树,则该谓词变为真。我有这个代码,但它总是假的。任何人都可以帮助我。
arb_true(nil).
arb_true([X,G,D]):- X=[_,G,D], arb_true(G), arb_true(D).
查询为arb_true([6,[4,[1,[],[]],[]],[9,[],[]]]).
答案 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.