Tree 关于2-3词典Prolog实现的质疑
我正在使用SWI Prolog学习Prolog,我对在Prolog中实现2-3字典有一些疑问 我知道2-3字典的理论,即树的内部节点可以生成具有以下属性的2或3个子树: 1) 所有项目都存储在叶子中,并按从小到大的顺序排列 2) 所有的叶子都在同一水平面上 3) 内部节点不包含插入的项,但包含标签,该标签以以下方式指定子树的最小元素: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个子树,则此内
- 如果一个内部节点有2个子树,则此内部节点中的标签包含其右子树的最小元素(因此,如果我搜索的项目X小于标签,我确定它位于左子树中)
- 如果内部节点有3个子树,则此内部节点中的标签包含2个值:M2和M3,其中M1是中心子树中的最小值,M3是右子树中的最小值
- 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中的最小元素
/* 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插入其中一个子树,并使用第二个子树的最小元素作为左子树的根作为新树的根(现在比级别高)
我的疑问是:在前面的例子中,NewTree是n2(NT1a,Mb,NT1b),M2,n2(T2,M3,T3)
因此M2(右子树的最小元素)是新根,因为它是