Math 数学中的prolog-在prolog中搜索节点的级别

Math 数学中的prolog-在prolog中搜索节点的级别,math,prolog,logic,prolog-toplevel,Math,Prolog,Logic,Prolog Toplevel,假设这里是一个二叉搜索树,并且给出了在(X,Y)-X正上方Y的规则。我还创建了规则root(X)-X没有父级 然后,我试图找出这个树中节点的深度。 假设树的根节点是“r”,所以我得到了事实级别(r,0)。为了实现规则级别(N,D):-,我的想法是这里应该有一个递归。 因此,我尝试了 level(N,D): \+ root(N), above(X,N), D is D+1, level(X,D). 因此,如果N不是根,则在N上方有一个节点X,级别D加上一,然后递归。但当我测试这个时,它只适用于

假设这里是一个二叉搜索树,并且给出了
在(X,Y)
-
X
正上方
Y
的规则。我还创建了规则
root(X)
-
X
没有父级

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

level(N,D): \+ root(N), above(X,N), D is D+1, level(X,D). 
因此,如果
N
不是根,则在
N
上方有一个节点
X
,级别
D
加上一,然后递归。但当我测试这个时,它只适用于根条件。当我创建更多的事实时,比如节点“s”是节点“r”的leftchild,我的查询是level(s,D)。它返回“否”。我追踪了这个查询,它告诉我

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

当我调用
level(s,D)
时,我弄不明白为什么它会失败

您的查询存在一些问题:

  • 在Prolog中,您不能编写类似于
    D是D+1
    ,因为一个变量只能分配一个值
  • 在您调用
    D为D+1
    时,
    D
    尚未实例化,因此可能会导致错误;及
  • 您从未声明(至少不在可见代码中)根的
    级别/2
    0
解决方案是首先声明任何根的级别为
0

level(N,0) :-
    root(N).
现在我们必须定义归纳情况:首先,我们确实使用
over/2
谓词查找父级。严格来说,没有必要检查
N
是否为no
root/1
,因为这会与/2上方存在
冲突。接下来,我们确定父级
LP
的级别,最后通过声明
L是LP+1
来计算节点的级别,其中
L
N
的级别,
LP
是op
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是0。”“level(N,0)”,但它们不起作用。基本情况是必要的。我认为我应该表示“()”中在“:-”之后提供的所有变量。第一个变量应该工作
level(N,D):-root(N,D)是0。
第二个表示每个
N
都有level
0
(因此树的所有节点)。