【发布时间】:2017-03-25 11:02:32
【问题描述】:
我的程序运行不正常。当我尝试对其进行测试时,我遇到了错误。
我的测试示例:
if_avl_tree(t(t(t(nil/0, 3, nil/0)/1, 7, t(t(nil/0, 9, nil/0)/1, 11, nil/0)/2)/3, 16, t(nil/0, 25, t(nil/0, 40, nil/0)/1)/2)/4).
这是我的代码:
if_avl_tree(t(_,_,_)/_ ) :- T=t(_,_,_)/_ , is_binTree(T), if_avl_tree(T, _), !.
if_avl_tree(nil/0, 0).
if_avl_tree(t(nil/0,_, nil/0), 1).
if_avl_tree(t(L,_,R )/H, Hh) :- if_avl_tree(L, H1),
if_avl_tree(R, H2), abs(H1 - H2) =< 1, !,
H3 is 1 + max(H1,H2), H3=:=Hh.
is_binTree(nil/0) :- !.
is_binTree(t(L,_,R)/_):- is_binTree(L), is_binTree(R).
这是我的错误:
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [10] 1=:=_6218
ERROR: [8] if_avl_tree(t(...,16,...)/4) at e:/prolog/tasks/lab06tomashchuk.pl:50
ERROR: [7] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
【问题讨论】:
-
=:=/2计算表达式参数并测试是否相等。所以它要求表达式是可评估的。如果由于未绑定变量而无法评估其中任何一个,它会告诉您参数没有充分实例化。在您的任期内,H3=:=Hh或H3或Hh不受约束。这个声明的目的是什么?只是将H3“分配”给Hh?如果是这样,那就没有必要了。在这种情况下,删除该语句并在谓词子句的头部使用H3而不是Hh。 -
你为什么要剪这么多(
!)?不要随意使用切割。当您不想要它们时,将它们用于修剪掉其他有效解决方案的特定目的。但是,如果您不确定,请先不使用它们。 -
为什么是
nil/0?nil一个人还不够吗? -
您有一点不一致:
if_avl_tree(t(nil/0,_, nil/0), 1).没有使用与您的其他谓词相同的树表示。
标签: prolog avl-tree instantiation-error