【问题标题】:Prolog Binary TreeProlog 二叉树
【发布时间】:2014-07-04 13:23:22
【问题描述】:

我有一个任务,我必须在 Prolog 中设计一棵二叉树,然后为它实现一些谓词(例如插入、遍历、搜索和高度。)

我有足够的信心来实施它们,但作为一个起点,我得到了这个:

可以根据 2 个谓词来定义二叉树:

emptyBT,空二叉树

btTree(N,T1,T2) 如果 N 是具有左子树 T1 和右子树 T2 的二叉树的根,则为真,其中 T1 中的所有项都小于或等于 N 并且所有项在T2大于N。

有人能指出我使用上述两个谓词实现 BT 的方向吗?我在网上搜索过一些 Prolog 书籍,它们对 BT 的定义都不同,这让我有些困惑。

【问题讨论】:

  • BTTree(N,... 不是 Prolog 语法开头。
  • bTTree(N,..)?这是正确的 Prolog 语法吗?
  • 请先查阅 Prolog 书籍:Art of Prolog、Bratko 等。
  • 感谢您的帮助...

标签: prolog binary-tree predicate


【解决方案1】:
isEmptyBinTree( btEmpty ).

就是这样一个。对吧?

isNonEmptyBinTree( btTree(N,Left,Right) ):-
  ( isEmptyBinTree(Left)
    ;                            % or
    isNonEmptyBinTree(Left),
    getMaxElement(Left,Max), 
    N >= Max
  ) ,                            % and
  ( isEmptyBinTree(Right)
    ;                            % or
    isNonEmptyBinTree(Right),
    ....                         % can you complete this definition?
  ).

那是另一个。现在剩下的就是定义缺少的getMaxElement/2getMinElement/2 谓词。他们都可以假设他们的论点是不是一棵空二叉树:

getMinElement( btTree(N,Left,_), M ) :- 
    isEmptyBinTree(Left),
    M = N.                                 % right?
getMinElement( btTree(_,Left,_), M ) :-
    getMinElement( ... , M ).

【讨论】:

    【解决方案2】:

    btEmpty 不是谓词;它是一个原子。 btTree/3 也不是谓词;它是一个复合词。如果你的赋值调用了这两个谓词,那么就会有一些非常可疑的东西。

    不同来源中的定义可能不同,但它们都可能是表示空树的原子和表示非空节点的元数为 3 的术语的某种变体。

    无论如何,这例如是一棵代表数字 {1, 2, 3} 的树:

    btTree(2, btTree(1, btEmpty, btEmpty), btTree(3, btEmpty, btEmpty))
    

    这是一个嵌套的复合术语。树结构应该是可识别的:从您的示例中,该树节点处的实际元素 N 始终是术语的第一个参数,左右子树是 T1T2

    为了让您入门,这是一个非常简单的谓词,用于遍历按顺序定义的树:

    in_order(btTree(_, Left, _), N) :-
        in_order(Left, N).
    in_order(btTree(N, _, _), N).
    in_order(btTree(_, _, Right), N) :-
        in_order(Right, N).
    

    这会在回溯时传递元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多