Tree 关于2-3词典Prolog实现的质疑

Tree 关于2-3词典Prolog实现的质疑,tree,prolog,search-tree,2-3-tree,Tree,Prolog,Search Tree,2 3 Tree,我正在使用SWI Prolog学习Prolog,我对在Prolog中实现2-3字典有一些疑问 我知道2-3字典的理论,即树的内部节点可以生成具有以下属性的2或3个子树: 1) 所有项目都存储在叶子中,并按从小到大的顺序排列 2) 所有的叶子都在同一水平面上 3) 内部节点不包含插入的项,但包含标签,该标签以以下方式指定子树的最小元素: 如果一个内部节点有2个子树,则此内部节点中的标签包含其右子树的最小元素(因此,如果我搜索的项目X小于标签,我确定它位于左子树中) 如果内部节点有3个子树,则此内

我正在使用SWI Prolog学习Prolog,我对在Prolog中实现2-3字典有一些疑问

我知道2-3字典的理论,即树的内部节点可以生成具有以下属性的2或3个子树:

1) 所有项目都存储在叶子中,并按从小到大的顺序排列

2) 所有的叶子都在同一水平面上

3) 内部节点不包含插入的项,但包含标签,该标签以以下方式指定子树的最小元素

  • 如果一个内部节点有2个子树,则此内部节点中的标签包含其右子树的最小元素(因此,如果我搜索的项目X小于标签,我确定它位于左子树中)
  • 如果内部节点有3个子树,则此内部节点中的标签包含2个值:M2和M3,其中M1是中心子树中的最小值,M3是右子树中的最小值
因此,搜索此类词典中是否存在条目非常简单

插入更复杂,我已经理解了它的理论,但我只是对Prolog解释有一些问题

这是我的程序(摘自Ivan Bratko的书:人工智能编程):

在这项实施中,我有:

  • l(X)在我的树中显示一个项目
  • n2(T1,M,T2)rap表示一棵树,有2个子应力T1和T2,其中M是T2中的最小元素
  • n3(T1,M2,T2,M3,T3)**表示一棵树,包含3个子树:T1,T2,T3,其中M2是T2中的最小元素,M3是T3中的最小元素
第一个疑问与add23ins谓词之间存在的关系有关,它们是:

/* Add X to Tree giving Tree1
   CASE 1: After the insertion of X into Tree, Tree1 does not grow upwoards (so it means that an internal nodes 
           having 2 subtrees child, now have 3 subtrees child, so the original tree has grown in width)
*/
add23(Tree, X, Tree1) :- ins(Tree, X, Tree1).                    

/* CASE 2: Tree grows upwards: It meaans that  if after the insertion of X the height of the new tree is 
           increased so the ins/5 predicate determines the two subtrees T1 and T2 wich are then combined
           into a bigger tree    
*/
add23(Tree, X, n2( T1, M2, T2)) :- ins(Tree, X, T1, M2, T2).
正如我在评论中所写的,我认为第一个与新树不向上生长的情况有关(例如,我有一棵树有两个子树,插入一个新项,我正在创建一个新的子树,它的叶子与所有其他叶子处于同一级别(因此一个内部节点现在有两个标签),对吗

因此,在逻辑中,我可以这样理解:如果ins(Tree,X,Tree1)谓词为TRUE,那么我必须将X添加到树中,生成新的Tree1,该树具有与旧树相同的高度,但包含X项(因此它必须有一个具有3个子节点的内部节点)

第二种情况与我有一棵树的情况有关,我必须在一个已经有3个子树的节点中插入一个新项,因此我必须将老树拆分为2棵树,作为根,这两棵树都有作为标签的标签,一个标签取自旧原始节点的2个标签。因此,我可以将新项作为新树的叶和新根插入。

所以在逻辑上我可以这样理解:

如果谓词ins(Tree,X,T1,M2,T2)为真,则表示谓词为真:add23(Tree,X,n2(T1,M2,T2))

在这种情况下,我将具有3个子树的原始树拆分为两个不同的树:T1和T2,作为根,它们有一个节点,具有单个最小标签,取自原始树的旧根

碰巧我有一棵树有两个子树,另一棵树有一个子树,所以我可以将新插入的项添加到这个子树中,并将其用作高度增加一级的新树的新根

是吗?我对此不确定

在这本书中,我找到了对ins谓词的三种具体情况的解释,我对它的工作原理有很多疑问:

案例1:

ins(n2(T1, M , T2), X, n2(NT1, M, T2)) :- gt(M, X),
                                          ins(T1, X, NT1).
ins(n2(T1, M, T2), X, n3(NT1a, Mb, NT1b, M, T2)) :- gt(M, X),
                                                    ins(T1, X, NT1a, Mb, NT1b).
ins(n3(T1, M2, T2, M3, T3), X, n2(NT1a, Mb, NT1b), M2, n2(T2, M3, T3)) :-
                    gt(M2, X),
                    ins(T1, X, NT1a, Mb, NT1b).
本例假设原始树是:n2(T1,M,T2),我将X插入到只有2个子树的树中:T1和T2

M是右子树的最小元素

因此,如果gt(M,X)是真的,这意味着M>X,这意味着X可能是左子树,成为NT1(为什么?这可能取决于老T1在其子树中只有一片叶子的事实),因此,在最后,原始树变成n2(NT1,M,T2)

我认为这种情况很简单

案例2:

ins(n2(T1, M , T2), X, n2(NT1, M, T2)) :- gt(M, X),
                                          ins(T1, X, NT1).
ins(n2(T1, M, T2), X, n3(NT1a, Mb, NT1b, M, T2)) :- gt(M, X),
                                                    ins(T1, X, NT1a, Mb, NT1b).
ins(n3(T1, M2, T2, M3, T3), X, n2(NT1a, Mb, NT1b), M2, n2(T2, M3, T3)) :-
                    gt(M2, X),
                    ins(T1, X, NT1a, Mb, NT1b).
同样在这个例子中,假设原始树是:n2(T1,M,T2),我将X插入到只有2个子树的树中:T1和T2

M是右子树的最小元素

如果M>X是真的,那么谓词:ins(T1,X,NT1a,Mb,NT1b)

这意味着我将T1拆分为两个子树NT1a和NT1b,并在原始树中添加第三个子树,使之成为n3(NT1a、Mb、NT1b、M、T2)

好的,这很清楚,但我的问题是:在完整的代码中,这个谓词必须满足什么?我在搞混淆

案例3:

ins(n2(T1, M , T2), X, n2(NT1, M, T2)) :- gt(M, X),
                                          ins(T1, X, NT1).
ins(n2(T1, M, T2), X, n3(NT1a, Mb, NT1b, M, T2)) :- gt(M, X),
                                                    ins(T1, X, NT1a, Mb, NT1b).
ins(n3(T1, M2, T2, M3, T3), X, n2(NT1a, Mb, NT1b), M2, n2(T2, M3, T3)) :-
                    gt(M2, X),
                    ins(T1, X, NT1a, Mb, NT1b).
这种情况下,原始树有3个子树,当我必须插入它时,我必须将原始树拆分为两棵树(n3(T1,M2,T2,M3,T3)和n2(NT1a,Mb,NT1b)),将新项X插入其中一个子树,并使用第二个子树的最小元素作为左子树的根作为新树的根(现在比级别高)

我的疑问是:在前面的例子中,NewTreen2(NT1a,Mb,NT1b),M2,n2(T2,M3,T3)

因此M2(右子树的最小元素)是新根,因为它是