Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在prolog中检查树是否为avl树。错误_Prolog_Avl Tree_Instantiation Error - Fatal编程技术网

在prolog中检查树是否为avl树。错误

在prolog中检查树是否为avl树。错误,prolog,avl-tree,instantiation-error,Prolog,Avl Tree,Instantiation Error,我的程序运行不正常。当我尝试测试它时,我有一个错误 我的测试示例: 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(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).
if-avl-tree(t(,,,)/):-t=t(,,,,)/,是二叉树(t),if-avl-tree(t!。
if_avl_树(nil/0,0)。
if_avl_树(t(nil/0,0,nil/0),1)。
if_avl_树(t(L,R)/H,Hh):-if_avl_树(L,H1),
如果树(R,H2),abs(H1-H2)=<1!,
H3是1+最大值(H1,H2),H3=:=Hh。
is_binTree(零/0):-!。
is_binTree(t(L,u,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.
错误:参数未充分实例化
错误:在:
错误:[10]1=:=\u 6218
错误:[8]如果e:/prolog/tasks/lab06tomashchuk.pl:50处的树(t(…,16,…)/4)为
错误:[7]
错误:
错误:注意:由于上次调用优化,某些帧丢失。
错误:在调试模式(:-debug.)下重新运行程序以获取更多详细信息。

您的示例代码肯定是正确的,但有一些异常

让我们从二叉树的简单表示开始:

btree(Value, Left, Right)
这是不言自明的。如果没有子树,则可以使用atom
nil

如果我们想验证结构是否为二叉树,我们可以这样做:

is_binary_tree(nil).    % Allow for a nil tree with no values
is_binary_tree(btree(_, Left, Right)) :-
    is_binary_tree(Left),
    is_binary_tree(Right).
如果任何节点的两个子树的高度相差最多一个,则二叉树为AVL。如果您的二叉树表示已经将每棵树的高度作为树表示的一部分,如下所示:

btree(Value, Left, Right)/Height
然后,必须假设树的内容或结构发生变化时,
高度保持不变。如果它们没有被改变,那么关于它是否是AVL树的决定就不需要额外的高度参数。高度已预先计算并保持,因此只需检查:

is_AVL_tree(nil/0).
is_AVL_tree(btree(_, Left, Right)/_) :-
    Left = btree(_, _, _)/HeightLeft,
    Right = btree(_, _, _)/HeightRight,
    abs(HeightLeft - HeightRight) =< 1,
    is_AVL_tree(Left),
    is_AVL_tree(Right).
is_AVL_树(nil/0)。
是AVL树(B树(左,右)/:-
左=b树(u,u,u)/左高,
右=b树(u,u,u)/右高,
abs(左高-右高)=<1,
是_AVL_树(左),
是_AVL_树(右)。
高度为1时,不需要单独的基本情况。这是由上面的两条规则处理的

如果在术语中没有通过维护树作为参数预先确定高度,那么我们需要将高度作为参数进行计算。t不需要作为树表示的一部分。这将是多余的,并使规则变得不必要的混乱

is_AVL_tree(nil, 0).
is_AVL_tree(btree(_, Left, Right), Height) :-
    is_AVL_tree(Left, HeightLeft),
    is_AVL_tree(Right, HeightRight),
    abs(HeightLeft - HeightRight) =< 1,
    Height is 1 + max(HeightLeft, HeightRight).
is_AVL_树(nil,0)。
is_AVL_树(b树(_,左,右),高度):-
是_AVL_树(左,左高),
是一棵树(右,右高),
abs(左高-右高)=<1,
高度为1+最大值(左高、右高)。

您的示例代码肯定是正确的,但有一些异常

让我们从二叉树的简单表示开始:

btree(Value, Left, Right)
这是不言自明的。如果没有子树,则可以使用atom
nil

如果我们想验证结构是否为二叉树,我们可以这样做:

is_binary_tree(nil).    % Allow for a nil tree with no values
is_binary_tree(btree(_, Left, Right)) :-
    is_binary_tree(Left),
    is_binary_tree(Right).
如果任何节点的两个子树的高度相差最多一个,则二叉树为AVL。如果您的二叉树表示已经将每棵树的高度作为树表示的一部分,如下所示:

btree(Value, Left, Right)/Height
然后,必须假设树的内容或结构发生变化时,
高度保持不变。如果它们没有被改变,那么关于它是否是AVL树的决定就不需要额外的高度参数。高度已预先计算并保持,因此只需检查:

is_AVL_tree(nil/0).
is_AVL_tree(btree(_, Left, Right)/_) :-
    Left = btree(_, _, _)/HeightLeft,
    Right = btree(_, _, _)/HeightRight,
    abs(HeightLeft - HeightRight) =< 1,
    is_AVL_tree(Left),
    is_AVL_tree(Right).
is_AVL_树(nil/0)。
是AVL树(B树(左,右)/:-
左=b树(u,u,u)/左高,
右=b树(u,u,u)/右高,
abs(左高-右高)=<1,
是_AVL_树(左),
是_AVL_树(右)。
高度为1时,不需要单独的基本情况。这是由上面的两条规则处理的

如果在术语中没有通过维护树作为参数预先确定高度,那么我们需要将高度作为参数进行计算。t不需要作为树表示的一部分。这将是多余的,并使规则变得不必要的混乱

is_AVL_tree(nil, 0).
is_AVL_tree(btree(_, Left, Right), Height) :-
    is_AVL_tree(Left, HeightLeft),
    is_AVL_tree(Right, HeightRight),
    abs(HeightLeft - HeightRight) =< 1,
    Height is 1 + max(HeightLeft, HeightRight).
is_AVL_树(nil,0)。
is_AVL_树(b树(_,左,右),高度):-
是_AVL_树(左,左高),
是一棵树(右,右高),
abs(左高-右高)=<1,
高度为1+最大值(左高、右高)。

=:=/2
计算表达式参数并测试是否相等。因此,它要求表达式是可计算的。如果由于未绑定的变量而无法对其中任何一个进行求值,它将告诉您参数没有充分实例化。在您的术语中,
H3=:=Hh
未绑定
H3
Hh
。这句话的目的是什么?只是为了将
H3
分配给
Hh
?如果是这样,那就没有必要了。在这种情况下,请删除该语句,并在谓词子句的开头使用
H3
而不是
Hh
。为什么要进行所有这些剪切(
)?不要使用手上的伤口。当您不需要其他有效解决方案时,可以将它们用于删除其他有效解决方案的特定目的。但是如果你不确定的话,就从没有它们开始。为什么
nil/0
?单独使用
nil
还不够吗?您有一点不一致:
如果_avl_树(t(nil/0,u,nil/0),1)。
没有使用与其他谓词相同的树表示形式。
=:=/2
计算表达式参数并测试是否相等。因此,它要求表达式是可计算的。如果由于未绑定的变量而无法对其中任何一个进行求值,它将告诉您参数没有充分实例化。在你的术语中,
H3=:=Hh