使用Prolog查找二叉树高度

时间:2014-11-22 23:39:40

标签: prolog logic

我正在尝试编码二叉树高度问题,但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).

谢谢。

1 个答案:

答案 0 :(得分:2)

height不是返回高度的函数。当第二个参数是第一个参数的高度时,它是predicate。所以你可以使用height(L,_) > height(R,_)。您必须height(L,LH), height(R,RH)并将LHRH进行比较。出于类似的原因,您无法查询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评估。