• It was painful for my GC, but fixed now (Re: The pairs are nasty, other

    From Mild Shock@21:1/5 to Mild Shock on Wed Jul 30 14:51:07 2025
    Hi,

    The sharing example was painful for my GC.
    I got a long GC pause:

    /* Dogelog Player 1.3.5 for JavaScript */
    ?- time((share(X), acyclic3(X), fail; true)).
    % Zeit 122 ms, GC 0 ms, Lips 4906262, Uhr 30.07.2025 04:54
    true.

    ?- time((share(X), acyclic3(X), fail; true)).
    % Zeit 445 ms, GC 313 ms, Lips 1345087, Uhr 30.07.2025 04:54
    true.

    But fixed now:

    /* Dogelog Player 1.3.5 for JavaScript */
    ?- time((share(X), acyclic3(X), fail; true)).
    % Zeit 125 ms, GC 7 ms, Lips 4788512, Uhr 30.07.2025 09:11
    true.

    Here is share/1, the idea is to have some
    deep term, and share it widely:

    share(L) :-
    fac(s(s(s(s(s(s(s(n))))))), X),
    length(L, 5000),
    maplist(=(X), L).

    With usual peano arithmetic. n/0 stands for
    null, and s/1 for successor:

    add(n, X, X).
    add(s(X), Y, Z) :- add(X, s(Y), Z).

    mul(n, _, n).
    mul(s(X), Y, Z) :- mul(X, Y, H), add(Y, H, Z).

    fac(n, s(n)).
    fac(s(X), Y) :- fac(X, H), mul(s(X), H, Y).


    Mild Shock schrieb:
    Hi,

    Looks like the pairs are really nasty.
    I have them on the Novacore GIT.

    This one is no problem for Scryer-Prolog:

    test :-
       share(X), share(Y), X == Y.

    /* SWI-Prolog 9.3.26 */
    ?- time(test).
    % 32,140 inferences, 0.000 CPU in 0.002 seconds (0% CPU, Infinite Lips)
    true.

    /* Scryer Prolog 0.9.4-417 */
    ?- time(test).
       % CPU time: 0.006s, 32_042 inferences
       true.

    /* Trealla Prolog 2.79.6 */
    ?- time(test).
    % Time elapsed 0.016s, 42012 Inferences, 2.582 MLips
       true.

    /* Dogelog Player 1.3.5 */
    ?- time(test2).
    % % Zeit 83 ms, GC 0 ms, Lips 12117469, Uhr 30.07.2025 05:47
    % true.

    The Dogelog Player solutions uses a variant
    of library(hash), called library(maps).
    Both hash tables are itself 100% Prolog.

    Bye

    Mild Shock schrieb:
    Hi,

    Having fun with Bisimulation, and a new test
    suite of nasty circular pairs. But how store
    circular pairs, if clauses do not support

    circular terms. Well chop it up into equations,
    I create 1000 such equation pairs:

    test([A = c(A, B), C = c(A, D), E = n, _ = c(F, B),
           F = c(C, C), G = c(G, D), D = c(E, C), B = n],
          [H = c(H, I), J = c(K, I), L = c(L, I), I = c(M, N),
           O = c(K, J), N = n, K = c(K, J), M = c(K, O)]).
    Etc..

    The pairs are nasty because the usual compare_with_stack/2
    chokes on them. Here some results:

    /* SWI-Prolog 9.3.26 */
    ?- time((between(1,30,_), part, fail; true)).
    % 540,118 inferences, 0.047 CPU in 0.041 seconds (115% CPU, 11522517
    Lips)
    true.

    /* Trealla Prolog 2.78.40 */
    ?- time((between(1,30,_), part, fail; true)).
    % Time elapsed 0.113s, 1143903 Inferences, 10.157 MLips
        true.

    /* Scryer Prolog 0.9.4-417 */
    ?- time((between(1,30,_), part, fail; true)).
        % CPU time: 0.226s, 1_117_809 inferences
        true.

    /* Dogelog Player 1.3.5 */
    ?- time((between(1,30,_), part2, fail; true)).
    % Zeit 309 ms, GC 0 ms, Lips 8693718, Uhr 25.07.2025 13:47
    true.

    The amazing thing is, I compared a 100% Prolog
    implementation, so there is a lot of head room
    for improvement:

    part2 :-
        bitest(X,Y), X ~~ Y, fail; true.

    The operator (~~)/2 is part of library(math),
    and has been implemented with same_term/2 so far.

    Bye



    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)