我想知道各种Prolog实现中如何实现智能的第一个参数索引。
特别是,像integer/1
这样的简单类型测试目标紧跟在“neck”之后的子句可能有助于更好的索引。
考虑:
foo(h(X),X).
foo([],nil).
foo([_|_],cons).
foo(X,Y) :- integer(X), Y = n(X).
按照这个子句的排序,我希望目标foo([],_)
能够成功,且不留下任何无用的选择点。
不幸的是,SWI Prolog并没有理解它:
?- length(Xs,10),
maplist(=([]),Xs),
statistics(trailused,T1),
maplist(foo,Xs,Ys),
statistics(trailused,T2).
T1 = 5792,
T2 = 5968,
Xs = [[], [], [], [], [], [], [], [], [], []],
Ys = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] ...
其他的Prolog实现是否表现更好?
foo(X,Y)when nonvar(X)
来说一切都很好,但对于变量X
来说就变得相当不合逻辑了:前三个子句成功,而最后一个失败。针对这种特定模式进行优化似乎是一种浪费的努力:它不会出现在任何纯程序中。 - false