Woa! The JavaScript JIT compiler is quite impressive. I now ported Dogelog runtime to Python as well, so that I can compare JavaScript and Python, and tested without clause indexing:
between(L,H,L) :- L =< H. between(L,H,X) :- L < H, Y is L+1, between(Y,H,X). setup :- between(1,255,N), M is N//2, assertz(edge(M,N)), fail. setup :- edge(M,N), assertz(edge2(N,M)), fail. setup. anc(X,Y) :- edge(X, Y). anc(X,Y) :- edge(X, Z), anc(Z, Y). anc2(X,Y) :- edge2(Y, X). anc2(X,Y) :- edge2(Y, Z), anc2(X, Z). :- setup. :- time((between(1,10,_), anc2(0,255), fail; true)). :- time((between(1,10,_), anc(0,255), fail; true)). The results are: /* Python 3.10.0rc1 */ % Wall 188 ms, trim 0 ms % Wall 5537 ms, trim 0 ms /* JavaScript Chrome 92.0.4515.159 */ % Wall 5 ms, trim 0 ms % Wall 147 ms, trim 0 ms -- https://mail.python.org/mailman/listinfo/python-list