Recursion Prolog递归返回多个结果

Recursion Prolog递归返回多个结果,recursion,prolog,Recursion,Prolog,首先,这是一个摆在我面前的家庭作业问题 我应该写一个谓词btree\u height\2,它接受一个二叉树,并且(现在)只返回树的高度 二叉树表示为: node(node(leaf, x, leaf), x, node(leaf, x, leaf)) 其中x是节点的整数值。(这只是一个示例树) 我的代码如下: btree_height(leaf, 0). btree_height(node(leaf,_,leaf), 1). btree_height(node(LT,_,RT), D):-

首先,这是一个摆在我面前的家庭作业问题

我应该写一个谓词btree\u height\2,它接受一个二叉树,并且(现在)只返回树的高度

二叉树表示为:

node(node(leaf, x, leaf), x, node(leaf, x, leaf)) 
其中x是节点的整数值。(这只是一个示例树)

我的代码如下:

btree_height(leaf, 0).
btree_height(node(leaf,_,leaf), 1).
btree_height(node(LT,_,RT), D):-
    btree_height(LT, DL), 
    btree_height(RT, DR),
    D is max(DL,DR)+1.
我遇到的问题是,当我调用btree_height(BT,D)并为它提供一个BT时,如果深度为4,那么它将递归4次,并“返回”数字4四次。根据我的教授,这是一个错误的行为,因为它应该只返回数字4一次。(使用上面的示例,它两次返回数字2)

这是我第一次用Prolog编写代码,我不知道应该从哪里开始


从技术上讲,这是SWI Prolog,如果它起作用的话…

因为这是家庭作业,我不会给你完整的解决方案

当谓词命中与
node(leaf,u,leaf)
匹配的节点时,它首先执行第二个子句。返回一个。然后,当您要求它回溯时,它也会执行第三个子句,因为这也会将输入与
LT=leaf
RT=leaf
匹配,因此它会递归两次并同时命中
leaf
大小写

下次,如果您必须自己调试此类问题,
trace/1
是一个很好的工具:

2 ?- trace.
true.

[trace] 2 ?- btree_height(node(node(leaf, x, leaf), x, node(leaf, x, leaf)), H).
   Call: (6) btree_height(node(node(leaf, x, leaf), x, node(leaf, x, leaf)), _G821) ? creep
   Call: (7) btree_height(node(leaf, x, leaf), _G903) ? creep
   Exit: (7) btree_height(node(leaf, x, leaf), 1) ? creep
   Call: (7) btree_height(node(leaf, x, leaf), _G903) ? creep
   Exit: (7) btree_height(node(leaf, x, leaf), 1) ? creep
   Call: (7) _G821 is max(1, 1)+1 ? creep
   Exit: (7) 2 is max(1, 1)+1 ? creep
   Exit: (6) btree_height(node(node(leaf, x, leaf), x, node(leaf, x, leaf)), 2) ? creep
H = 2 ;
   Redo: (7) btree_height(node(leaf, x, leaf), _G903) ? creep
   Call: (8) btree_height(leaf, _G903) ? creep
   Exit: (8) btree_height(leaf, 0) ? creep
   Call: (8) btree_height(leaf, _G903) ? creep
   Exit: (8) btree_height(leaf, 0) ? creep
   Call: (8) _G911 is max(0, 0)+1 ? creep
   Exit: (8) 1 is max(0, 0)+1 ? creep
   Exit: (7) btree_height(node(leaf, x, leaf), 1) ? creep
   Call: (7) _G821 is max(1, 1)+1 ? creep
   Exit: (7) 2 is max(1, 1)+1 ? creep
   Exit: (6) btree_height(node(node(leaf, x, leaf), x, node(leaf, x, leaf)), 2) ? creep
H = 2

(上面写着“爬行”,我按了回车键。)

注意我删除了
家庭作业
标签谢谢!我刚刚删除了btree_height(node(leaf,u,leaf),1)行,因为我已经有了一个基本情况。我现在觉得很傻。。。