如何在Prolog中向树中添加叶子

时间:2013-04-27 18:17:07

标签: prolog

我正在研究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树规则)

但是,我问的是,在Prolog shell中,是否有可能做到这一点:

create new tree.
add a leaf.
add another leaf.
add another leaf.
...
...

没有在一个唯一的声明中声明所有操作,对它有所了解吗?

2 个答案:

答案 0 :(得分:1)

你可以reuse top-level bindings in SWI Prolog

6 ?- X = a(_).

X = a(_G236) 

7 ?- Z = $X.

Z = a(_G269) 

答案 1 :(得分: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来看,你的代码中似乎有一个拼写错误。