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
是否为noroot/1
,因为这会与/2上方存在冲突。接下来,我们确定父级LP
的级别,最后通过声明L是LP+1
来计算节点的级别,其中L
是N
的级别,LP
是opP
:
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
都有level0
(因此树的所有节点)。