Prolog二叉树

Prolog二叉树,prolog,binary-tree,predicate,Prolog,Binary Tree,Predicate,我有一个任务,我必须在Prolog中设计一个二叉树,然后为itE.g实现一些谓词。插入、遍历、搜索和高度 我有足够的信心实施这些计划,但作为一个起点,我得到了以下建议: 二叉树可以用两个谓词定义: emptyBT,空的二叉树 btTreeN,T1,T2如果N是具有左子树T1和右子树T2的二叉树的根,则为真,其中T1中的所有项小于或等于N,T2中的所有项大于N 有人能告诉我使用上述两个谓词实现BT的方向吗?我在网上搜索过一些序言书,它们对BTs的定义都不一样,这让我有些困惑 isEmptyBinT

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

我有足够的信心实施这些计划,但作为一个起点,我得到了以下建议:

二叉树可以用两个谓词定义:

emptyBT,空的二叉树

btTreeN,T1,T2如果N是具有左子树T1和右子树T2的二叉树的根,则为真,其中T1中的所有项小于或等于N,T2中的所有项大于N

有人能告诉我使用上述两个谓词实现BT的方向吗?我在网上搜索过一些序言书,它们对BTs的定义都不一样,这让我有些困惑

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/2和getMinElement/2谓词。他们都可以假设他们的参数不是空的二叉树:

getMinElement( btTree(N,Left,_), M ) :- 
    isEmptyBinTree(Left),
    M = N.                                 % right?
getMinElement( btTree(_,Left,_), M ) :-
    getMinElement( ... , M ).
btEmpty不是谓词;它是一个原子。btTree/3也不是谓词;这是一个复合词。如果您的赋值调用这两个谓词,那么就有非常可疑的地方

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

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

btTree(2, btTree(1, btEmpty, btEmpty), btTree(3, btEmpty, btEmpty))
这是一个嵌套的复合术语。树结构应该是可识别的:从您的示例中,N,树节点上的实际元素,始终是术语的第一个参数,左、右子树是T1和T2

首先,这是一个非常简单的谓词,可以按如下顺序遍历树:

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

这将在回溯时提供元素。

BTTreeN,。。。Prolog语法不是以.bTTreeN开头吗,。。?这是正确的Prolog语法吗?请先查阅一本Prolog书籍:Prolog的艺术,Bratko,等等。谢谢你的帮助。。。