【问题标题】:prolog in math - searching the level of node in prologprolog in math - 在 prolog 中搜索节点的级别
【发布时间】:2016-02-28 23:14:26
【问题描述】:

假设这里是一个二叉搜索树,并给出above(X,Y) - X 直接在Y 之上的规则。我还创建了规则 root(X) - X has no parent。

然后,我试图找出这棵树中节点的深度。 假设树的根节点是“r”所以我得到了事实level(r,0)。为了实现规则level(N,D) :-,我想的是这里应该有一个递归。 因此,我尝试了

level(N,D): \+ root(N), above(X,N), D is D+1, level(X,D). 

所以如果N不是根,则在N之上有一个节点X,层级D加一,然后递归。但是当我测试这个时,它只适用于根条件。当我创建更多事实时,例如节点“s”是节点“r”的左子节点,我的查询是 level(s,D)。它返回我“不”。我跟踪了查询,它显示了我

  1    1  Call: level(s,_16) ? 
  1    1  Fail: level(s,_16) ?

我只是困惑为什么当我调用level(s,D) 时它会失败?

【问题讨论】:

  • 您是否在查询中忘记了破折号 (-),或者这只是一个错字?

标签: math prolog logic prolog-toplevel


【解决方案1】:

您的查询存在一些问题:

  • 在 Prolog 中你不能写像 D is D+1 这样的东西,因为一个变量只能被赋值一个值;
  • 在你调用D is D+1的那一刻,D还没有被实例化,所以很可能会报错;和
  • 您从不声明(至少不在可见代码中)根的level/20

一种解决方案是首先声明任何根的级别是0

level(N,0) :-
    root(N).

现在我们必须定义归纳案例:首先我们确实使用above/2 谓词来查找父级。严格来说,检查N 不是root/1 是不必要的,因为它会与存在above/2 的事实相冲突。接下来我们确定父级LP 的级别,最后我们通过声明L is LP+1 来计算我们节点的级别,其中LNLP 的级别操作P

level(N,L) :-
    above(P,N),
    level(P,LP),
    L is LP+1.

或者把它们放在一起:

level(N,0) :-
    root(N).
level(N,L) :-
    above(P,N),
    level(P,LP),
    L is LP+1.

由于您没有提供示例树,因此我无法测试此谓词的行为是否符合您的预期。


关于root/1

注意,写root/1,你引入了数据重复:你可以简单地写:

root(R) :-
    \+ above(_,R).

【讨论】:

  • 是的!级别(N,D):- 上面(X,N),深度(X,O),D 为 O+1。是我后来做的。但我失去了基本情况。我跟着递归。以上是我的一般情况,而基本情况真的让我很恼火,因为我尝试了“level(N,D) :- root(N), D is 0”。 “级别(N,0)。”他们不工作。基本情况是必要的。我认为我应该在“:-”之后表示“()”中提供的所有变量。
  • 第一个应该可以工作level(N,D) :- root(N),D is 0. 第二个意味着每个N 都有级别0(因此树的所有节点)。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多