<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>