如何在Prolog中将树叶添加到树中

如何在Prolog中将树叶添加到树中,prolog,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). addLea

我正在学习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).
[debug]  ?- addLeaf(Tree, 6, NewTree).
Tree = nil,
NewTree = t(nil, 6, nil) 
原始树是nil(没有树),因此添加一个新叶相当于创建一个以元素6为根的新树(称为tree)

现在我的问题是:“我已经创建了一棵新树,它对应于tree变量,我该怎么做才能将其他叶子添加到此树中?”

因为,如果现在我尝试执行以下语句:

[debug]  ?- addLeaf(nil, 6, Tree).
Tree = t(nil, 6, nil).
[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.
...
...
如果不在唯一语句中声明所有操作,您可以了解一些有关它的信息。

您可以:


此示例使用顶级变量(SWI Prolog的一个功能).从NewTree2判断,您的代码似乎有一个输入错误。

看看
assert
。您在
addLeaf
的第3个子句的第3个参数中缺少了functor
t
。Tnx,我已经纠正了这个规则中的输入错误Tnx,现在已经很清楚了。我已经纠正了我发布的代码中的输入错误,也许有一天会有人可以使用此帖子:-)