Prolog if-else条件

时间:2017-04-30 00:26:39

标签: prolog

我是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没有"返回"什么,我不确定会发生什么。

这是对的吗?我如何解决它?我能做得更好吗?

2 个答案:

答案 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)).

试试这个,它就像我检查是否相等,如果不相同,则左右搜索