我是 Prolog 菜鸟,请记住这一点。
我尝试编写一个谓词来确定某个给定术语是否是二叉搜索树。我想出了这段代码:
is_btree(nil).
is_btree(node(N,L,R)) :-
number(N),
is_btree(L),
is_btree(R),
small(N, R),
big(N, L).
small(N, nil).
small(N, node(M,L,R)) :-
N < M,
small(N, L),
small(N, R).
big(N, nil).
big(N, node(M,L,R)) :-
N > M,
big(N, L),
big(N, R).
它工作得很好,直到我测试右侧有一个节点的图,该节点通过“高于父节点”的条件,但它高于或等于父节点的父节点。在这种情况下,Prolog 报告失败。
以下是意外失败的示例查询:
?- is_btree(node(9,node( 3,node( 2,nil,nil),
node(10,nil,nil)),
node(12,node( 8,nil,nil),
node(15,nil,nil)))).
false.
当左侧的某个节点高于父节点的父节点时,会出现非常类似的问题,如下图所示:
如何仅使用其直接父节点的值而不是父节点的父节点的值来检查节点值?