• How to project variables? [PIP-4711: Marked Variables]

    From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Fri Apr 11 12:42:11 2025
    From Newsgroup: comp.lang.prolog

    Hi,

    Now I am writing a new Prolog Improvement Proposal
    (PIP), which is PIP-4711: Marked Variables. Can
    we easily specify what marked variables should

    do in the top-level? Oh yes. If you have a query
    that contains unmarked and marked variables,
    just like this here:

    ?- q(N1, .., Nn, _M1, .., _Mm)

    Then the above query should work as:

    p(N1, .., Nn) :- q(N1, .., Nn, _M1, .., _Mm).

    ?- p(N1, .., Nn).

    The above specification assures that no information
    is lost, because it relies on the existential
    quantifier of Clark Completion. One can read the

    definition of q/n logically in first order logic
    as follows, namely with existential quantifiers:

    p(N1, .., Nn) <=> EXISTS(_M1, .., _Mm):q(N1, .., Nn, _M1, .., _Mm)

    Do some Prolog systems satisfy the above specification.
    Amazingly most Prolog systems cannot do it. They
    have problems archiving the above result, in very

    small test cases. The main problem is some permutation
    dependency, how the query q/n+m is formulated. It
    seems most Prolog systems do not use a

    permutation agnostic algorithm, whereas the
    first order logic specification doesn't have some
    permutation dependency and should be immune.

    Test1 Test2
    Trealla Prolog Pass Fail
    SWI-Prolog Fail Pass
    Dogelog Player Pass Pass

    Bye


    --- Synchronet 3.20c-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Fri Apr 11 12:47:57 2025
    From Newsgroup: comp.lang.prolog

    Test 1 is probably the most simple test case.
    It is only the following query:

    q(Y, _X) :- _X = Y.

    The projection would be:

    p(Y) :- q(Y, _X).

    ?- p(Y).
    true.

    Here are the testing results:

    Trealla Prolog 2.68.11-5: Pass

    ?- _X = Y.
    true.
    ?- Y = _X.
    true.

    SWI-Prolog 9.3.21: Fail

    ?- _X = Y.
    true.
    ?- Y = _X.
    Y = _X. %%% expected true

    Dogelog Player 1.3.2: Pass

    ?- _X = Y.
    true.
    ?- Y = _X.
    true.

    Mild Shock schrieb:
    Hi,

    Now I am writing a new Prolog Improvement Proposal
    (PIP), which is PIP-4711: Marked Variables. Can
    we easily specify what marked variables should

    do in the top-level? Oh yes. If you have a query
    that contains unmarked and marked variables,
    just like this here:

    ?- q(N1, .., Nn, _M1, .., _Mm)

    Then the above query should work as:

    p(N1, .., Nn) :- q(N1, .., Nn, _M1, .., _Mm).

    ?- p(N1, .., Nn).

    The above specification assures that no information
    is lost, because it relies on the existential
    quantifier of Clark Completion. One can read the

    definition of q/n logically in first order logic
    as follows, namely with existential quantifiers:

    p(N1, .., Nn) <=> EXISTS(_M1, .., _Mm):q(N1, .., Nn, _M1, .., _Mm)

    Do some Prolog systems satisfy the above specification.
    Amazingly most Prolog systems cannot do it. They
    have problems archiving the above result, in very

    small test cases. The main problem is some permutation
    dependency, how the query q/n+m is formulated. It
    seems most Prolog systems do not use a

    permutation agnostic algorithm, whereas the
    first order logic specification doesn't have some
    permutation dependency and should be immune.

                    Test1   Test2
    Trealla Prolog  Pass    Fail
    SWI-Prolog      Fail    Pass
    Dogelog Player  Pass    Pass

    Bye



    --- Synchronet 3.20c-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Fri Apr 11 12:53:32 2025
    From Newsgroup: comp.lang.prolog

    Test 2 is only minorly more complex than Test 1.
    It is only the following query:

    q(Y, Z, _X) :- _X = Y, _X = Z.

    The projection would be:

    p(Y, Z) :- q(Y, Z, _X).

    ?- p(Y, Z).
    Y = Z.

    Here are the testing results:

    Trealla Prolog 2.68.11-5: Fail

    ?- _X = Y, _X = Z.
    true. %%% expected Z = Y
    ?- Y = _X, _X = Z.
    Z = Y.
    ?- _X = Y, Z = _X.
    true. %%% expected Z = Y
    ?- Y = _X, Z = _X.
    Z = Y.

    SWI-Prolog 9.3.21: Pass

    ?- _X = Y, _X = Z.
    Y = Z.
    ?- Y = _X, _X = Z.
    Y = Z.
    ?- _X = Y, Z = _X.
    Y = Z.
    ?- Y = _X, Z = _X.
    Y = Z.

    Dogelog Player 1.3.2: Pass

    ?- _X = Y, _X = Z.
    Y = Z.
    ?- Y = _X, _X = Z.
    Y = Z.
    ?- _X = Y, Z = _X.
    Y = Z.
    ?- Y = _X, Z = _X.
    Y = Z.

    Mild Shock schrieb:
    Test 1 is probably the most simple test case.
    It is only the following query:

    q(Y, _X) :- _X = Y.

    The projection would be:

    p(Y) :- q(Y, _X).

    ?- p(Y).
    true.

    Here are the testing results:

    Trealla Prolog 2.68.11-5: Pass

    ?- _X = Y.
       true.
    ?- Y = _X.
       true.

    SWI-Prolog 9.3.21: Fail

    ?- _X = Y.
    true.
    ?- Y = _X.
    Y = _X.    %%% expected true

    Dogelog Player 1.3.2: Pass

    ?- _X = Y.
    true.
    ?- Y = _X.
    true.

    Mild Shock schrieb:
    Hi,

    Now I am writing a new Prolog Improvement Proposal
    (PIP), which is PIP-4711: Marked Variables. Can
    we easily specify what marked variables should

    do in the top-level? Oh yes. If you have a query
    that contains unmarked and marked variables,
    just like this here:

    ?- q(N1, .., Nn, _M1, .., _Mm)

    Then the above query should work as:

    p(N1, .., Nn) :- q(N1, .., Nn, _M1, .., _Mm).

    ?- p(N1, .., Nn).

    The above specification assures that no information
    is lost, because it relies on the existential
    quantifier of Clark Completion. One can read the

    definition of q/n logically in first order logic
    as follows, namely with existential quantifiers:

    p(N1, .., Nn) <=> EXISTS(_M1, .., _Mm):q(N1, .., Nn, _M1, .., _Mm)

    Do some Prolog systems satisfy the above specification.
    Amazingly most Prolog systems cannot do it. They
    have problems archiving the above result, in very

    small test cases. The main problem is some permutation
    dependency, how the query q/n+m is formulated. It
    seems most Prolog systems do not use a

    permutation agnostic algorithm, whereas the
    first order logic specification doesn't have some
    permutation dependency and should be immune.

                     Test1   Test2
    Trealla Prolog  Pass    Fail
    SWI-Prolog      Fail    Pass
    Dogelog Player  Pass    Pass

    Bye




    --- Synchronet 3.20c-Linux NewsLink 1.2