Я хочу знать, как интеллектуальная индексация первого аргумента реализована в различных реализациях Prolog.
В частности, простые цели типа тестирования, такие как integer/1
сразу после предложения "шея", могут способствовать лучшей индексации.
Рассмотрим:
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 лучше?