0
我在SWI-Prolog中使用仿函数来获取使用arg/3的随机访问数组。 我在做什么是从一个样本加载值到一个仿函数我创建并断言该数组以供将来使用。在序言中声明和使用快速,大型的阵列
加载后,随机访问确实是O(1),因为我已经使用time/1进行了验证。问题是从断言中加载函数需要很多时间(time/1表明它在数组大小上是线性的)。 有没有什么办法可以加快这个速度?使用current_sample/1
时,因为谓词的参数是从数据库中拷贝当谓语被称为
:- dynamic
current_sample/1.
xrange(L,R,X):-
L < R,
(X = L;
X1 is L+1, xrange(X1,R,X)
).
arraybase_from_list__set_arg_from_list([], _, _).
arraybase_from_list__set_arg_from_list([Head|Tail], I, ResArray):-
I1 is I+1,
nb_setarg(I1, ResArray, Head),
arraybase_from_list__set_arg_from_list(Tail, I1, ResArray).
arraybase_from_list(List, ResArray):-
length(List, L),
functor(ResArray, custom_array_data, L),
arraybase_from_list__set_arg_from_list(List, 0, ResArray).
test_array_create(N):- % Creates a dummy array of squares of numbers fromo [0,N)
findall(X2, (xrange(0,N,X), X2 is X*X), XList),
arraybase_from_list(XList, Arr),
assert(current_sample(Arr)).
test_array_get(I,V):- % Unifies V with Ith element of Current sample
I0 is I+1,
current_sample(Arr), % Take turns timing this
arg(I0, Arr, V). % And then timing this
谢谢 不幸的是我有一点紧张的时间,所以我要在这里使用全局变量的简单的解决方案。 DCG是我不久将要拿起的东西。 – 2bigpigs
谢谢你花时间告诉我这个! – mat