0

我正在 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.
...
...

没有在一个独特的语句中声明所有操作,关于它的一些想法?

4

2 回答 2

1

您可以在 SWI Prolog 中重用顶级绑定

6 ?- X = a(_).

X = a(_G236) 

7 ?- Z = $X.

Z = a(_G269) 
于 2013-04-27T19:35:01.890 回答
1
?- addLeaf(nil, 6, Tree).
Tree = t(nil, 6, nil).

?- addLeaf($Tree, 7, NewTree).
NewTree = t(nil, 6, t(nil, 7, nil)).

?- addLeaf($NewTree, 4, NewTree2).
NewTree2 = (t(nil, 4, nil), 6, t(nil, 7, nil)) .

此示例使用顶级变量(SWI-Prolog 的一项功能)。从 NewTree2 来看,您的代码中似乎有错字。

于 2013-04-27T19:35:22.543 回答