<div class="notebook">
<div class="nb-cell program" name="p1">
:- dynamic
node/2.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Data structure index
% node(tok(A,B),
% tag(C,D)) :- ...
%
genA(N) :-
forall(between(1, N, I),
genA_(I)).
genA_(I) :-
random_between(1, I, A),
random_between(1, I, B),
random_between(1, I, C),
random_between(1, I, D),
assertz(node(tok(A,B),
tag(C,D))).
qA :-
% 1488178 Lips
forall(between(1, 200, X),
forall(node(tok(X,_),
tag(_,_)),
true)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dict structure index
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% node(tok{a:A,b:B},
% tag{c:C,d:D})
% Takes 60% longer
genB(N) :-
forall(between(1, N, I),
genB_(I)).
genB_(I) :-
random_between(1, I, A),
random_between(1, I, B),
random_between(1, I, C),
random_between(1, I, D),
assertz(node(tok{a:A,b:B},
tag{c:C,d:D})).
qB :-
% 1048092 Lips
forall(between(1, 200, X),
forall(node(tok{a:X,b:_},
tag{c:_,d:_}),
true)).
qB2 :-
% 1130397 lips
forall(between(1, 200, X),
forall(node(tok{a:X,b:_},
_), % << minor performance benefit ?
true)).
qB3 :-
% 1053252 lips
forall(between(1, 200, X),
forall(node(_,
tag{c:X,d:_}),
true)).
qB4 :-
% 1827
forall(between(1, 200, X),
forall(node(tok{a:_,b:_}, % << SLOW
tag{c:X,d:_}),
true)).
qB5 :-
% 854257 lips
forall(between(1, 200, X),
forall(node(_, % << SLOW
tag{c:_,d:X}),
true)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% tree(node{tok:tok{a:A,b:B},
% tag:tag{c:C,d:D} },[])
genC(N) :-
forall(between(1, N, I),
genC_(I)).
genC_(I) :-
random_between(1, I, A),
random_between(1, I, B),
random_between(1, I, C),
random_between(1, I, D),
assertz(tree(node{tok:tok{a:A,b:B},
tag:tag{c:C,d:D}},_)).
qC :-
% 4994672 Lips
forall(between(1, 200, X),
forall(node(tok{a:X,b:_},
tag{c:_,d:_}),
true)).
</div>
<div class="nb-cell query" name="q1">
time(genA(10 000)),
time(qA),
time(qA).
</div>
<div class="nb-cell query" name="q2">
time(genB(10 000)),
time(qB),
time(qB).
</div>
<div class="nb-cell query" name="q4">
time(genB(10 000)),
time(qB2),
time(qB2).
</div>
<div class="nb-cell query" name="q6">
time(genB(10 000)),
time(qB3),
time(qB3).
</div>
<div class="nb-cell query" name="q7">
</div>
<div class="nb-cell query" name="q8">
time(genB(10 000)),
time(qB5),
time(qB5).
</div>
<div class="nb-cell query" name="q3">
time(genC(10 000)),
time(qC),
time(qC).
</div>
<div class="nb-cell program" name="p2">
% Nope.
tok{a:_,b:_} :- true.
</div>
<div class="nb-cell query" name="q5">
d{a:A, b:B}.
</div>
</div>