• Re: A new foundation for correct reasoning

    From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Fri Dec 5 11:43:41 2025
    From Newsgroup: comp.lang.prolog

    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can
    for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G = not(provable
    (F, G))" can be proven for some F and some G that do not contain cycles.
    The answer is that in the proof system of Prolog it cannot be.


    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?
    --
    Copyright 2025 Olcott

    My 28 year goal has been to make
    "true on the basis of meaning" computable.

    This required establishing a new foundation
    for correct reasoning.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Sat Dec 6 11:30:35 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does not. >>>>
    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can
    for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G = not(provable
    (F, G))" can be proven for some F and some G that do not contain cycles.
    The answer is that in the proof system of Prolog it cannot be.


    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    When "G = not(provable(F, G))." is used as a Prolog goal the
    applied semantics is what Prolog lauguage definition specifies.
    Does "semantically sound" mean something in that context?

    At least your Prolog interpretation finds it meaningful. It determines
    that the excution of that goal succeeds and assigns a value G but not
    to F.
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Sat Dec 6 06:50:22 2025
    From Newsgroup: comp.lang.prolog

    On 12/6/2025 3:30 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does not. >>>>>
    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = not(provable( >>> F, G))" can be proven for some F and some G. The answer is that it can
    for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G = not(provable >>> (F, G))" can be proven for some F and some G that do not contain cycles. >>> The answer is that in the proof system of Prolog it cannot be.


    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    When "G = not(provable(F, G))." is used as a Prolog goal the
    applied semantics is what Prolog lauguage definition specifies.
    Does "semantically sound" mean something in that context?

    At least your Prolog interpretation finds it meaningful. It determines
    that the excution of that goal succeeds and assigns a value G but not
    to F.


    Is this sentence true or false:
    "This sentence is not true"
    It is not semantically sound.

    Is this sentence true or false:
    "This sentence cannot be proved"
    It is not semantically sound.
    --
    Copyright 2025 Olcott

    My 28 year goal has been to make
    "true on the basis of meaning" computable.

    This required establishing a new foundation
    for correct reasoning.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Sun Dec 7 13:02:57 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 6.12.2025 klo 14.50:
    On 12/6/2025 3:30 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does >>>>>>>> not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can >>>> for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain
    cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    When "G = not(provable(F, G))." is used as a Prolog goal the
    applied semantics is what Prolog lauguage definition specifies.
    Does "semantically sound" mean something in that context?

    At least your Prolog interpretation finds it meaningful. It determines
    that the excution of that goal succeeds and assigns a value G but not
    to F.

    Is this sentence true or false:
    "This sentence is not true"
    It is not semantically sound.

    Formal systems we usually use have no expression for "this".
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Mon Dec 8 11:13:00 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does not. >>>>
    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can
    for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G = not(provable
    (F, G))" can be proven for some F and some G that do not contain cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Mon Dec 8 13:09:41 2025
    From Newsgroup: comp.lang.prolog

    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does not. >>>>>
    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = not(provable( >>> F, G))" can be proven for some F and some G. The answer is that it can
    for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G = not(provable >>> (F, G))" can be proven for some F and some G that do not contain cycles. >>> The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?


    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning" computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Mon Dec 8 13:49:38 2025
    From Newsgroup: comp.lang.prolog

    On 12/7/2025 5:02 AM, Mikko wrote:
    olcott kirjoitti 6.12.2025 klo 14.50:
    On 12/6/2025 3:30 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does >>>>>>>>> not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can >>>>> for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain
    cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    When "G = not(provable(F, G))." is used as a Prolog goal the
    applied semantics is what Prolog lauguage definition specifies.
    Does "semantically sound" mean something in that context?

    At least your Prolog interpretation finds it meaningful. It determines
    that the excution of that goal succeeds and assigns a value G but not
    to F.

    Is this sentence true or false:
    "This sentence is not true"
    It is not semantically sound.

    Formal systems we usually use have no expression for "this".


    Yes that is the why I created Minimal Type Theory.
    There is no reason why encoding "this" should
    require dozens of different formulas.
    LP := ~True(LP) // says: "this sentence says itself is not true"
    G := ~Provable(G) // says: "this sentence says itself is not provable".
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning" computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Wed Dec 10 12:04:06 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does >>>>>>>> not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can >>>> for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain
    cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Wed Dec 10 08:10:58 2025
    From Newsgroup: comp.lang.prolog

    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter does >>>>>>>>> not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that it can >>>>> for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain
    cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.


    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable. END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning expressed in language"<br>
    reliably computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Python@python@cccp.invalid to comp.theory,sci.logic,sci.math,comp.lang.prolog on Wed Dec 10 15:01:05 2025
    From Newsgroup: comp.lang.prolog

    Le 10/12/2025 à 15:11, olcott a écrit :
    ..
    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.


    unify_with_occurs_check(G, not(provable(F, G))). returning false does NOT prove that
    G = not(provable(F, G)) “gets stuck in infinite recursion.”

    All it proves is this:

    With finite Prolog terms, you cannot unify a variable with a structure
    that contains that same variable — the occurs-check rejects cyclic self-reference.

    So the failure of unification means only:

    Prolog refuses to build an illegal self-referential term,

    not that the logical statement or predicate would “infinitely
    recurse.”

    This is the usual Olcott confusion:
    he mistakes a language-specific operational failure (Prolog term
    construction) for a deep theorem about provability or self-reference.

    Gödel diagonalization never uses this kind of naive unification, so the Prolog failure is irrelevant to logic.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@tristan.wibberley+netnews2@alumni.manchester.ac.uk to comp.theory,sci.logic,sci.math,comp.lang.prolog on Wed Dec 10 18:10:12 2025
    From Newsgroup: comp.lang.prolog

    On 10/12/2025 14:10, olcott wrote:

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    ...

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate unify_with_occurs_check/2 is used explicitly instead of the normal unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable. END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg: Springer-Verlag.


    You're a veritable treasure-trove.
    --
    Tristan Wibberley

    The message body is Copyright (C) 2025 Tristan Wibberley except
    citations and quotations noted. All Rights Reserved except that you may,
    of course, cite it academically giving credit to me, distribute it
    verbatim as part of a usenet system or its archives, and use it to
    promote my greatness and general superiority without misrepresentation
    of my opinions other than my opinion of my greatness and general
    superiority which you _may_ misrepresent. You definitely MAY NOT train
    any production AI system with it but you may train experimental AI that
    will only be used for evaluation of the AI methods it implements.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Wed Dec 10 14:01:54 2025
    From Newsgroup: comp.lang.prolog

    On 12/10/2025 12:10 PM, Tristan Wibberley wrote:
    On 10/12/2025 14:10, olcott wrote:

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    ...

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate
    unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable.
    END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.


    You're a veritable treasure-trove.


    You seem to have proved to know this material quite well.
    Of people that visit this forum you seem to be in the top 10%.
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning expressed in language"<br>
    reliably computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Thu Dec 11 10:42:16 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter >>>>>>>>>> does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means. >>>>>>
    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that it >>>>>> can
    for every F and for (at least) one G, which is not(provable(G)).

    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain
    cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate unify_with_occurs_check/2 is used explicitly instead of the normal unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable. END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg: Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Thu Dec 11 08:17:40 2025
    From Newsgroup: comp.lang.prolog

    On 12/11/2025 2:42 AM, Mikko wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))).
    are different. The former assigns a value to G, the latter >>>>>>>>>>> does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means. >>>>>>>
    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that >>>>>>> it can
    for every F and for (at least) one G, which is not(provable(G)). >>>>>>>
    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain >>>>>>> cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate
    unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable.
    END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.


    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    As I say non-terminating, thus never resolves to a truth value.
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning expressed in language"<br>
    reliably computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@tristan.wibberley+netnews2@alumni.manchester.ac.uk to comp.theory,sci.logic,sci.math,comp.lang.prolog on Thu Dec 11 23:28:16 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 10.12.2025 klo 16.10:

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.

    On 11/12/2025 14:17, olcott wrote:

    As I say non-terminating, thus never resolves to a truth value.


    $ export S='G=foo(G).'; gprolog <<<"$S"; swipl <<<"$S"
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 23 2020, 20:14:50 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2020 Daniel Diaz
    | ?-

    cannot display cyclic term for G

    yes
    | ?-
    Welcome to SWI-Prolog (threaded, 64 bits, version 8.4.2)
    SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
    Please run ?- license. for legal details.

    For online help and background, visit https://www.swi-prolog.org
    For built-in help, use ?- help(Topic). or ?- apropos(Word).

    G = foo(G).


    % halt
    --
    Tristan Wibberley

    The message body is Copyright (C) 2025 Tristan Wibberley except
    citations and quotations noted. All Rights Reserved except that you may,
    of course, cite it academically giving credit to me, distribute it
    verbatim as part of a usenet system or its archives, and use it to
    promote my greatness and general superiority without misrepresentation
    of my opinions other than my opinion of my greatness and general
    superiority which you _may_ misrepresent. You definitely MAY NOT train
    any production AI system with it but you may train experimental AI that
    will only be used for evaluation of the AI methods it implements.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Thu Dec 11 17:49:10 2025
    From Newsgroup: comp.lang.prolog

    On 12/11/2025 5:28 PM, Tristan Wibberley wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.

    On 11/12/2025 14:17, olcott wrote:

    As I say non-terminating, thus never resolves to a truth value.


    $ export S='G=foo(G).'; gprolog <<<"$S"; swipl <<<"$S"
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 23 2020, 20:14:50 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2020 Daniel Diaz
    | ?-

    cannot display cyclic term for G

    yes
    | ?-
    Welcome to SWI-Prolog (threaded, 64 bits, version 8.4.2)
    SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
    Please run ?- license. for legal details.

    For online help and background, visit https://www.swi-prolog.org
    For built-in help, use ?- help(Topic). or ?- apropos(Word).

    G = foo(G).


    % halt


    Run SWI-Prolog
    paste "G = not(provable(F, G))."
    at the ?- prompt ending up this:
    ?- G = not(provable(F, G)).

    Then you hit return and get this:
    G = not(provable(F, G)).

    Then you past this: "unify_with_occurs_check(G, not(provable(F, G)))."
    at the next ?- prompt and get this
    ?- unify_with_occurs_check(G, not(provable(F, G))).

    You hit return and get this:
    false

    *It all ends up looking like this*
    *It all ends up looking like this*
    *It all ends up looking like this*

    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning expressed in language"<br>
    reliably computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Richard Damon@Richard@Damon-Family.org to comp.theory,sci.logic,sci.math,comp.lang.prolog on Thu Dec 11 19:52:56 2025
    From Newsgroup: comp.lang.prolog

    On 12/11/25 6:49 PM, olcott wrote:
    On 12/11/2025 5:28 PM, Tristan Wibberley wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.

    On 11/12/2025 14:17, olcott wrote:

    As I say non-terminating, thus never resolves to a truth value.


    $ export S='G=foo(G).'; gprolog <<<"$S"; swipl <<<"$S"
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 23 2020, 20:14:50 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2020 Daniel Diaz
    | ?-

    cannot display cyclic term for G

    yes
    | ?-
    Welcome to SWI-Prolog (threaded, 64 bits, version 8.4.2)
    SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
    Please run ?- license. for legal details.

    For online help and background, visit https://www.swi-prolog.org
    For built-in help, use ?- help(Topic). or ?- apropos(Word).

    G = foo(G).


    % halt


    Run SWI-Prolog
    paste "G = not(provable(F, G))."
    at the ?- prompt ending up this:
    ?- G = not(provable(F, G)).

    Then you hit return and get this:
    G = not(provable(F, G)).

    Then you past this: "unify_with_occurs_check(G, not(provable(F, G)))."
    at the next ?- prompt and get this
    ?- unify_with_occurs_check(G, not(provable(F, G))).

    You hit return and get this:
    false

    *It all ends up looking like this*
    *It all ends up looking like this*
    *It all ends up looking like this*

    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.



    Which, since that is NOT the definition of G, only a derived meaning,
    says you are just showing your reckless stupidity and total ignorance of
    what you are talking about.

    Part of the problem is that you are trying to express in Prolog, a
    statement in a logic system more complicated then what Prolog can handle.

    For instamce. Try righting the non-pathological sentence that P is
    defined to be the tautology that P is true if and only if P is true.

    Since that definition of P refers to the statement of P itself, you will
    also get a unify_with_occurs_check error there too.

    Prolog just can't handle that form of statement.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Fri Dec 12 10:50:14 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 11.12.2025 klo 16.17:
    On 12/11/2025 2:42 AM, Mikko wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))). >>>>>>>>>>>> are different. The former assigns a value to G, the latter >>>>>>>>>>>> does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable means. >>>>>>>>
    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that >>>>>>>> it can
    for every F and for (at least) one G, which is not(provable(G)). >>>>>>>>
    The second query can be regarded as a question whether "G =
    not(provable
    (F, G))" can be proven for some F and some G that do not contain >>>>>>>> cycles.
    The answer is that in the proof system of Prolog it cannot be.

    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate
    unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable.
    END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    As I say non-terminating, thus never resolves to a truth value.

    As according to Prolog rules foo(Y) isn't a truth value for any Y
    the above is obviously just an attempt to deive with a distraction.
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory,sci.logic,sci.math,comp.lang.prolog on Fri Dec 12 08:19:10 2025
    From Newsgroup: comp.lang.prolog

    On 12/12/2025 2:50 AM, Mikko wrote:
    olcott kirjoitti 11.12.2025 klo 16.17:
    On 12/11/2025 2:42 AM, Mikko wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))). >>>>>>>>>>>>> are different. The former assigns a value to G, the latter >>>>>>>>>>>>> does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable >>>>>>>>>>> means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G =
    not(provable(
    F, G))" can be proven for some F and some G. The answer is that >>>>>>>>> it can
    for every F and for (at least) one G, which is not(provable(G)). >>>>>>>>>
    The second query can be regarded as a question whether "G = >>>>>>>>> not(provable
    (F, G))" can be proven for some F and some G that do not
    contain cycles.
    The answer is that in the proof system of Prolog it cannot be. >>>>>>>>
    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate
    unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable.
    END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    As I say non-terminating, thus never resolves to a truth value.

    As according to Prolog rules foo(Y) isn't a truth value for any Y
    the above is obviously just an attempt to deive with a distraction.


    That was a quote from the most definitive source
    for the Prolog Language.

    Prolog only has Facts and Rules thus the only
    derivation is to a truth value.
    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning expressed in language"<br>
    reliably computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Richard Damon@Richard@Damon-Family.org to comp.theory,sci.logic,sci.math,comp.lang.prolog on Fri Dec 12 09:24:16 2025
    From Newsgroup: comp.lang.prolog

    On 12/12/25 9:19 AM, olcott wrote:
    On 12/12/2025 2:50 AM, Mikko wrote:
    olcott kirjoitti 11.12.2025 klo 16.17:
    On 12/11/2025 2:42 AM, Mikko wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))). >>>>>>>>>>>>>> are different. The former assigns a value to G, the latter >>>>>>>>>>>>>> does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable >>>>>>>>>>>> means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = >>>>>>>>>> not(provable(
    F, G))" can be proven for some F and some G. The answer is >>>>>>>>>> that it can
    for every F and for (at least) one G, which is not(provable(G)). >>>>>>>>>>
    The second query can be regarded as a question whether "G = >>>>>>>>>> not(provable
    (F, G))" can be proven for some F and some G that do not
    contain cycles.
    The answer is that in the proof system of Prolog it cannot be. >>>>>>>>>
    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate
    unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable.
    END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    As I say non-terminating, thus never resolves to a truth value.

    As according to Prolog rules foo(Y) isn't a truth value for any Y
    the above is obviously just an attempt to deive with a distraction.


    That was a quote from the most definitive source
    for the Prolog Language.

    Prolog only has Facts and Rules thus the only
    derivation is to a truth value.


    But Prolog also can't handle full first order logic, so isn't a valid
    model of such a logic system.

    Of course, it seems it handles a superset of the logic you can handle,
    so you think it is great, but that just shows your own problem.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mikko@mikko.levanto@iki.fi to comp.theory,sci.logic,sci.math,comp.lang.prolog on Sat Dec 13 12:19:37 2025
    From Newsgroup: comp.lang.prolog

    olcott kirjoitti 12.12.2025 klo 16.19:
    On 12/12/2025 2:50 AM, Mikko wrote:
    olcott kirjoitti 11.12.2025 klo 16.17:
    On 12/11/2025 2:42 AM, Mikko wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))). >>>>>>>>>>>>>> are different. The former assigns a value to G, the latter >>>>>>>>>>>>>> does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable >>>>>>>>>>>> means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = >>>>>>>>>> not(provable(
    F, G))" can be proven for some F and some G. The answer is >>>>>>>>>> that it can
    for every F and for (at least) one G, which is not(provable(G)). >>>>>>>>>>
    The second query can be regarded as a question whether "G = >>>>>>>>>> not(provable
    (F, G))" can be proven for some F and some G that do not
    contain cycles.
    The answer is that in the proof system of Prolog it cannot be. >>>>>>>>>
    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G))
    to a truth value true. When doing so it evaluated each side of =
    to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated
    subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that
    wherever an occurs check might be applicable the built-in predicate
    unify_with_occurs_check/2 is used explicitly instead of the normal
    unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable.
    END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    As I say non-terminating, thus never resolves to a truth value.

    As according to Prolog rules foo(Y) isn't a truth value for any Y
    the above is obviously just an attempt to deive with a distraction.

    That was a quote from the most definitive source
    for the Prolog Language.

    As I already said, that source agrees with what I said above.

    Prolog only has Facts and Rules thus the only
    derivation is to a truth value.

    Not true. Prolog also has term expressions that can be used in facts
    and rules. In particular, in the goal G = not(provable(F, G)) the
    symbol G is a term expression and provable(F, G) is another term
    expression. A goal is evaluated to a truth value but if that truth
    value is true the values of variables (if there are any) are also
    evalueted to values that are not truth values. In the example
    ?- G = not(provable(F, G)).
    the answer
    G = not(provable(F, G)).
    mans that the Prolog implementation evaluated the query to true and
    the variable G to the expression not(provable(F, G)). The quoted
    text says that another Prolog implementation may interprethe the
    same query differently.

    The quoted text does not stay unify_with_occurs_check/2 would reject
    anything as "semntically unsound". First of all, it nas no consequences
    unless it is used. Secondly, if the result of unification would be
    that at a cycle be created then it simpy evaluates to false just
    like unify_with_occurs_check(1, 2) evaluates to false.
    --
    Mikko
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.lang.prolog,comp.theory,sci.logic,sci.math on Sat Dec 13 08:43:27 2025
    From Newsgroup: comp.lang.prolog

    On 12/13/2025 4:19 AM, Mikko wrote:
    olcott kirjoitti 12.12.2025 klo 16.19:
    On 12/12/2025 2:50 AM, Mikko wrote:
    olcott kirjoitti 11.12.2025 klo 16.17:
    On 12/11/2025 2:42 AM, Mikko wrote:
    olcott kirjoitti 10.12.2025 klo 16.10:
    On 12/10/2025 4:04 AM, Mikko wrote:
    olcott kirjoitti 8.12.2025 klo 21.09:
    On 12/8/2025 3:13 AM, Mikko wrote:
    olcott kirjoitti 5.12.2025 klo 19.43:
    On 12/5/2025 3:38 AM, Mikko wrote:
    olcott kirjoitti 4.12.2025 klo 16.06:
    On 12/4/2025 2:58 AM, Mikko wrote:
    Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:
    On 30/11/2025 09:58, Mikko wrote:

    Note that the meanings of
      ?- G = not(provable(F, G)).
    and
      ?- unify_with_occurs_check(G, not(provable(F, G))). >>>>>>>>>>>>>>> are different. The former assigns a value to G, the >>>>>>>>>>>>>>> latter does not.

    For sufficiently informal definitions of "value".
    And for sufficiently wrong ones too!

    It is sufficiently clear what "value" of a Prolog variable >>>>>>>>>>>>> means.

    % This sentence cannot be proven in F
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    I would say that the above Prolog is the 100%
    complete formal specification of:

    "This sentence cannot be proven in F"

    The first query can be regarded as a question whether "G = >>>>>>>>>>> not(provable(
    F, G))" can be proven for some F and some G. The answer is >>>>>>>>>>> that it can
    for every F and for (at least) one G, which is not(provable(G)). >>>>>>>>>>>
    The second query can be regarded as a question whether "G = >>>>>>>>>>> not(provable
    (F, G))" can be proven for some F and some G that do not >>>>>>>>>>> contain cycles.
    The answer is that in the proof system of Prolog it cannot be. >>>>>>>>>>
    No that it flatly incorrect. The second question is this:
    Is "G = not(provable(F, G))." semantically sound?

    Where is the definition of Prolog semantics is that said?

    Any expression of Prolog that cannot be evaluated to
    a truth value because it specifies non-terminating
    infinite recursion is "semantically unsound" by the
    definition of those terms even if Prolog only specifies
    that cannot be evaluated to a truth value because it
    specifies non-terminating infinite recursion.

    Your Prolog implementation has evaluated G = not(provablel(F, G)) >>>>>>> to a truth value true. When doing so it evaluated each side of = >>>>>>> to a value that is not a truth value.

    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    Proves that
    G = not(provable(F, G)).
    would remain stuck in infinite recursion.

    unify_with_occurs_check() examines the directed
    graph of the evaluation sequence of an expression.
    When it detects a cycle that indicates that an
    expression would remain stuck in recursive
    evaluation never to be resolved to a truth value.

    BEGIN:(Clocksin & Mellish 2003:254)
    Finally, a note about how Prolog matching sometimes differs
    from the unification used in Resolution. Most Prolog systems
    will allow you to satisfy goals like:

    equal(X, X).
    ?- equal(foo(Y), Y).

    that is, they will allow you to match a term against an
    uninstantiated subterm of itself. In this example, foo(Y)
    is matched against Y, which appears within it. As a result,
    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    So Y ends up standing for some kind of infinite structure.

    Note that, whereas they may allow you to construct something
    like this, most Prolog systems will not be able to write it
    out at the end. According to the formal definition of
    Unification, this kind of “infinite term” should never come
    to exist. Thus Prolog systems that allow a term to match an
    uninstantiated subterm of itself do not act correctly as
    Resolution theorem provers. In order to make them do so, we
    would have to add a check that a variable cannot be
    instantiated to something containing itself. Such a check,
    an occurs check, would be straightforward to implement, but
    would slow down the execution of Prolog programs considerably.
    Since it would only affect very few programs, most implementors
    have simply left it out 1.

    1 The Prolog standard states that the result is undefined if
    a Prolog system attempts to match a term against an uninstantiated >>>>>> subterm of itself, which means that programs which cause this to
    happen will not be portable. A portable program should ensure that >>>>>> wherever an occurs check might be applicable the built-in predicate >>>>>> unify_with_occurs_check/2 is used explicitly instead of the normal >>>>>> unification operation of the Prolog implementation. As its name
    suggests, this predicate acts like =/2 except that it fails if an
    occurs check detects an illegal attempt to instantiate a variable. >>>>>> END:(Clocksin & Mellish 2003:254)

    Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog
    Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:
    Springer-Verlag.

    Thank you for the confirmation of my explanation of your error.

    Y will stand for foo(Y), which is foo(foo(Y)) (because of
    what Y stands for), which is foo(foo(foo(Y))), and so on.
    As I say non-terminating, thus never resolves to a truth value.

    As according to Prolog rules foo(Y) isn't a truth value for any Y
    the above is obviously just an attempt to deive with a distraction.

    That was a quote from the most definitive source
    for the Prolog Language.

    As I already said, that source agrees with what I said above.

    Prolog only has Facts and Rules thus the only
    derivation is to a truth value.


    You just don't seem to understand:
    ?- G = not(provable(F, G)).
    G = not(provable(F, G)).
    ?- unify_with_occurs_check(G, not(provable(F, G))).
    false.

    The first statement creates a cyclic term, also called
    a rational tree. The second executes logically sound
    unification and thus fails. https://www.swi-prolog.org/pldoc/man?predicate=unify_with_occurs_check/2

    The only reason why I understand it so
    well is that I had to build it from scratch.

    Here it is in more conventional Prolog terms:
    The evaluation of a cyclic term creates an infinite loop.
    The evaluation of an acyclic term does not create an infinite loop.

    LP := ~True(LP) // LP <is defined as> ~True(LP)
    00 ~ 01
    01 True 00
    For Olcott's Minimal Type Theory I say
    that there is a cycle in the directed graph
    of the evaluation sequence of LP.

    Not true. Prolog also has term expressions that can be used in facts
    and rules. In particular, in the goal G = not(provable(F, G)) the
    symbol G is a term expression and provable(F, G) is another term
    expression. A goal is evaluated to a truth value but if that truth
    value is true the values of variables (if there are any) are also
    evalueted to values that are not truth values. In the example
      ?- G = not(provable(F, G)).
    the answer
      G = not(provable(F, G)).
    mans that the Prolog implementation evaluated the query to true and
    the variable G to the expression not(provable(F, G)). The quoted
    text says that another Prolog implementation may interprethe the
    same query differently.

    The quoted text does not stay unify_with_occurs_check/2 would reject
    anything as "semntically unsound". First of all, it nas no consequences unless it is used. Secondly, if the result of unification would be
    that at a cycle be created then it simpy evaluates to false just
    like unify_with_occurs_check(1, 2) evaluates to false.

    --
    Copyright 2025 Olcott<br><br>

    My 28 year goal has been to make <br>
    "true on the basis of meaning expressed in language"<br>
    reliably computable.<br><br>

    This required establishing a new foundation<br>
    --- Synchronet 3.21a-Linux NewsLink 1.2