我正在 Prolog 中研究二叉树,我在将叶子添加到特定的 b 树时遇到了一些问题。
我有以下谓词将单个叶子添加到 b 树:
addLeaf(nil, X, t(nil, X, nil)).
addLeaf(t(Left, X, Right), X, t(Left, X, Right)).
addLeaf(t(Left, Root, Right), X, t(Left1, Root, Right)) :-
gt(Root, X), addLeaf(Left, X, Left1).
addLeaf(t(Left, Root, Right), X, t(Left, Root, Right1)) :-
gt(X, Root), addLeaf(Right, X, Right1).
gt(Element1, Element2) :- Element1 @> Element2.
这很简单,我认为我没有问题。
我的问题是关于使用它来执行向 bin 树添加更多叶子的查询,
例如,如果在 Prolog shell 中,我执行以下语句:
[debug] ?- addLeaf(nil, 6, Tree).
Tree = t(nil, 6, nil).
原来的树是nil(没有树),所以添加一个新的叶子相当于创建一个以元素6为根的新树(称为Tree)。
现在我的问题是:“我已经创建了一棵新树,它对应于 Tree 变量,我该怎么做才能将其他叶子添加到这棵树上?”
因为,如果现在我尝试执行以下语句:
[debug] ?- addLeaf(Tree, 6, NewTree).
Tree = nil,
NewTree = t(nil, 6, nil)
我得到Tree = nill(如果我刚刚在前面的语句中创建它。显然 Tree 变量(在两个语句中)是相互独立的,显然变量是相互独立的。
所以我尝试执行:
[debug] ?- addLeaf(nil, 6, Tree), addLeaf(Tree, 8, NewTree).
Tree = t(nil, 6, nil),
NewTree = t(nil, 6, t(nil, 8, nil)).
并且将 8 元素添加为 6 的右子元素可以正常工作(根据 b-tree 规则)
但是,我问的是,在 Prolog shell 中,是否可以这样做:
create new tree.
add a leaf.
add another leaf.
add another leaf.
...
...
没有在一个独特的语句中声明所有操作,关于它的一些想法?