我是prolog的新手,我正在尝试实施BST。 BST隐含为L
形式,R
为正整数,leaf
为左子树,elem(Bst,Elem)
为右子树,Elem
作为基本案例。
此BST的一个功能是能够搜索树的元素。如果Bst
是?- elem(leaf,_).
false.
?- elem(node(3,node(2,leaf,leaf),node(5,leaf,leaf)),2).
true.
的元素,则elem(leaf,Elem) :-
false.
elem(Bst,Elem) :-
Bst = node(X,L,R),
Elem > 0,
(Elem is X ->
true;
elem(L,Elem),
elem(R,Elem)).
会成功,否则为false。
示例:
if-else
我尝试实施:
true
但是我对此b / c非常肯定我不确定Elem is X
条件会发生什么。如果true
是{{1}},那么这个想法显然会成功{{1}},但是因为prolog没有"返回"什么,我不确定会发生什么。
这是对的吗?我如何解决它?我能做得更好吗?
答案 0 :(得分:2)
你经常不需要Prolog中的条件。例如,这个问题可以像这样解决:
bst_member(node(X, L, R), Elem) :-
compare(Order, X, Elem),
bst_member_1(Order, Elem, L, R).
bst_member_1(>, Elem, L, _) :- bst_member(L, Elem).
bst_member_1(=, _, _, _). % Found it!
bst_member_1(<, Elem, _, R) :- bst_member(R, Elem).
这适用于任何事物,而不仅仅是整数或正整数。如果您确实只有整数,则可以使用library(clpfd)
和谓词zcompare/3
而不是compare/3
。但这超出了您目前要求的范围。
答案 1 :(得分:0)
elem(node(Elem,_,_),Elem).
elem(node(X,L,R),Elem):-
dif(X,Elem),
(elem(L,Elem);elem(R,Elem)).
试试这个,它就像我检查是否相等,如果不相同,则左右搜索