【问题标题】:Prolog verification of a binary trees二叉树的Prolog验证
【发布时间】:2016-11-14 08:56:45
【问题描述】:

我是 prolog 的初学者,我想编写一个谓词,如果参数是一棵树,则该谓词为真。我有这段代码,但它总是给我错误的。谁能帮帮我。

arb_true(nil).
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,[],[]]]).
  • 目前还不清楚是需要二叉搜索树还是只是验证结构。

标签: tree prolog binary-tree


【解决方案1】:

通常,您不会将树表示为包含三个元素的列表,而是一个包含三个参数的术语。任何你决定代表一棵树的方式,你都需要保持一致。在您当前(我认为不起作用?)的解决方案中,您很好地混合了两种不同的方式来表示一棵树。

这是表示二叉树的一种方法:空树是原子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] 的第一个元素。

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

【讨论】:

    【解决方案2】:

    您已经定义了子句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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2018-09-29
      • 2020-12-31
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多