我试图搜索这个,但没有运气;如果问题已经得到解答,请告诉我!
假设我有一个二进制树,其键值对形式为:
t/0
:空树t/4
:t(Key, Value, Left, Right)
现在我想获得第一个(min)元素。显而易见的(对我来说)实施是:
min0(t(K,V,t,_), K, V) :- !.
min0(t(_,_,L,_), K, V) :- min0(L, K, V).
然而,SWI-Prolog library(assoc)
中的实现与以下几行有关:
min(t(K,V,L,_), Key, Val) :- min(L, K, V, Key, Val).
min(t,K,V,K,V).
min(t(E,K,V,_), _, _, Key, Val) :- min(L, K, V, Key, Val).
max
和get
等其他操作在方法上表现出相同的差异。
为什么呢?我在这里错过了什么?据我所知,我的版本没有创建选择点。但话又说回来,我需要在基本情况下进行削减。
答案 0 :(得分:3)
当考虑执行子句时,您的版本 会创建一个选择点。 !/0
切断了之前创建的选择点。您的版本不允许对第一个参数进行索引,但依赖于术语中更深处的统一。您是否已经在大型二叉树上对这两个版本进行了基准测试?除此之外,我发现SWI版本更优雅,因为您提到的两个树术语自然会出现在其中。