我正在尝试编码二叉树高度问题,但Prolog返回false而不是height值。
我的代码是:
height( nil, 0 ).
height( t(_,L, R), H ):-
( height(L,_)>height(R,_), height(L,H-1)
; height(R,_)>=height(L,_),height(R,H-1)
).
返回false而不是1的简单示例代码是:
height(t(a,nil,nil),RES).
谢谢。
答案 0 :(得分:2)
height
不是返回高度的函数。当第二个参数是第一个参数的高度时,它是predicate
。所以你可以使用height(L,_) > height(R,_)
。您必须height(L,LH), height(R,RH)
并将LH
与RH
进行比较。出于类似的原因,您无法查询height(L, H-1)
并获得预期的结果,因为@false指出,H-1
在此上下文中是术语'-'(H,1)
,并且不会被解释为算术表达式。在Prolog中,只有当算术表达式位于is
表达式的右侧,或者在算术比较表达式中时,才会对其进行解释。
所以完整的,你纠正的谓词看起来像是:
height( nil, 0 ). % Height of nil tree is 0
height( t(_,L,R), H ) :- % Height of binary tree t(_,L,R) is H if...
height(L, LH), % LH is the height of subtree L, and
height(R, RH), % RH is the height of subtree H, and
( LH > RH % if LH > RH, then
-> H is LH + 1 % H is LH + 1
; H is RH + 1 % otherwise, H is RH + 1
).
或者更直接地说,您可以使用Prolog中提供的max
函数(如@false所指出的那样):
height( nil, 0 ). % Height of nil tree is 0
height( t(_,L,R), H ) :- % Height of binary tree t(_,L,R) is H if...
height(L, LH), % LH is the height of subtree L, and
height(R, RH), % RH is the height of subtree H, and
H is max(LH, RH) + 1.
再次注意,is
右侧的表达式将由Prolog评估。