【问题标题】:Prolog if-else conditionalsProlog if-else 条件
【发布时间】:2017-05-01 19:31:46
【问题描述】:

我是 prolog 的新手,我正在尝试实施 BST。 BST 以node(X,L,R) 的形式隐含,X 为正整数,L 左子树,R 右子树,leaf 为基本情况。

此 BST 的一个特点是能够搜索树的元素。如果ElemBst 的元素,则elem(Bst,Elem) 成功,否则为假。

例子:

?- 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)).

但是我对这个 b/c 太确定了,我不确定 if-else 条件会发生什么。如果Elem is Xtrue,这个想法显然是用true 成功,但由于prolog 没有“返回”任何东西,我不确定会发生什么。

这是对的吗?我如何解决它?我还能做些什么更好?

【问题讨论】:

  • 您不确定您写的内容是否有效?你试过了吗?你不需要elem(leaf, _) :- false.,因为elem(leaf, _)自然会失败,只要你没有规则或事实导致它成功。

标签: prolog


【解决方案1】:

在 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。但这超出了您当前要求的范围。

【讨论】:

  • 在这种情况下是 &lt;,&gt;,= 等式原子吗?
  • @thestateofmay 在顶层尝试?- atom(&gt;). 看看你会得到什么:-) 但是是的,它们似乎是。我只知道它是这样工作的。如果你想知道 Prolog 是如何被解析的,你应该阅读你的实现的解析器 :-( 我还记得“Prolog 的工艺”包含一个用 Prolog 编写的参考 Prolog 解析器,如果你有兴趣的话。
【解决方案2】:
elem(node(Elem,_,_),Elem).

elem(node(X,L,R),Elem):- 
    dif(X,Elem),
    (elem(L,Elem);elem(R,Elem)).

试试这个,就像我检查是否相等一样简单,如果不相等,则左右搜索

【讨论】:

  • 改用dif(X, Elem)
  • 这是为什么呢?逻辑中的某些东西会改变吗?我同意它更容易阅读,但它还有其他效果吗?
  • 看起来变量更好,虽然我没有遇到我的方法失败的情况,但我会改变它以防万一;)
  • X \= a, X = b 失败,但 X = b, X \= a 成功。但是dif/2 两者都是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多