? users online
  • Logout
    • Open hangout
    • Open chat for current file
<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:_},
                       _),    % &lt;&lt; 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:_},  % &lt;&lt;  SLOW
                       tag{c:X,d:_}),
                  true)).

qB5 :-
    % 854257 lips
    forall(between(1, 200, X),
           forall(node(_,  % &lt;&lt;  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>