• Re: Semantic properties of finite string inputs

    From Kaz Kylheku@[email protected] to comp.theory on Sun Nov 2 22:26:56 2025
    From Newsgroup: comp.theory

    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't
    be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Sun Nov 2 22:32:12 2025
    From Newsgroup: comp.theory

    On 2025-11-01, olcott <[email protected]> wrote:
    On 11/1/2025 5:59 PM, Kaz Kylheku wrote:
    On 2025-11-01, Tristan Wibberley <[email protected]> wrote:
    On 01/11/2025 22:19, Kaz Kylheku wrote:
    To trace D, we need a definition of H.

    The situation statement is a constraint on H, it almost defines a puzzle >>> which may have solutions in H. Given the phrasing and the newsgroup I
    think that's what Olcott was going for.

    That is /you/ the /puzzled/ provides the H!

    Coming up with the tracing H which aborts its simulation is
    Olcott's job.

    He did that with the "x86utm", and that has been shot down.


    It has not been shot down.

    You are no longer accepting results produced using the x86utm.

    Therefore, you must not ask others to accept results producing
    the x86utm.

    When-so-ever you present x86utm traces to someone, they must tell you
    you are wrong unless you can show that in some other way (such as
    using nothing but C, perhaps).

    The x86utm is effectively no more.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From James Kuyper@[email protected] to comp.theory,comp.lang.c on Sun Nov 2 20:49:51 2025
    From Newsgroup: comp.theory

    On 2025-11-01 16:36, Tristan Wibberley wrote:
    On 01/11/2025 02:32, Richard Damon wrote:
    On 10/31/25 3:57 PM, Tristan Wibberley wrote:
    On 31/10/2025 18:06, Richard Damon wrote:
    [H and H1] fail to be correct C
    interpreters, as the code has a required diagnostic.

    Really? even in K&R C?

    Yep, the link step will fail as H and H1 are not defined.

    Is "link step" defined in K&R C?

    Not in the first edition. Section 11.2 mentions that a program can be
    made up of many files, and that declarations with external linkage can
    refer to something defined in a different file, but that's about all
    they say about it.

    When the language was standardized, a lot more thought was put into it.
    In C89, Section 2.1.1.2 describes the phases of translation of a
    program, and phase 8 is described the link step (though it does not name
    it as such): "All external object and function references are resolved.
    Library components are linked to satisfy external references to
    functions and objects not defined in the current translation. All such translator output is collected into a program image which contains
    information needed for execution in its execution environment."

    In the second edition, K&R was brought into line with the latest draft
    version of what would become C89. As a result, A.12 contains the
    following simplified version of that specification: "The result is
    translated, then linked together with other programs and libraries, by collecting the necessary programs and data, and connecting external
    functions and object references to their definitions."


    The compiler can provide definitions for H--which is the only symbol
    missing a definition in the situation statement, IIRC--/to satisfy the situation/.

    C89 3.7 says "... If an identifier declared with external linkage is
    used in an expression (other than as part of the operand of a sizeof
    operator), somewhere in the entire program there shall be exactly one
    external definition for the identifier; otherwise, there shall be no
    more than one."

    Violation of a "shall" that occurs outside of a constraints section
    means that the behavior is undefined, which in turn means that the C
    standard imposes no requirements on the behavior of such a program. No diagnostic is required, nor is the translation required to fail, so
    Richard is wrong on those points.
    Because the behavior is undefined, anything is permitted, including
    providing a definition of H when the program itself contains none - but
    it most certainly isn't required to do so, and I doubt that any normal C compiler would do so.

    I try my best to avoid olcott messages. Does he specify that his
    nonsense requires an implementation that takes advantage of undefined
    behavior in that fashion?
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Richard Damon@[email protected] to comp.theory,comp.lang.c on Sun Nov 2 22:44:35 2025
    From Newsgroup: comp.theory

    On 11/2/25 8:49 PM, James Kuyper wrote:
    On 2025-11-01 16:36, Tristan Wibberley wrote:
    On 01/11/2025 02:32, Richard Damon wrote:
    On 10/31/25 3:57 PM, Tristan Wibberley wrote:
    On 31/10/2025 18:06, Richard Damon wrote:
    [H and H1] fail to be correct C
    interpreters, as the code has a required diagnostic.

    Really? even in K&R C?

    Yep, the link step will fail as H and H1 are not defined.

    Is "link step" defined in K&R C?

    Not in the first edition. Section 11.2 mentions that a program can be
    made up of many files, and that declarations with external linkage can
    refer to something defined in a different file, but that's about all
    they say about it.

    When the language was standardized, a lot more thought was put into it.
    In C89, Section 2.1.1.2 describes the phases of translation of a
    program, and phase 8 is described the link step (though it does not name
    it as such): "All external object and function references are resolved. Library components are linked to satisfy external references to
    functions and objects not defined in the current translation. All such translator output is collected into a program image which contains information needed for execution in its execution environment."

    In the second edition, K&R was brought into line with the latest draft version of what would become C89. As a result, A.12 contains the
    following simplified version of that specification: "The result is translated, then linked together with other programs and libraries, by collecting the necessary programs and data, and connecting external
    functions and object references to their definitions."


    The compiler can provide definitions for H--which is the only symbol
    missing a definition in the situation statement, IIRC--/to satisfy the
    situation/.

    C89 3.7 says "... If an identifier declared with external linkage is
    used in an expression (other than as part of the operand of a sizeof operator), somewhere in the entire program there shall be exactly one external definition for the identifier; otherwise, there shall be no
    more than one."

    Violation of a "shall" that occurs outside of a constraints section
    means that the behavior is undefined, which in turn means that the C
    standard imposes no requirements on the behavior of such a program. No diagnostic is required, nor is the translation required to fail, so
    Richard is wrong on those points.
    Because the behavior is undefined, anything is permitted, including
    providing a definition of H when the program itself contains none - but
    it most certainly isn't required to do so, and I doubt that any normal C compiler would do so.

    I try my best to avoid olcott messages. Does he specify that his
    nonsense requires an implementation that takes advantage of undefined behavior in that fashion?

    No, and in fact, he claims to use the results defined by the language
    (and thus by the meaning of the words, not just the implementation),
    which is one reason his arguement fails.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Richard Damon@[email protected] to comp.theory,comp.lang.c on Sun Nov 2 22:48:04 2025
    From Newsgroup: comp.theory

    On 11/1/25 4:36 PM, Tristan Wibberley wrote:
    On 01/11/2025 02:32, Richard Damon wrote:
    On 10/31/25 3:57 PM, Tristan Wibberley wrote:
    On 31/10/2025 18:06, Richard Damon wrote:
    [H and H1] fail to be correct C
    interpreters, as the code has a required diagnostic.

    Really? even in K&R C?

    Yep, the link step will fail as H and H1 are not defined.

    Is "link step" defined in K&R C?

    Not explicitly, but K&R C is not actually a full langauge description.

    His program would fail to run on any of the "reference implementations"
    of that era, or for that matter, any era.


    The compiler can provide definitions for H--which is the only symbol
    missing a definition in the situation statement, IIRC--/to satisfy the situation/.

    Not in K&R C, as he defines what functions his implementation provides.


    Olcott: it might help to say, instead of that H and H1 are anchored in
    the interpreter, that the interpreter defines the symbol "H", if that is
    what you mean for your situation (I think it is but also my C
    terminology is rusty). I expect Kaz will know, he's a real dab-hand.

    But then he has to admit that they have an actual specific definition, something he needs to avoid as his logic REQUIRES H to be flexable to be any/all of the members of an infinte set, which makes it sort of hard to
    call.


    --
    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 Mikko@[email protected] to comp.theory on Mon Nov 3 12:05:32 2025
    From Newsgroup: comp.theory

    On 2025-11-02 13:29:15 +0000, olcott said:

    On 11/2/2025 6:17 AM, Mikko wrote:
    On 2025-11-01 13:25:41 +0000, olcott said:

    On 11/1/2025 3:42 AM, Mikko wrote:
    On 2025-10-31 12:44:17 +0000, olcott said:

    On 10/31/2025 6:28 AM, Mikko wrote:
    On 2025-10-30 14:49:08 +0000, olcott said:

    D simulated by H measures the semantic property
    of the actual input as opposed to and contrast
    with the semantic property of a non-input. H and
    H1 are identical except that D does not call H1.

    Being identical means that H and H1 compute the same semantic
    property.


    int D()
    {
       int Halt_Status = H(D);
       if (Halt_Status)
         HERE: goto HERE;
       return Halt_Status;
    }

    H simulates D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    until H sees this repeating pattern
    Then H returns 0;

    H1 simulates D
    that calls H(D) to simulate D
    then H(D) returns 0 to caller D
    then H1 returns 1;

    It turns out that my big discovery the overturns
    part of the foundation of computer science is that
    the semantic property can be relative to the decider.

    It actually always relative to the decider yet this
    has never made any difference with non-self-referential
    inputs. H(D) != UTM(D) == H1(D)

    The halting problem has always been an issue where
    the halt decider has never been smart enough to
    figure out halting for self-contradictory inputs.
    That never has been the real issue.

    int D()
    {
       int Halt_Status = H(D);
       if (Halt_Status)
         HERE: goto HERE;
       return Halt_Status;
    }

    With a simulating halt decider D simulated by
    H never reaches the contradictory part. It
    stays stuck on its first line.

    H and D do get stuck in recursive simulation. H
    can and does see this. H does abort its own simulation
    of D to prevent its own non-termination.

    The real issue (that could not be seen until I created
    the notion of a simulating halt decider in 2016) is
    that the halting problem requires H to report on
    behavior other than the behavior that its actual input
    actually specifies.

    int sum(int x, int y){ return x + y; }
    this is the same as requiring sum(3,4) to report on
    the sum of 5 + 6.


    We can tell an input from a non-input because an
    input is an argument to the function H.

    D.input_to_H
    specifies different behavior than
    D.input_to_H1.

    int D()
    {
       int Halt_Status = H(D);
       if (Halt_Status)
         HERE: goto HERE;
       return Halt_Status;
    }

    H simulates D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    that calls H(D) to simulate D
    until H sees this repeating pattern
    Then H returns 0;

    H1 simulates D
    that calls H(D) to simulate D
    then H(D) returns 0 to caller D
    then H1 returns 1;

    As H and H1 return different values for the same input they are
    found to be non-identical, contrary to the initial claim.

    The above confirms that H and H1 give different results for the same
    input. By the meanngs of the words H and H1 are not equivalent.

    I never claimed that the were equivalent.

    You said they be identical. If they are not equivlaent they can't
    be identical.

    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Identical codes mean the same and specify identical behaviours.
    --
    Mikko

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Mon Nov 3 09:15:12 2025
    From Newsgroup: comp.theory

    On 11/3/2025 8:03 AM, joes wrote:
    Am Thu, 30 Oct 2025 08:08:12 -0500 schrieb olcott:
    On 10/30/2025 5:10 AM, Mikko wrote:
    On 2025-10-29 16:41:32 +0000, olcott said:
    On 10/29/2025 5:35 AM, Mikko wrote:

    To determine that DD halts is not merely possible but easy. Just
    simulate it until it halts (which doesn't take a long time) and there >>>>> it is. The same with any other camputaion that halts, though the time >>>>> to find out may be longer.

    H simulates D that calls H(D) to simulate D that calls H(D) to
    simulate D that calls H(D) to simulate D that calls H(D) to simulate D >>>> that calls H(D) to simulate D until H sees this repeating pattern.

    And what happens if it sees?

    D simulated by H according to the semantics of the C programming
    language until H correctly determines that its simulated D cannot
    possibly reach its own simulated "return" statement correctly rejects D
    on this basis not some other basis.
    Make sure that you see the word "until"

    Yes, and then what?


    Termination analyzer H correctly rejects input
    D as not possibly reaching is own "return"
    statement final halt state.

    The semantic property of the finite string
    input specifies non-halting behavior.

    The semantic property of a finite string input
    is an adaptation of Rice's Theorem:

    In computability theory, Rice's theorem states
    that all non-trivial semantic properties of programs
    are undecidable.
    https://en.wikipedia.org/wiki/Rice%27s_theorem

    It refers to programs seeming to mean Turing
    machines while ignoring the fact that Turing
    machines do not take Turing machines as inputs.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@[email protected] to comp.theory on Mon Nov 3 17:16:34 2025
    From Newsgroup: comp.theory

    On 03/11/2025 10:05, Mikko wrote:

    Identical codes mean the same and specify identical behaviours.

    ... with respect to closure.

    --
    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 Tristan Wibberley@[email protected] to comp.theory on Mon Nov 3 17:32:11 2025
    From Newsgroup: comp.theory

    On 03/11/2025 01:49, James Kuyper wrote:
    On 2025-11-01 16:36, Tristan Wibberley wrote:

    The compiler can provide definitions for H--which is the only symbol
    missing a definition in the situation statement, IIRC--/to satisfy the
    situation/.

    C89 3.7 says "... If an identifier declared with external linkage is
    used in an expression (other than as part of the operand of a sizeof operator), somewhere in the entire program there shall be exactly one external definition for the identifier; otherwise, there shall be no
    more than one."

    I think the interpretation of K&R original is that no prototype is as if
    the function were declared with external linkage so the above allows
    defined behaviour when one provides the solution to the situation.

    The C implementation sources other translation units to close the
    definition of the entire program even if the translation unit is
    included within the implementation's program text.

    I'm not sure the solutions to Olcott's situation statement necessarily
    have undefined behaviour following the concerns raised.

    I can see that the situation statement has not defined the external
    definition of H, it has only constrained it but also he is not issuing
    anything as input to a C compiler, but as input to usenet which may
    provide the defining text for the external definition of H to be
    included in the C interpreter as part of a solution to the puzzle. The C interpreter may use it as part of the program.

    It's a difficult challenge and I think we've only scratched the surface
    of its solution.

    --
    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@[email protected] to comp.theory on Mon Nov 3 11:57:34 2025
    From Newsgroup: comp.theory

    On 11/3/2025 11:32 AM, Tristan Wibberley wrote:
    On 03/11/2025 01:49, James Kuyper wrote:
    On 2025-11-01 16:36, Tristan Wibberley wrote:

    The compiler can provide definitions for H--which is the only symbol
    missing a definition in the situation statement, IIRC--/to satisfy the
    situation/.

    C89 3.7 says "... If an identifier declared with external linkage is
    used in an expression (other than as part of the operand of a sizeof
    operator), somewhere in the entire program there shall be exactly one
    external definition for the identifier; otherwise, there shall be no
    more than one."

    I think the interpretation of K&R original is that no prototype is as if
    the function were declared with external linkage so the above allows
    defined behaviour when one provides the solution to the situation.

    The C implementation sources other translation units to close the
    definition of the entire program even if the translation unit is
    included within the implementation's program text.

    I'm not sure the solutions to Olcott's situation statement necessarily
    have undefined behaviour following the concerns raised.

    I can see that the situation statement has not defined the external definition of H, it has only constrained it but also he is not issuing anything as input to a C compiler, but as input to usenet which may
    provide the defining text for the external definition of H to be
    included in the C interpreter as part of a solution to the puzzle. The C interpreter may use it as part of the program.


    Yes finally a voice of reason.

    It's a difficult challenge and I think we've only scratched the surface
    of its solution.

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

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Alan Mackenzie@[email protected] to comp.theory on Mon Nov 3 20:19:30 2025
    From Newsgroup: comp.theory

    Tristan Wibberley <[email protected]> wrote:
    On 03/11/2025 10:05, Mikko wrote:

    Identical codes mean the same and specify identical behaviours.

    ... with respect to closure.

    You've used the word "closure" quite a number of times. What do you
    mean by it? It's beyond my powers of guessing from context.

    Thanks!

    --
    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.
    --
    Alan Mackenzie (Nuremberg, Germany).

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Mon Nov 3 20:43:31 2025
    From Newsgroup: comp.theory

    On 2025-11-02, Kaz Kylheku <[email protected]> wrote:
    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't
    be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?

    Didn't think so.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Mon Nov 3 14:47:11 2025
    From Newsgroup: comp.theory

    On 11/3/2025 2:43 PM, Kaz Kylheku wrote:
    On 2025-11-02, Kaz Kylheku <[email protected]> wrote:
    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't
    be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?

    Didn't think so.


    I have done that hundreds of times and you just ignore it.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Mon Nov 3 21:35:31 2025
    From Newsgroup: comp.theory

    On 2025-11-03, Alan Mackenzie <[email protected]> wrote:
    Tristan Wibberley <[email protected]> wrote:
    On 03/11/2025 10:05, Mikko wrote:

    Identical codes mean the same and specify identical behaviours.

    ... with respect to closure.

    You've used the word "closure" quite a number of times. What do you
    mean by it? It's beyond my powers of guessing from context.

    Tristan also used "dynamic closure".

    Over two decades ago I made a Lisp dialect (called VoqLisp, unrelated to
    TXR Lisp) which had dynamic closures.

    It captured dynamic environments up to a delimiting marker.

    (I didn't know about delimited continuations then; the delimitation
    was eerily similar, but used only for capturing a segment of dynamic
    scope, not the entire activation context.)

    A marker was inserted into the dynamic scope by every function call.
    But nested interpretation constructs wouldn't insert a marker.

    The effect was that the de-facto lexical scope was captured.

    When a lambda was invoked, the captured dynamic environment was grafted
    to the current one, followed by the binding of the parameters.

    Tnus if you had, say

    (let ((*dynamic-var* 42))
    (lambda () (foo)))

    The lambda would capture the dynamic var. When you would call the
    lambda, it would reinstante the *dynamic-var* 42 binding, and
    call (foo).

    But since *dynamic-var* is not actually lexical, foo could
    refer to *dynamic-var* and see the value 42.

    It was nice for writing test cases for an embedded target.

    You could produce configurations using let binding of multiple variables without having to have all of them as parameters to the functions doing
    all the work.

    VoqLisp was multithreaded so this all worked nicely with threads.

    Some test cases launched several threads in one scope, so the
    thread lambdas captured the same variables (same instance).

    There were mutex objects whch the threads used to synchronize,
    e.g.:

    (defun test-foo ()
    (let ((*test-param-a* 42)
    (*test-param-b* "abc")
    (*test-state-variable*)
    (*mutex* (create-mutex)))

    ... create threads here, which execute thread functions
    ... that can see all these varrs: they use the *mutex*
    ... when messing with *test-state-variable*

    )
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@[email protected] to comp.theory on Mon Nov 3 21:36:32 2025
    From Newsgroup: comp.theory

    On 03/11/2025 20:19, Alan Mackenzie wrote:
    Tristan Wibberley <[email protected]> wrote:
    On 03/11/2025 10:05, Mikko wrote:

    Identical codes mean the same and specify identical behaviours.

    ... with respect to closure.

    You've used the word "closure" quite a number of times. What do you
    mean by it? It's beyond my powers of guessing from context.

    Well, we can see it from a couple of perspectives and find the same
    result so I'll avoid the hours of checking what I say and be a bit loose.

    A program (or subprogram) that doesn't define everything itself refers
    to a definition provided elsewhere. In essence, the provision of the
    missing piece is closing with a closure. Some of them are lexical, some dynamic, I'm sure there are other kinds. Personally I also don't see I/O
    as being an awful lot different but I don't know what meaning is
    assigned conventionally everywhere.

    I feel even procedure arguments can be seen as a closure though we tend
    not to talk about them like that in programming as seen conteporarily.

    In formal systems the concept of closure appears when defining its
    objects and it seems to me to be highly related. The meaning of an
    operation that constructs an object is progressively completed by
    applying its arguments until the consequence of the operation is fully specified whereupon it is closed and the arguments were its closure.

    To go further into how it applies here and where it might but isn't
    relevant is a whole essay with lots of care needed, so I won't. I don't
    say this to sound all secretly knowledgable because I'm not, but I mean
    to point to what I think is the relevant concept for understanding
    Olcott's situation statement without saying anything egregiously wrong
    and without taking forever.

    --
    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@[email protected] to comp.theory,comp.lang.c++,comp.lang.c,comp.ai.philosophy on Mon Nov 3 15:48:12 2025
    From Newsgroup: comp.theory

    On 11/3/2025 3:36 PM, Tristan Wibberley wrote:
    On 03/11/2025 20:19, Alan Mackenzie wrote:
    Tristan Wibberley <[email protected]> wrote:
    On 03/11/2025 10:05, Mikko wrote:

    Identical codes mean the same and specify identical behaviours.

    ... with respect to closure.

    You've used the word "closure" quite a number of times. What do you
    mean by it? It's beyond my powers of guessing from context.

    Well, we can see it from a couple of perspectives and find the same
    result so I'll avoid the hours of checking what I say and be a bit loose.

    A program (or subprogram) that doesn't define everything itself refers
    to a definition provided elsewhere. In essence, the provision of the
    missing piece is closing with a closure. Some of them are lexical, some dynamic, I'm sure there are other kinds. Personally I also don't see I/O
    as being an awful lot different but I don't know what meaning is
    assigned conventionally everywhere.

    I feel even procedure arguments can be seen as a closure though we tend
    not to talk about them like that in programming as seen conteporarily.

    In formal systems the concept of closure appears when defining its
    objects and it seems to me to be highly related. The meaning of an
    operation that constructs an object is progressively completed by
    applying its arguments until the consequence of the operation is fully specified whereupon it is closed and the arguments were its closure.

    To go further into how it applies here and where it might but isn't
    relevant is a whole essay with lots of care needed, so I won't. I don't
    say this to sound all secretly knowledgable because I'm not, but I mean
    to point to what I think is the relevant concept for understanding
    Olcott's situation statement without saying anything egregiously wrong
    and without taking forever.


    I tested my terse position statement with the LLM's
    and only Claude AI got it.

    When I got ChatGPT to get it I got ChatGPT to write up
    its understanding so that it would get it right away in
    a future session. Grok didn't quite get this so below
    is the simplest version that they all understand.

    It may simply be that the people here just don't have
    enough attention span to make sure that they pay 100%
    complete attention to ALL of these details.

    int D()
    {
    int Halt_Status = H(D);
    if (Halt_Status)
    HERE: goto HERE;
    return Halt_Status;
    }

    The function H is a simulating termination analyzer:
    (a) Detects a non-terminating behavior pattern:
    abort simulation and return 0.
    (b) Simulated input reaches its simulated
    "return" statement: return 1.

    When given a function P, it literally simulates each
    step of executing P() to see whether that simulated
    execution ever reaches a return statement. Now let H
    simulate D. Based only on the outcome of that literal
    simulation (not on reasoning about what should happen),
    what result should H(D) produce?



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

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Mon Nov 3 21:57:32 2025
    From Newsgroup: comp.theory

    On 2025-11-03, Tristan Wibberley <[email protected]> wrote:
    On 03/11/2025 20:19, Alan Mackenzie wrote:
    Tristan Wibberley <[email protected]> wrote:
    On 03/11/2025 10:05, Mikko wrote:

    Identical codes mean the same and specify identical behaviours.

    ... with respect to closure.

    You've used the word "closure" quite a number of times. What do you
    mean by it? It's beyond my powers of guessing from context.

    Well, we can see it from a couple of perspectives and find the same
    result so I'll avoid the hours of checking what I say and be a bit loose.

    A program (or subprogram) that doesn't define everything itself refers
    to a definition provided elsewhere. In essence, the provision of the
    missing piece is closing with a closure. Some of them are lexical, some dynamic, I'm sure there are other kinds. Personally I also don't see I/O
    as being an awful lot different but I don't know what meaning is
    assigned conventionally everywhere.

    I feel even procedure arguments can be seen as a closure though we tend
    not to talk about them like that in programming as seen conteporarily.

    In formal systems the concept of closure appears when defining its
    objects and it seems to me to be highly related. The meaning of an
    operation that constructs an object is progressively completed by
    applying its arguments until the consequence of the operation is fully specified whereupon it is closed and the arguments were its closure.

    This conjures up the image of applying arguments one at a time to
    a curried function. When we have the last function, everything is
    bound.

    The term "binding" is used for the captured arguments under
    partial application.

    The term "binding" is also used for giving values (arguments) to
    parameters.

    If "binding" can be usd for those two purposes, so can "closure",
    I suppose.

    A function body refers to variables. Some of them are free with respect
    to that body and may refer to a captured surrounding environment, so
    they are bound up in the closure of hat function. Some of those
    variables refer to parameters. Formally we think of those as bound
    variables (not free). But in actual fact, they do not have those
    bindings until the function is applied to arguments.

    When the function is applied to arguments, we can legitimately
    visualise that as the parmeters being added to the closure with
    those argument values.

    The closure is then "complete" in a sense---all variables are
    bound---and the funciton application can proceed with evaluating the
    body.

    It's just that in the conventional terminology, we think of the
    closure as being the bound materials excluding the arguments;
    this allows us to speak of the same closure being reused with
    different argument values.

    Maybe that's a rhetorical disadvantage, concealing that argument values
    can turn a function into something different.

    Anyway, I feel I could easily shift between the different modes of
    discussion.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Mon Nov 3 22:40:45 2025
    From Newsgroup: comp.theory

    On 2025-11-03, olcott <[email protected]> wrote:
    On 11/3/2025 2:43 PM, Kaz Kylheku wrote:
    On 2025-11-02, Kaz Kylheku <[email protected]> wrote:
    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't
    be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?

    Didn't think so.

    I have done that hundreds of times and you just ignore it.

    What? Where? All you ever post these days is useless talk.

    Where is the URL to a project with .c files and a Makefile, etc?
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Mon Nov 3 16:56:11 2025
    From Newsgroup: comp.theory

    On 11/3/2025 4:40 PM, Kaz Kylheku wrote:
    On 2025-11-03, olcott <[email protected]> wrote:
    On 11/3/2025 2:43 PM, Kaz Kylheku wrote:
    On 2025-11-02, Kaz Kylheku <[email protected]> wrote:
    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't
    be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?

    Didn't think so.

    I have done that hundreds of times and you just ignore it.

    What? Where? All you ever post these days is useless talk.

    Where is the URL to a project with .c files and a Makefile, etc?


    Are you saying that you are smart enough to do this:

    On 10/31/2025 7:44 PM, Kaz Kylheku wrote:
    I can write a C interpreter which can interpret itself.

    Yet not smart enough to do a simple execution trace in your head?
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 00:24:30 2025
    From Newsgroup: comp.theory

    On 2025-11-03, olcott <[email protected]> wrote:
    On 11/3/2025 4:40 PM, Kaz Kylheku wrote:
    On 2025-11-03, olcott <[email protected]> wrote:
    On 11/3/2025 2:43 PM, Kaz Kylheku wrote:
    On 2025-11-02, Kaz Kylheku <[email protected]> wrote:
    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't >>>>>>> be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?

    Didn't think so.

    I have done that hundreds of times and you just ignore it.

    What? Where? All you ever post these days is useless talk.

    Where is the URL to a project with .c files and a Makefile, etc?


    Are you saying that you are smart enough to do this:

    On 10/31/2025 7:44 PM, Kaz Kylheku wrote:
    I can write a C interpreter which can interpret itself.

    Yet not smart enough to do a simple execution trace in your head?

    Bleeping idiot, of course it was the "execution trace in my head"
    which led me to the realization that abandoned simulations of D have
    a continuable future which leads to termination.

    But exeution traces in one's head ARE NOT WORTH A FUCK. You have
    to turn them into some kind of real work in the world.

    I did that. To TEST THE VALIDITY OF MY IDEA with SOMETHING REAL,
    I took the available platform for nested simulations, the mighty
    x86utm, and showed to myself what I'm talking about.

    Now you want to move the goalposts back to mental-trace land,
    since you can't handle the results.

    I WARNED YOU since August or early September that this would be
    possible; that someone might come along and start tinkering with your
    x86utm to see what happens if abandoned simulations are stepped.

    You had several months to do that yourself, and prepare a defense; to
    validate that your simulated D under H indeed behaves differently from
    the direct D, and fails to terminate. (You have the code for that in
    place, it just isn't working!!!)

    You had all this time to look into this, do it yoursel and
    fix up your code and accompanying rhetoric in some suitable way.

    Now you are just dodging and trying to steer things to mental-trace
    land, which is all you had before the x86utm. That's the wrong
    direction! Ideas generally go form "in your head" to "real thing in the
    world showing a result", not the other way around.

    Since x86utm is suddenly no good any more (I wonder why) post your new
    project where you have differently re-worked your ideas about aborting H simulating D, again with real executable traces.

    I will shoot that down easily, too.

    Until then, you have less than nothing. Just empty clap trap with
    obvious logical inconsistencies, and digital parrots on your shoulder whispering what you want to hear.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory,comp.lang.c++,comp.lang.c,comp.ai.philosophy on Mon Nov 3 18:43:27 2025
    From Newsgroup: comp.theory

    On 11/3/2025 6:24 PM, Kaz Kylheku wrote:
    On 2025-11-03, olcott <[email protected]> wrote:
    On 11/3/2025 4:40 PM, Kaz Kylheku wrote:
    On 2025-11-03, olcott <[email protected]> wrote:
    On 11/3/2025 2:43 PM, Kaz Kylheku wrote:
    On 2025-11-02, Kaz Kylheku <[email protected]> wrote:
    On 2025-11-02, olcott <[email protected]> wrote:
    You said they be identical. If they are not equivlaent they can't >>>>>>>> be identical.


    Identical code and different behavior
    because D calls H in recursive simulation
    and D does not call H1 in recursive simulation.

    Can you show that concretely with C?

    Didn't think so.

    I have done that hundreds of times and you just ignore it.

    What? Where? All you ever post these days is useless talk.

    Where is the URL to a project with .c files and a Makefile, etc?


    Are you saying that you are smart enough to do this:

    On 10/31/2025 7:44 PM, Kaz Kylheku wrote:
    I can write a C interpreter which can interpret itself.

    Yet not smart enough to do a simple execution trace in your head?

    Bleeping idiot, of course it was the "execution trace in my head"
    which led me to the realization that abandoned simulations of D have
    a continuable future which leads to termination.


    int D()
    {
    int Halt_Status = H(D);
    if (Halt_Status)
    HERE: goto HERE;
    return Halt_Status;
    }

    Then try and prove this by showing an execution
    trace of D simulated by H entirely in C.

    Don't show any execution trace of anything besides
    D and do this entirely in C. I will get you started:

    H simulates D that calls H(D) that simulates D that calls H(D)

    What step(s) of D come next in C?
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 02:22:25 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago, you just snipped it and ignored it, repeating
    your question.

    My trace showed which part of the syntax was being currently
    interpreted, and the values of some variables.

    Not only have you no idea what the trace is supposed looks like, you
    can't even recognize it when you see it in some concrete form.

    You are making every effort to make communicating with you impossible,
    because that's how you think you can ward off threat.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Mon Nov 3 21:02:20 2025
    From Newsgroup: comp.theory

    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    *This is the only thread that I will speak to you on*
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 04:28:19 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very
    simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation
    proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.

    The D simulation is not "totally killed"; it (the #<interp0> object)
    continues to exist.

    The interpreter machine can identify it and continue to step it: to do
    the reckoning.

    Level Step Code Vars

    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    1 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 0
    1 5 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 1 if (H(D)) ...
    1 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 1
    1 7 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 2 H(D)
    1 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 2
    1 7 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    1 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 3
    1 9 return false; P = D; s = #<interp1>; i = 3
    1 10 if (#<false>) { for(;;); }
    1 11 return;

    At simulation level 1, step 9, the simulated H(D) returns false.

    Step 10 is back in the simulated D(). The evaluated value of H(D)
    is false, shown by #<false>. The if statement falls through.

    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    What continues the simulation? The "reckoning" machinery in the UTM
    which runs the H(D) test case. When the test case returns, this code
    kicks in to check for the oldest unfinished simulation and keeps
    stepping it to try to show whether H(D) returning false was the right
    verdict.

    I have shown the concept using a simple simulating halt decider H wth a
    minimal viable abort test, consisting of trying to run the input for
    three instructions and then abandoning it as non-terminating.

    You may find the criteria too simple, but if you drill into it, you will
    find they don't matter. More complicated criteria which try to detect a repeating pattern of some kind will not change the outcome.

    All that matters is that the simulated D gets a false return value from
    the simulated H(D) somehow. It could take three steps, or three billion.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 13:52:58 2025
    From Newsgroup: comp.theory

    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.


    All of these details must be assumed. When you
    try to specify these additional steps the essential
    truth gets lost in the details.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0 0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3 0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.

    The D simulation is not "totally killed"; it (the #<interp0> object) continues to exist.

    The interpreter machine can identify it and continue to step it: to do
    the reckoning.

    Level Step Code Vars

    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    1 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 0
    1 5 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 1 if (H(D)) ...
    1 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 1
    1 7 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 2 H(D)
    1 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 2
    1 7 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    1 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 3
    1 9 return false; P = D; s = #<interp1>; i = 3
    1 10 if (#<false>) { for(;;); }
    1 11 return;

    At simulation level 1, step 9, the simulated H(D) returns false.

    Step 10 is back in the simulated D(). The evaluated value of H(D)
    is false, shown by #<false>. The if statement falls through.

    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that
    you said we could do it for this:

    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }


    What continues the simulation? The "reckoning" machinery in the UTM
    which runs the H(D) test case. When the test case returns, this code
    kicks in to check for the oldest unfinished simulation and keeps
    stepping it to try to show whether H(D) returning false was the right verdict.


    Or you could have much more simply made N larger.
    The convolution of these extra steps merely hides
    the simple essential truth.

    I have shown the concept using a simple simulating halt decider H wth a minimal viable abort test, consisting of trying to run the input for
    three instructions and then abandoning it as non-terminating.


    Yes that part was an excellent empirical proof.
    You could just keep increasing N until out-of-memory
    error. This would form a reasonably plausible proof
    that comes short of absolute certainty.

    The absolute certainty comes by simply recognizing
    the behavior pattern that D simulated cannot possibly
    reach its own "return" statement no matter what H does.

    Almost everyone here should have recognized that
    this is only slightly more complex than infinite
    recursion three years ago.

    You may find the criteria too simple, but if you drill into it, you will
    find they don't matter. More complicated criteria which try to detect a repeating pattern of some kind will not change the outcome.

    All that matters is that the simulated D gets a false return value from
    the simulated H(D) somehow. It could take three steps, or three billion.

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@[email protected] to comp.theory on Tue Nov 4 20:10:31 2025
    From Newsgroup: comp.theory

    On 04/11/2025 04:28, Kaz Kylheku wrote stuff and may I say, it's
    beautiful material for training LLMs and profiting from your time for
    nothing.

    --
    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 Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 20:20:04 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that
    you said we could do it for this:

    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }

    If you substitute that for D in my above simulation, you will find
    that, no, that doesn't terminate. The example H will give up after the
    three steps, just like before, and return 0, leaving an abandoned
    #<interp0> simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the
    correct return value).

    It is specifically the diagonal D which reaches its return statement
    due to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version
    of HHH and DDD (called MJT_HHH and MJT_DDD) which do not rely on
    mutated static data:

    He's getting a nice "infinite tower" in which every MJT_HHH
    returns 0 to its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3: MJT_HHH(MJT_DD). These have the same abort logic as HHH, but
    without the global variable misuse. HHH[0] decides non-halting.
    Resumed simulations all halt with same behaviour as HHH[n] deciding
    non-halting (like HHH[0]) then DDD[n] returning.
    DDD[1] ends, after HHH[1] detects "infinite recursion" and returns 0.
    DDD[2] ends, after HHH[2] detects "infinite recursion" and returns 0.
    DDD[3] ends, after HHH[3] detects "infinite recursion" and returns 0.
    DDD[4] ends, after HHH[4] detects "infinite recursion" and returns 0.

    Mike added back your square brackets level indication, so we can see
    the increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate,
    which can be released when the simulation terminates, keeping the peak
    memory use constant.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 14:35:07 2025
    From Newsgroup: comp.theory

    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0 0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3 0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    Yes that part was an excellent empirical proof.
    You could just keep increasing N until out-of-memory
    error. This would form a reasonably plausible proof
    that comes short of absolute certainty that D simulated
    by H cannot possibly reach its own "return" statement.

    The absolute certainty comes by simply recognizing
    the behavior pattern that D simulated cannot possibly
    reach its own "return" statement no matter what H does.

    Almost everyone here should have recognized that
    this is only slightly more complex than infinite
    recursion three years ago.

    All the monkeying around with stopping it and
    restarting it merely proves that you did not
    restart it with the exactly the same virtual
    machine state as the machine state that is
    was stopped with.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From joes@[email protected] to comp.theory on Tue Nov 4 20:51:41 2025
    From Newsgroup: comp.theory

    Am Tue, 04 Nov 2025 14:35:07 -0600 schrieb olcott:

    All the monkeying around with stopping it and restarting it merely
    proves that you did not restart it with the exactly the same virtual
    machine state as the machine state that is was stopped with.

    lolwhat? Kaz has working code. Find the error.
    --
    Am Sat, 20 Jul 2024 12:35:31 +0000 schrieb WM in sci.math:
    It is not guaranteed that n+1 exists for every n.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 14:55:37 2025
    From Newsgroup: comp.theory

    On 11/4/2025 2:51 PM, joes wrote:
    Am Tue, 04 Nov 2025 14:35:07 -0600 schrieb olcott:

    All the monkeying around with stopping it and restarting it merely
    proves that you did not restart it with the exactly the same virtual
    machine state as the machine state that is was stopped with.

    lolwhat? Kaz has working code. Find the error.


    The absolute certainty comes by simply recognizing
    the behavior pattern that D simulated cannot possibly
    reach its own "return" statement no matter what H does.

    Almost everyone here should have recognized that
    this is only slightly more complex than infinite
    recursion three years ago.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mr Flibble@[email protected] to comp.theory on Tue Nov 4 21:04:24 2025
    From Newsgroup: comp.theory

    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this:

    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }

    If you substitute that for D in my above simulation, you will find that,
    no, that doesn't terminate. The example H will give up after the three steps, just like before, and return 0, leaving an abandoned #<interp0> simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the correct return value).

    It is specifically the diagonal D which reaches its return statement due
    to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version of HHH
    and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated static data:

    He's getting a nice "infinite tower" in which every MJT_HHH returns 0 to
    its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3: MJT_HHH(MJT_DD). These have the same abort logic as HHH, but
    without the global variable misuse. HHH[0] decides
    non-halting. Resumed simulations all halt with same behaviour
    as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
    returning.
    DDD[1] ends, after HHH[1] detects "infinite recursion" and returns
    0.
    DDD[2] ends, after HHH[2] detects "infinite recursion" and returns
    0.
    DDD[3] ends, after HHH[3] detects "infinite recursion" and returns
    0.
    DDD[4] ends, after HHH[4] detects "infinite recursion" and returns
    0.

    Mike added back your square brackets level indication, so we can see the increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate,
    which can be released when the simulation terminates, keeping the peak
    memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D does
    the opposite of what H(D) reports thus H is wrong. Nothing more needs to
    be said on the matter.

    /Flibble
    --
    meet ever shorter deadlines, known as "beat the clock"
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 21:35:51 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C >>>> syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very
    simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation
    proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    Yes that part was an excellent empirical proof.
    You could just keep increasing N until out-of-memory
    error. This would form a reasonably plausible proof
    that comes short of absolute certainty that D simulated
    by H cannot possibly reach its own "return" statement.

    Yes; /while/ D is being simulated by H, that event does not yet occur.

    This mistake is regarding the end of H as being the end of the
    simulated D.

    Something has to pick up the abandoned simuation left behind by H to
    show that it continues on to the return statement.

    The absolute certainty comes by simply recognizing
    the behavior pattern that D simulated cannot possibly
    reach its own "return" statement no matter what H does.

    The simulated H also quits according to the abort criteria
    (in our example, three step limit) and returns 0 to
    the simulated D, which exits.

    All the monkeying around with stopping it and
    restarting it merely proves that you did not
    restart it with the exactly the same virtual
    machine state as the machine state that is
    was stopped with.

    That it completely false. The reckoning.cc code has access to a
    simulation's slave_state exactly as it was when HHH (or whatever
    function) simply walked away, refraining from performing
    another DebugStep. The next DebugStep performed by the reckoning code
    is the correct one.

    Your disagreement is baseless without a reference to the code,
    indicating where a mistake was made.

    In the abstract C trace that you snipped, it is also correct.
    If not, show where the difference is: where should D have
    been stepped differently?
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 21:43:12 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/4/2025 2:51 PM, joes wrote:
    Am Tue, 04 Nov 2025 14:35:07 -0600 schrieb olcott:

    All the monkeying around with stopping it and restarting it merely
    proves that you did not restart it with the exactly the same virtual
    machine state as the machine state that is was stopped with.

    lolwhat? Kaz has working code. Find the error.

    The absolute certainty comes by simply recognizing
    the behavior pattern that D simulated cannot possibly
    reach its own "return" statement no matter what H does.

    If the certainly is so absolute, what is preventing you from
    showing where code deviates from it?

    I showed it with the C-like trace, upthread; can you show
    the error in that?

    Where is the abandoned simulation being mishandled to
    reach the wrong conclusion?

    There is one absolute certainty: D is one thing. D specifies a
    terminating procedure, and so every correct, /complete/ simulation of D
    shows that terminating behavior. H only needs help with the /complete/
    part.

    If we /didn't/ find simulated D to be terminating (at every
    simulation level), /that/ ought to make us suspicious that we made
    a mistake.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 15:52:06 2025
    From Newsgroup: comp.theory

    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:


    That seems to be a great empirical test.

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0 0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3 0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 22:12:17 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C >>>> syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very
    simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:


    That seems to be a great empirical test.

    I'm glad you like this. It is loosely inspired by Common Lisp stepping.

    (step (let ((a 3) (b 4)) (+ a b)))
    step 1 --> (LET ((A 3) (B 4)) (+ A B))
    Step 1 [2]> :s
    step 2 --> 3
    Step 2 [3]> :s
    step 2 ==> value: 3
    step 2 --> 4
    Step 2 [4]> :s
    step 2 ==> value: 4
    step 2 --> (+ A B)
    Step 2 [5]> :s
    step 3 --> A
    Step 3 [6]> :s
    step 3 ==> value: 3
    step 3 --> B
    Step 3 [7]> :s
    step 3 ==> value: 4
    step 2 ==> value: 7
    step 1 ==> value: 7
    7

    Lisp is the best language for exploring towers of interpreters.

    Remember that 1973 Tony Hoare "Incomputability" paper I recently referenced again; the one in which he and his co-author explore interpreting deciders?

    Among the introductory paragraphs, the paper states this:

    "In this paper we draw on the programming language LISP [7] for
    writing most of the example programs. We have chosen this language
    for the following reasons: 1) it is fairly widely known, 2) it is a
    small and simple language, 3) it is easy to represent Lisp programs as
    data (S-expressions) which can then be manipulated, 4) it is relatively
    easy to write an interpreter of the language in Lisp itself, and 5)
    it might initially seem to be easy to write a program which tells
    whether another program will terminate or not.

    In fact, the first specification of Lisp was written as small amount
    of Lisp code, on paper. No running implementation existed.

    MacCarthy intended it as an abstract specification to guide the project.
    (And didn't intend that notation to be usd for programming; he
    wanted a different surface syntax.)

    Steve Russel, his student, took the specification and hand-translated its definitions to assembly language. The result was a working interpreter.

    MacCarthy was taken aback, thinking there was some mistake; the
    spec wasn't meant to be excuted.

    If you want to explore nested interpretation using a higher level language, you are a fool if you use C rather than Lisp, because you're just throwing irrelevant obstacles in your path.

    The representation of code and all the parsing and all that is already
    done in Lisp, so you can dive right into the interpretation and related semantic parts of what you are doing.

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation
    proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.

    When the loop hits i == 3, it reaches "return false;".

    That first happens at level 0, above. we see this:

    0 9 return false; P = D; s = #<interp0>; i = 3

    So now we have H's conclusion H(D) returns false.

    The #<interp0> simulation exists in the system though; the interesting
    thing takes place after that is picked up and continued.

    The simulated H(D) also hits i == 3 and return;. But since it is D() being simulated, that return is still in the simulation: it goes back into D() which terminates.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 16:13:53 2025
    From Newsgroup: comp.theory

    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0 0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2 0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3 0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Tue Nov 4 22:33:22 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C >>>> syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very
    simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation
    proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.

    Yes, but then the #<interp0> simulation still exists, and the machine
    continues it:

    Previously we have this ending of H(D):

    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    Then #<interp0> is picked up in order to validate H(D)'s claim. This
    is continuing D inside the simulated H(D): so the level is 1:
    Notice that "1 3" already appeared previously; I only repeated it
    for informational purposes, to indicate where the simulation had left
    off:

    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>

    Then first step of the resumption of #<interp0> is actually "1 4":
    the variable has been initialized by the above to a new simulation #<interp1> and we get into the 0 to 2 for loop:

    1 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 0
    1 5 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 1 if (H(D)) ...
    1 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 1
    1 7 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 2 H(D)
    1 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 2
    1 7 if (interp_step(s)) ... P = D; s = #<interp1>; i = 0
    2 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    1 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp1>; i = 3
    1 9 return false; P = D; s = #<interp1>; i = 3
    1 10 if (#<false>) { for(;;); }
    1 11 return;

    So we get to "1 9 return false;" which is an exact mirror of the
    previuos "0 9 return false;".

    Same step number, 9, but one level down!

    Since this is the simulated H(D): the "return false;" goes back to the simulated D where the if (H(D)) statement now has evaluated its
    expression to false: "1 10 if (#<false>) { ... }". So it skips
    the loop and goes to "1 11 return;": D terminates!

    In order to believe that D does not terminate we have to believe irrational ideas like that when the outer H returns false, D is "totally dead". (How can something "totally dead' be nonterminating?)

    You've always correctly claimed that discontinuing the simulation is
    not the same as halting. But the flipside of that is that it is not
    the same as a non-halting, either!

    The arbitrary cessation of a simulation isn't a determiner of whether
    the simulated subject is halting or not.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Chris M. Thomasson@[email protected] to comp.theory on Tue Nov 4 14:41:11 2025
    From Newsgroup: comp.theory

    On 11/4/2025 2:33 PM, Kaz Kylheku wrote:
    [...]
    The arbitrary cessation of a simulation isn't a determiner of whether
    the simulated subject is halting or not.


    Actually, it reminds me of saying anything other than "YES" in my BASIC simulation of DD, say, 100,000,000 times... Olcott says this proves it
    does not halt. The user said I was just about to say "YES" and the
    bastard cut me off at the knees!
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 17:18:15 2025
    From Newsgroup: comp.theory

    On 11/4/2025 4:33 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C >>>>> syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it. >>>
    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very
    simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage> >>> 0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation
    proceeded far enough to hit the "interp_init(P)" calculation, to create
    the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.

    Yes, but then the #<interp0> simulation still exists, and the machine continues it:


    No. As soon as i == 3 it does not begin another simulation.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 18:16:20 2025
    From Newsgroup: comp.theory

    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C
    syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use
    for setting up and stepping a simulation; you made no comments about it.

    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);


    This part seems very smart. Is this actual working code?

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Wed Nov 5 02:08:01 2025
    From Newsgroup: comp.theory

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/4/2025 4:33 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C >>>>>> syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use >>>> for setting up and stepping a simulation; you made no comments about it. >>>>
    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very >>>> simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it
    assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so
    it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage> >>>> 0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage> >>>> 0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation
    proceeded far enough to hit the "interp_init(P)" calculation, to create >>>> the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.

    Yes, but then the #<interp0> simulation still exists, and the machine
    continues it:


    No. As soon as i == 3 it does not begin another simulation.

    What do you mean by "it"?

    If "it" refers to H, that's certainly true. H is gone after this; it
    does nothing, and so if no action is taken, then H's result remains
    unverified.

    The framework does the verification.

    H is called from some test case:

    void test_main()
    {
    printf("D halts = %s\n", H(D) ? "true" : "false");
    }

    The test_main() test case is run by some framework.

    After test_main returns to the framework, the framework looks for an unfininished simulation, finding #<interp0> that was created in step "0
    3" above.

    It begins stepping that simulation, which results in the additional
    steps I showed traced after "0 9".

    The purpose of these steps is to show whether H's simulation of D
    is really nonterminating as it claimed.

    H(D) committed a crime against computer science by calling something nonterminating that terminates. It left incriminating evidence behind,
    and we are doing the crime scene forensics.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Tue Nov 4 20:24:41 2025
    From Newsgroup: comp.theory

    On 11/4/2025 8:08 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/4/2025 4:33 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 8:22 PM, Kaz Kylheku wrote:
    On 2025-11-04, olcott <[email protected]> wrote:
    What step(s) of D come next in C?

    When I posted a detailed symbolic statement-by-statememnt trace using C >>>>>>> syntax several days ago,
    You did not stick with an execution trace of D and only D
    showing that and how D reaches its own "return" statement
    final halt state when simulated and only simulated by H.

    It was a warm-up exercise. The example H wasn't the aborting H.

    You made no remarks on the format: is that a good way or bad
    way to trace executions of just C.

    I invented some fictitious API's into the interpreter that H could use >>>>> for setting up and stepping a simulation; you made no comments about it. >>>>>
    The first thing D does when entered is call H(D), so we need an H
    to trace concretely.

    How about this minimal viable H:

    #include <interpret.h> // C interpreter's own API

    bool H(fptr P)
    {
    interp *s = interp_init(P);

    for (int i = 0; i < 3; i++) {
    if (interp_step(s))
    return true;
    }

    return false;
    }

    H initializes an interpreter for its argument P. Then it applies a very >>>>> simple abort logic: it steps the interpreter state three times. If
    during those three steps, P terminates, it returns true. Otherwise it >>>>> assumes P is nonterminating and returns false.

    (Pretend that more complicated abort criteria are there.)

    The interpreter API consists of primitives built into the system, so >>>>> it isn't traced.

    So then we have D:

    void D(void)
    {
    if (H(D)) { for (;;); }
    return;
    }

    Let's trace H(D). We indicate the simulation levels from 0,
    step numbers from 1 within each level, with a bit of indentation
    to tell apart the levels:

    Level Step Code Vars

    0 1 if (H(D)) ...
    0 2 H(D)
    0 3 interp *s = interp_init(P); ... P = D; s = #<garbage> >>>>> 0 4 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 0
    0 5 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 1 if (H(D)) ...
    0 6 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 1
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 2 H(D)
    0 7 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 2
    0 7 if (interp_step(s)) ... P = D; s = #<interp0>; i = 0
    1 3 interp *s = interp_init(P); ... P = D; s = #<garbage>
    0 8 for (int i = 0; i < 3 i++) ... P = D; s = #<interp0>; i = 3
    0 9 return false; P = D; s = #<interp0>; i = 3

    OK, so after those 3 steps, H(D) has returned false. The D simulation >>>>> proceeded far enough to hit the "interp_init(P)" calculation, to create >>>>> the next simulation level.


    I don't think so
    i == 0 reaches if (interp_step(s))
    i == 1 reaches if (interp_step(s))
    i == 2 reaches if (interp_step(s))
    i == 3 NEVER reaches if (interp_step(s))
    Then bool H(fptr P) returns false.

    Yes, but then the #<interp0> simulation still exists, and the machine
    continues it:


    No. As soon as i == 3 it does not begin another simulation.

    What do you mean by "it"?

    If "it" refers to H, that's certainly true.

    Maybe I meant the clown monster that hides
    in the storm sewer?

    H is gone after this; it
    does nothing, and so if no action is taken, then H's result remains unverified.

    The framework does the verification.

    H is called from some test case:

    void test_main()
    {
    printf("D halts = %s\n", H(D) ? "true" : "false");
    }

    The test_main() test case is run by some framework.

    After test_main returns to the framework, the framework looks for an unfininished simulation, finding #<interp0> that was created in step "0
    3" above.

    It begins stepping that simulation, which results in the additional
    steps I showed traced after "0 9".


    Not when it begins at the exact same machine state
    where H returned zero. If it does not do this then
    it is not actually resuming the simulation it is
    starting a new simulation. If it does not resume
    H with i == 3, then it is not resuming the simulation.

    The purpose of these steps is to show whether H's simulation of D
    is really nonterminating as it claimed.

    H(D) committed a crime against computer science by calling something nonterminating that terminates. It left incriminating evidence behind,
    and we are doing the crime scene forensics.

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From wij@[email protected] to comp.theory on Wed Nov 5 20:04:39 2025
    From Newsgroup: comp.theory

    On Tue, 2025-11-04 at 21:04 +0000, Mr Flibble wrote:
    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this:

    Remember, I had only been joking that you might as well regard Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
       HERE: goto HERE;
       return;
    }

    If you substitute that for D in my above simulation, you will find that, no, that doesn't terminate.  The example H will give up after the three steps, just like before, and return 0, leaving an abandoned #<interp0> simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the correct return value).

    It is specifically the diagonal D which reaches its return statement due
    to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version of HHH and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated static data:

    He's getting a nice "infinite tower" in which every MJT_HHH returns 0 to its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3:  MJT_HHH(MJT_DD).  These have the same abort logic as HHH, but            without the global variable misuse.  HHH[0] decides            non-halting. Resumed simulations all halt with same behaviour
               as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
               returning.
        DDD[1] ends, after HHH[1] detects "infinite recursion" and returns     0.
        DDD[2] ends, after HHH[2] detects "infinite recursion" and returns     0.
        DDD[3] ends, after HHH[3] detects "infinite recursion" and returns     0.
        DDD[4] ends, after HHH[4] detects "infinite recursion" and returns     0.

    Mike added back your square brackets level indication, so we can see the increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate,
    which can be released when the simulation terminates, keeping the peak memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D does
    the opposite of what H(D) reports thus H is wrong. Nothing more needs to
    be said on the matter.

    /Flibble

    I think Kaz and Mike were discussing their model of theory, not really
    the HP.
    To me, the basic idea of HP proof is a simple fact. All theories cannot
    defy, whatever they are. If they can address the HP problem, they must
    conform the fact.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From joes@[email protected] to comp.theory on Wed Nov 5 14:52:09 2025
    From Newsgroup: comp.theory

    Am Tue, 04 Nov 2025 13:52:58 -0600 schrieb olcott:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:

    It was a warm-up exercise. The example H wasn't the aborting H.
    You made no remarks on the format: is that a good way or bad way to
    trace executions of just C.
    All of these details must be assumed. When you try to specify these additional steps the essential truth gets lost in the details.
    What details? The trace? More details don’t change the truth.

    At simulation level 1, step 9, the simulated H(D) returns false.
    Step 10 is back in the simulated D(). The evaluated value of H(D)
    is false, shown by #<false>. The if statement falls through.
    Step 11 is the return statement reached by D.
    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this:
    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }
    Yes, but D halts when continued this way.

    What continues the simulation? The "reckoning" machinery in the UTM
    which runs the H(D) test case. When the test case returns, this code
    kicks in to check for the oldest unfinished simulation and keeps
    stepping it to try to show whether H(D) returning false was the right
    verdict.
    Or you could have much more simply made N larger.
    Exactly! This H_N then returns 1 for D(){ while(!H(D)); }.
    (H(D_N) still returns 0.)

    I have shown the concept using a simple simulating halt decider H wth a
    minimal viable abort test, consisting of trying to run the input for
    three instructions and then abandoning it as non-terminating.

    You could just keep increasing N until out-of-memory error. This would
    form a reasonably plausible proof that comes short of absolute
    certainty.
    Proof of what?

    The absolute certainty comes by simply recognizing the behavior pattern
    that D simulated cannot possibly reach its own "return" statement no
    matter what H does.
    I.e. blind faith.
    --
    Am Sat, 20 Jul 2024 12:35:31 +0000 schrieb WM in sci.math:
    It is not guaranteed that n+1 exists for every n.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Wed Nov 5 09:50:35 2025
    From Newsgroup: comp.theory

    On 11/5/2025 6:04 AM, wij wrote:
    On Tue, 2025-11-04 at 21:04 +0000, Mr Flibble wrote:
    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this: >>>
    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
       HERE: goto HERE;
       return;
    }

    If you substitute that for D in my above simulation, you will find that, >>> no, that doesn't terminate.  The example H will give up after the three >>> steps, just like before, and return 0, leaving an abandoned #<interp0>
    simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the correct return >>> value).

    It is specifically the diagonal D which reaches its return statement due >>> to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version of HHH >>> and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated static >>> data:

    He's getting a nice "infinite tower" in which every MJT_HHH returns 0 to >>> its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3:  MJT_HHH(MJT_DD).  These have the same abort logic as HHH, but >>>            without the global variable misuse.  HHH[0] decides >>>            non-halting. Resumed simulations all halt with same behaviour
               as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
               returning.
        DDD[1] ends, after HHH[1] detects "infinite recursion" and returns >>>     0.
        DDD[2] ends, after HHH[2] detects "infinite recursion" and returns >>>     0.
        DDD[3] ends, after HHH[3] detects "infinite recursion" and returns >>>     0.
        DDD[4] ends, after HHH[4] detects "infinite recursion" and returns >>>     0.

    Mike added back your square brackets level indication, so we can see the >>> increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate,
    which can be released when the simulation terminates, keeping the peak
    memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D does
    the opposite of what H(D) reports thus H is wrong. Nothing more needs to
    be said on the matter.

    /Flibble


    I think Kaz and Mike were discussing their model of theory, not really
    the HP.

    To me, the basic idea of HP proof is a simple fact. All theories cannot
    defy, whatever they are. If they can address the HP problem, they must conform the fact.



    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:

    The whole point is that D simulated by H
    cannot possbly reach its own simulated
    "return" statement no matter what H does.

    Yes; this doesn't happen while H is running.

    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.


    Kaz finally affirmed the key element of my proof
    after waiting three years for this.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Wed Nov 5 09:54:05 2025
    From Newsgroup: comp.theory

    On 11/5/2025 8:52 AM, joes wrote:
    Am Tue, 04 Nov 2025 13:52:58 -0600 schrieb olcott:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:

    It was a warm-up exercise. The example H wasn't the aborting H.
    You made no remarks on the format: is that a good way or bad way to
    trace executions of just C.
    All of these details must be assumed. When you try to specify these
    additional steps the essential truth gets lost in the details.

    What details? The trace? More details don’t change the truth.

    At simulation level 1, step 9, the simulated H(D) returns false.
    Step 10 is back in the simulated D(). The evaluated value of H(D)
    is false, shown by #<false>. The if statement falls through.
    Step 11 is the return statement reached by D.
    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this:
    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }
    Yes, but D halts when continued this way.

    What continues the simulation? The "reckoning" machinery in the UTM
    which runs the H(D) test case. When the test case returns, this code
    kicks in to check for the oldest unfinished simulation and keeps
    stepping it to try to show whether H(D) returning false was the right
    verdict.
    Or you could have much more simply made N larger.
    Exactly! This H_N then returns 1 for D(){ while(!H(D)); }.
    (H(D_N) still returns 0.)

    I have shown the concept using a simple simulating halt decider H wth a
    minimal viable abort test, consisting of trying to run the input for
    three instructions and then abandoning it as non-terminating.

    You could just keep increasing N until out-of-memory error. This would
    form a reasonably plausible proof that comes short of absolute
    certainty.
    Proof of what?

    The absolute certainty comes by simply recognizing the behavior pattern
    that D simulated cannot possibly reach its own "return" statement no
    matter what H does.
    I.e. blind faith.


    I keep asking you if you have ever had any actual
    programming experience and you keep proving no, not
    really. You will keep disagreeing with my code on the
    basis that I totally don't understand anything
    about programming.

    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:

    The whole point is that D simulated by H
    cannot possbly reach its own simulated
    "return" statement no matter what H does.

    Yes; this doesn't happen while H is running.

    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.


    Kaz finally affirmed the key element of my proof
    after waiting three years for this.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From joes@[email protected] to comp.theory on Wed Nov 5 16:52:40 2025
    From Newsgroup: comp.theory

    Am Wed, 05 Nov 2025 09:54:05 -0600 schrieb olcott:
    On 11/5/2025 8:52 AM, joes wrote:
    Am Tue, 04 Nov 2025 13:52:58 -0600 schrieb olcott:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:

    Sure we can do that the same way that you said we could do it for
    this:
    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }
    Yes, but D halts when continued this way.

    Or you could have much more simply made N larger.
    Exactly! This H_N then returns 1 for D(){ while(!H(D)); }. (H(D_N)
    still returns 0.)


    You could just keep increasing N until out-of-memory error. This would
    form a reasonably plausible proof that comes short of absolute
    certainty.
    Proof of what?

    The absolute certainty comes by simply recognizing the behavior
    pattern that D simulated cannot possibly reach its own "return"
    statement no matter what H does.
    I.e. blind faith.

    I keep asking you if you have ever had any actual programming experience
    and you keep proving no, not really. You will keep disagreeing with my
    code on the basis that I totally don't understand anything about
    programming.

    I have programming experience FWIW, but you won’t accept any amount as sufficient, only agreement.

    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:

    Yes; this doesn't happen while H is running.
    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.

    Kaz finally affirmed the key element of my proof after waiting three
    years for this.

    They didn’t affirm what you think they did, just like Sipser and Ben.
    They only said that H is wrong by not simulating the halting of D.


    So, unlike Infinite_Loop() D() halts when resumed and H_N(D) returns 1.
    --
    Am Sat, 20 Jul 2024 12:35:31 +0000 schrieb WM in sci.math:
    It is not guaranteed that n+1 exists for every n.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Wed Nov 5 11:10:17 2025
    From Newsgroup: comp.theory

    On 11/5/2025 10:52 AM, joes wrote:
    Am Wed, 05 Nov 2025 09:54:05 -0600 schrieb olcott:
    On 11/5/2025 8:52 AM, joes wrote:
    Am Tue, 04 Nov 2025 13:52:58 -0600 schrieb olcott:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:

    Sure we can do that the same way that you said we could do it for
    this:
    void Infinite_Loop()
    {
    HERE: goto HERE;
    return;
    }
    Yes, but D halts when continued this way.

    Or you could have much more simply made N larger.
    Exactly! This H_N then returns 1 for D(){ while(!H(D)); }. (H(D_N)
    still returns 0.)


    You could just keep increasing N until out-of-memory error. This would >>>> form a reasonably plausible proof that comes short of absolute
    certainty.
    Proof of what?

    The absolute certainty comes by simply recognizing the behavior
    pattern that D simulated cannot possibly reach its own "return"
    statement no matter what H does.
    I.e. blind faith.

    I keep asking you if you have ever had any actual programming experience
    and you keep proving no, not really. You will keep disagreeing with my
    code on the basis that I totally don't understand anything about
    programming.

    I have programming experience FWIW, but you won’t accept any amount as sufficient, only agreement.


    How many years in C / C++?
    You keep answering like you have no idea what recursion is.

    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:

    > Yes; this doesn't happen while H is running.
    > So while H does /something/, no matter what H does,
    > that D simulation won't reach the return statement.
    >
    Kaz finally affirmed the key element of my proof after waiting three
    years for this.

    They didn’t affirm what you think they did, just like Sipser and Ben.
    They only said that H is wrong by not simulating the halting of D.



    This is the key element of my semantic properties of
    FINITE STRING INPUTS. This is a correction and an
    elaboration of Rice's theorem semantic properties
    of programs.

    It seems (and this is not totally verified) that Rice
    is talking at an abstract level that ignores that Turing
    machines only take finite string inputs and not other
    actual Turing Machines. His proof seem seems to assume
    actual Turing machines as inputs. I correct that error.

    Second Semantic Properties of Finite String Inputs (SPoFSI)
    are stipulated to be measured on the basis of the behavior
    of an input P simulated by a decider** H on the basis of
    H simulating N instructions of input P according to the
    semantics of the specification language of P.

    ** Technically H is a partial decider or a termination analyzer.


    So, unlike Infinite_Loop() D() halts when resumed and H_N(D) returns 1.

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@[email protected] to comp.theory on Wed Nov 5 17:51:32 2025
    From Newsgroup: comp.theory

    On 2025-11-05, olcott <[email protected]> wrote:
    On 11/5/2025 6:04 AM, wij wrote:
    On Tue, 2025-11-04 at 21:04 +0000, Mr Flibble wrote:
    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this: >>>>
    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
       HERE: goto HERE;
       return;
    }

    If you substitute that for D in my above simulation, you will find that, >>>> no, that doesn't terminate.  The example H will give up after the three >>>> steps, just like before, and return 0, leaving an abandoned #<interp0> >>>> simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the correct return >>>> value).

    It is specifically the diagonal D which reaches its return statement due >>>> to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version of HHH >>>> and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated static >>>> data:

    He's getting a nice "infinite tower" in which every MJT_HHH returns 0 to >>>> its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3:  MJT_HHH(MJT_DD).  These have the same abort logic as HHH, but >>>>            without the global variable misuse.  HHH[0] decides >>>>            non-halting. Resumed simulations all halt with same behaviour
               as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
               returning.
        DDD[1] ends, after HHH[1] detects "infinite recursion" and returns >>>>     0.
        DDD[2] ends, after HHH[2] detects "infinite recursion" and returns >>>>     0.
        DDD[3] ends, after HHH[3] detects "infinite recursion" and returns >>>>     0.
        DDD[4] ends, after HHH[4] detects "infinite recursion" and returns >>>>     0.

    Mike added back your square brackets level indication, so we can see the >>>> increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate,
    which can be released when the simulation terminates, keeping the peak >>>> memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D does
    the opposite of what H(D) reports thus H is wrong. Nothing more needs to >>> be said on the matter.

    /Flibble


    I think Kaz and Mike were discussing their model of theory, not really
    the HP.

    To me, the basic idea of HP proof is a simple fact. All theories cannot
    defy, whatever they are. If they can address the HP problem, they must
    conform the fact.



    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:

    The whole point is that D simulated by H
    cannot possbly reach its own simulated
    "return" statement no matter what H does.

    Yes; this doesn't happen while H is running.

    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.


    Kaz finally affirmed the key element of my proof
    after waiting three years for this.

    But that has never been controversial.

    The simulating procedure H(P) can never finish simulating its diagonal
    case D, because no matter how H is defined, D requires more steps than H performs.

    H "spends" a certain "budget" of simulation steps and returns false;
    that budget is always too short to cover the full cost of simulating D,
    which requires a bunch more steps.

    You propose the idea that a machine is nonterminating if the initial
    portion of its execution steps is carried out by a simulating decider
    which quits before that machine reaches its halting state.

    Surely you must realize that looks crazy!?

    It's not because of poor communication any more: everything is crystal
    clear.

    What is the rational argument why anyone should adopt your viewpoint?

    We have a simulating decider H which rejects anything as nonterminating
    if it requires four or more steps.

    Obviously, that is incorrect for any machine which terminates in
    four steps. And for any machine which terminqates in five steps.
    And for any machine which terminates in six steps ...

    And then we have D, which terminates in 11 steps; yet for that one,
    the false is correct?

    I just don't see how that is going to get you written into history
    as the researcher who dismantled the halting problem.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @[email protected]
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Chris M. Thomasson@[email protected] to comp.theory on Wed Nov 5 12:11:48 2025
    From Newsgroup: comp.theory

    On 11/5/2025 9:10 AM, olcott wrote:
    On 11/5/2025 10:52 AM, joes wrote:
    Am Wed, 05 Nov 2025 09:54:05 -0600 schrieb olcott:
    On 11/5/2025 8:52 AM, joes wrote:
    Am Tue, 04 Nov 2025 13:52:58 -0600 schrieb olcott:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:

    Sure we can do that the same way that you said we could do it for
    this:
    void Infinite_Loop()
    {
         HERE: goto HERE;
         return;
    }
    Yes, but D halts when continued this way.

    Or you could have much more simply made N larger.
    Exactly! This H_N then returns 1 for D(){ while(!H(D)); }. (H(D_N)
    still returns 0.)


    You could just keep increasing N until out-of-memory error. This would >>>>> form a reasonably plausible proof that comes short of absolute
    certainty.
    Proof of what?

    The absolute certainty comes by simply recognizing the behavior
    pattern that D simulated cannot possibly reach its own "return"
    statement no matter what H does.
    I.e. blind faith.

    I keep asking you if you have ever had any actual programming experience >>> and you keep proving no, not really. You will keep disagreeing with my
    code on the basis that I totally don't understand anything about
    programming.

    I have programming experience FWIW, but you won’t accept any amount as
    sufficient, only agreement.


    How many years in C / C++?
    You keep answering like you have no idea what recursion is.

    [...]

    Pot kettle? You tried to tell me that BASIC does not handle recursion.
    Well, it actually does. Even on an old one:

    https://pastebin.com/raw/Effeg8cK
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Chris M. Thomasson@[email protected] to comp.theory on Wed Nov 5 12:18:38 2025
    From Newsgroup: comp.theory

    On 11/5/2025 9:51 AM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:
    On 11/5/2025 6:04 AM, wij wrote:
    On Tue, 2025-11-04 at 21:04 +0000, Mr Flibble wrote:
    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this: >>>>>
    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
       HERE: goto HERE;
       return;
    }

    If you substitute that for D in my above simulation, you will find that, >>>>> no, that doesn't terminate.  The example H will give up after the three >>>>> steps, just like before, and return 0, leaving an abandoned #<interp0> >>>>> simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the correct return >>>>> value).

    It is specifically the diagonal D which reaches its return statement due >>>>> to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version of HHH >>>>> and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated static >>>>> data:

    He's getting a nice "infinite tower" in which every MJT_HHH returns 0 to >>>>> its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3:  MJT_HHH(MJT_DD).  These have the same abort logic as HHH, but >>>>>            without the global variable misuse.  HHH[0] decides
               non-halting. Resumed simulations all halt with same behaviour
               as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
               returning.
        DDD[1] ends, after HHH[1] detects "infinite recursion" and returns
        0.
        DDD[2] ends, after HHH[2] detects "infinite recursion" and returns
        0.
        DDD[3] ends, after HHH[3] detects "infinite recursion" and returns
        0.
        DDD[4] ends, after HHH[4] detects "infinite recursion" and returns
        0.

    Mike added back your square brackets level indication, so we can see the >>>>> increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate, >>>>> which can be released when the simulation terminates, keeping the peak >>>>> memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D does >>>> the opposite of what H(D) reports thus H is wrong. Nothing more needs to >>>> be said on the matter.

    /Flibble


    I think Kaz and Mike were discussing their model of theory, not really
    the HP.

    To me, the basic idea of HP proof is a simple fact. All theories cannot
    defy, whatever they are. If they can address the HP problem, they must
    conform the fact.



    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:

    The whole point is that D simulated by H
    cannot possbly reach its own simulated
    "return" statement no matter what H does.

    Yes; this doesn't happen while H is running.

    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.


    Kaz finally affirmed the key element of my proof
    after waiting three years for this.

    But that has never been controversial.

    The simulating procedure H(P) can never finish simulating its diagonal
    case D, because no matter how H is defined, D requires more steps than H performs.

    H "spends" a certain "budget" of simulation steps and returns false;
    that budget is always too short to cover the full cost of simulating D,
    which requires a bunch more steps.

    You propose the idea that a machine is nonterminating if the initial
    portion of its execution steps is carried out by a simulating decider
    which quits before that machine reaches its halting state.

    Surely you must realize that looks crazy!?

    It's not because of poor communication any more: everything is crystal
    clear.

    What is the rational argument why anyone should adopt your viewpoint?

    We have a simulating decider H which rejects anything as nonterminating
    if it requires four or more steps.

    Obviously, that is incorrect for any machine which terminates in
    four steps. And for any machine which terminqates in five steps.
    And for any machine which terminates in six steps ...

    And then we have D, which terminates in 11 steps; yet for that one,
    the false is correct?

    I just don't see how that is going to get you written into history
    as the researcher who dismantled the halting problem.


    He might be too daft to explore the fuzzer. It makes sure all paths are
    hit. It will play along for infinity... Say the user/fuzzer exposes DD
    to data that makes it hit the non-halt path over and over again...
    Olcott swoops in and cancels it before the program was completed!
    Actually, it would have halted, but the PO moron said no, I know better. Scary!

    Good thing that Olcott is not going to make any processors any time
    soon. Heck... A server loop gets aborted because Olcott says it ran too
    long. All of the open and running connections get cut off, the server
    dies. Olcott is there on a soap box saying I told you it was
    non-terminating, that why I aborted it.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory on Wed Nov 5 19:29:07 2025
    From Newsgroup: comp.theory

    On 11/5/2025 11:51 AM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:
    On 11/5/2025 6:04 AM, wij wrote:
    On Tue, 2025-11-04 at 21:04 +0000, Mr Flibble wrote:
    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned,
    its return statement is reached.

    Sure we can do that the same way that you said we could do it for this: >>>>>
    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
       HERE: goto HERE;
       return;
    }

    If you substitute that for D in my above simulation, you will find that, >>>>> no, that doesn't terminate.  The example H will give up after the three >>>>> steps, just like before, and return 0, leaving an abandoned #<interp0> >>>>> simulation.

    When we continue stepping the abandoned #<interp0>, it will just be
    trapped in the HERE: goto HERE (confirming that 0 was the correct return >>>>> value).

    It is specifically the diagonal D which reaches its return statement due >>>>> to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version of HHH >>>>> and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated static >>>>> data:

    He's getting a nice "infinite tower" in which every MJT_HHH returns 0 to >>>>> its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3:  MJT_HHH(MJT_DD).  These have the same abort logic as HHH, but >>>>>            without the global variable misuse.  HHH[0] decides
               non-halting. Resumed simulations all halt with same behaviour
               as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
               returning.
        DDD[1] ends, after HHH[1] detects "infinite recursion" and returns
        0.
        DDD[2] ends, after HHH[2] detects "infinite recursion" and returns
        0.
        DDD[3] ends, after HHH[3] detects "infinite recursion" and returns
        0.
        DDD[4] ends, after HHH[4] detects "infinite recursion" and returns
        0.

    Mike added back your square brackets level indication, so we can see the >>>>> increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear
    stack. Every simuation gets a stack and state buffers from Allocate, >>>>> which can be released when the simulation terminates, keeping the peak >>>>> memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D does >>>> the opposite of what H(D) reports thus H is wrong. Nothing more needs to >>>> be said on the matter.

    /Flibble


    I think Kaz and Mike were discussing their model of theory, not really
    the HP.

    To me, the basic idea of HP proof is a simple fact. All theories cannot
    defy, whatever they are. If they can address the HP problem, they must
    conform the fact.



    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:

    The whole point is that D simulated by H
    cannot possbly reach its own simulated
    "return" statement no matter what H does.

    Yes; this doesn't happen while H is running.

    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.


    Kaz finally affirmed the key element of my proof
    after waiting three years for this.

    But that has never been controversial.


    The why did it take three f-cking years for even
    one person to acknowledge it?

    I would say because all my reviewers have been
    dishonest giving disagreement much more priority
    than truth.

    I had to box you into a corner where not acknowledging
    it would make you look utterly ridiculous. Thenn
    (then and only then) you acknowledged it.
    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From dbush@[email protected] to comp.theory on Wed Nov 5 20:43:13 2025
    From Newsgroup: comp.theory

    On 11/5/2025 8:29 PM, olcott wrote:
    On 11/5/2025 11:51 AM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:
    On 11/5/2025 6:04 AM, wij wrote:
    On Tue, 2025-11-04 at 21:04 +0000, Mr Flibble wrote:
    On Tue, 04 Nov 2025 20:20:04 +0000, Kaz Kylheku wrote:

    On 2025-11-04, olcott <[email protected]> wrote:
    On 11/3/2025 10:28 PM, Kaz Kylheku wrote:
    Step 11 is the return statement reached by D.

    When we continue the simulation D that H started and abandoned, >>>>>>>> its return statement is reached.

    Sure we can do that the same way that you said we could do it for >>>>>>> this:

    Remember, I had only been joking that you might as well regard
    Infinite_Loop as halting. Obviously it isn't

    void Infinite_Loop()
    {
         HERE: goto HERE;
         return;
    }

    If you substitute that for D in my above simulation, you will find >>>>>> that,
    no, that doesn't terminate.  The example H will give up after the >>>>>> three
    steps, just like before, and return 0, leaving an abandoned
    #<interp0>
    simulation.

    When we continue stepping the abandoned #<interp0>, it will just be >>>>>> trapped in the HERE: goto HERE (confirming that 0 was the correct >>>>>> return
    value).

    It is specifically the diagonal D which reaches its return
    statement due
    to H's return value being 0, including in simulation.

    Mike Terry posted some new execution traces from the x86utm with
    reckoning continuation. He wrote a new test case: a clean version >>>>>> of HHH
    and DDD (called MJT_HHH and MJT_DDD) which do not rely on mutated >>>>>> static
    data:

    He's getting a nice "infinite tower" in which every MJT_HHH
    returns 0 to
    its respective MJT_DDD, which then terminates.
    He posted this:

    Trace 3:  MJT_HHH(MJT_DD).  These have the same abort logic as
    HHH, but
                 without the global variable misuse.  HHH[0] decides
                 non-halting. Resumed simulations all halt with same
    behaviour
                 as HHH[n] deciding non-halting (like HHH[0]) then DDD[n]
                 returning.
          DDD[1] ends, after HHH[1] detects "infinite recursion" and >>>>>> returns
          0.
          DDD[2] ends, after HHH[2] detects "infinite recursion" and >>>>>> returns
          0.
          DDD[3] ends, after HHH[3] detects "infinite recursion" and >>>>>> returns
          0.
          DDD[4] ends, after HHH[4] detects "infinite recursion" and >>>>>> returns
          0.

    Mike added back your square brackets level indication, so we can
    see the
    increasing simulation levels.

    The tower keeps going, but the DDD's terminate.

    If the memory management is done right, this should execute
    indefinitely.

    Because it is not recursion, it is not chewing up space in a linear >>>>>> stack. Every simuation gets a stack and state buffers from Allocate, >>>>>> which can be released when the simulation terminates, keeping the >>>>>> peak
    memory use constant.

    Why are you complicating things, Kaz? It is really quite simple: D
    does
    the opposite of what H(D) reports thus H is wrong. Nothing more
    needs to
    be said on the matter.

    /Flibble


    I think Kaz and Mike were discussing their model of theory, not really >>>> the HP.

    To me, the basic idea of HP proof is a simple fact. All theories cannot >>>> defy, whatever they are. If they can address the HP problem, they must >>>> conform the fact.



    On 11/4/2025 8:43 PM, Kaz Kylheku wrote:
    On 2025-11-05, olcott <[email protected]> wrote:

    The whole point is that D simulated by H
    cannot possbly reach its own simulated
    "return" statement no matter what H does.

    Yes; this doesn't happen while H is running.

    So while H does /something/, no matter what H does,
    that D simulation won't reach the return statement.


    Kaz finally affirmed the key element of my proof
    after waiting three years for this.

    But that has never been controversial.


    The why did it take three f-cking years for even
    one person to acknowledge it?

    Most people here acknowledged your claim, that there exists no pure implementation of C function H that can simulate C function call D to a
    final state, long ago. Myself included.

    What you don't seem to understand is that a claim about C functions has nothing to do with a claim about algorithms, which is what the halting
    theorem is all about.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@[email protected] to comp.theory on Fri Nov 7 15:59:54 2025
    From Newsgroup: comp.theory

    On 06/11/2025 01:29, olcott wrote:

    ... why did it take three f-cking years for even
    one person to acknowledge it?

    Did it take 3 three years to establish both of:

    (a) common meaning/understanding
    (b) a match between perceived purpose and actual purpose


    I would say because all my reviewers have been
    dishonest

    I recall that you gave a nonempty list of those you decided had been
    honest. IIRC then you have work to do on your use of "all".


    giving disagreement much more priority
    than truth.

    Truth is a speck of belief in a universe of illusions. Few satisfying interchanges seeking truth will have more than a few truths among many disagreements as the disagreements progressively prompt restrictions
    upon the space of meaning until truth remains.

    Arthur Conan Doyle said it better than me.


    I had to box you into a corner where not acknowledging
    it would make you look utterly ridiculous.

    I recall seeing a shrinking box as terminology was clarified
    satisfactorily. I should note, language often defines a set of (sets of) solutions rather than one and a prompt may be taken to ask for any
    solution, the unique solution, a valuation of the universal generality
    of a propositional statement, a valuation of any restricted generality
    of such, or more besides. You should expect to be required to box your reviewers into a corner before they give a valuation or solution even
    when many will foolishly offer them.

    We're doing (almost) logic here, if Sipser and Linz do not box their
    readers into a corner then I should avoid them.


    --
    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 Tristan Wibberley@[email protected] to comp.theory on Fri Nov 7 16:03:00 2025
    From Newsgroup: comp.theory

    On 06/11/2025 01:43, dbush wrote:

    ... a claim about C functions has
    nothing to do with a claim about algorithms
    ^^^^^^^
    "little directly"

    There are useful relationships, some of which are didactic and some help
    to establish meaning (refining Haskell Curry's U-language progressively).

    --
    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@[email protected] to comp.theory on Fri Nov 7 10:13:13 2025
    From Newsgroup: comp.theory

    On 11/7/2025 9:59 AM, Tristan Wibberley wrote:
    On 06/11/2025 01:29, olcott wrote:

    ... why did it take three f-cking years for even
    one person to acknowledge it?

    Did it take 3 three years to establish both of:

    (a) common meaning/understanding
    (b) a match between perceived purpose and actual purpose


    It took three years to box someone into a corner
    where they could not simply dodge the question.


    I would say because all my reviewers have been
    dishonest

    I recall that you gave a nonempty list of those you decided had been
    honest. IIRC then you have work to do on your use of "all".


    giving disagreement much more priority
    than truth.

    Truth is a speck of belief in a universe of illusions. Few satisfying interchanges seeking truth will have more than a few truths among many disagreements as the disagreements progressively prompt restrictions
    upon the space of meaning until truth remains.

    Arthur Conan Doyle said it better than me.


    I had to box you into a corner where not acknowledging
    it would make you look utterly ridiculous.

    I recall seeing a shrinking box as terminology was clarified

    <MIT Professor Sipser agreed to ONLY these verbatim words 10/13/2022>
    If simulating halt decider H correctly simulates its
    input D until H correctly determines that its simulated D
    would never stop running unless aborted then

    H can abort its simulation of D and correctly report that D
    specifies a non-halting sequence of configurations.
    </MIT Professor Sipser agreed to ONLY these verbatim words 10/13/2022>

    satisfactorily. I should note, language often defines a set of (sets of) solutions rather than one and a prompt may be taken to ask for any
    solution, the unique solution, a valuation of the universal generality
    of a propositional statement, a valuation of any restricted generality
    of such, or more besides. You should expect to be required to box your reviewers into a corner before they give a valuation or solution even
    when many will foolishly offer them.

    We're doing (almost) logic here, if Sipser and Linz do not box their
    readers into a corner then I should avoid them.


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

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@[email protected] to comp.theory,comp.ai.philosophy,comp.software-eng on Fri Nov 7 10:27:45 2025
    From Newsgroup: comp.theory

    On 11/7/2025 9:59 AM, Tristan Wibberley wrote:
    On 06/11/2025 01:29, olcott wrote:

    ... why did it take three f-cking years for even
    one person to acknowledge it?

    Did it take 3 three years to establish both of:

    (a) common meaning/understanding
    (b) a match between perceived purpose and actual purpose


    int D()
    {
    int Halt_Status = H(D);
    if (Halt_Status)
    HERE: goto HERE;
    return Halt_Status;
    }

    <MIT Professor Sipser agreed to ONLY these verbatim words 10/13/2022>
    If simulating halt decider H correctly simulates its
    input D until H correctly determines that its simulated D
    would never stop running unless aborted then

    H can abort its simulation of D and correctly report that D
    specifies a non-halting sequence of configurations.
    </MIT Professor Sipser agreed to ONLY these verbatim words 10/13/2022>

    On 10/14/2022 7:44 PM, Ben Bacarisse wrote:
    I don't think that is the shell game. PO really /has/ an H
    (it's trivial to do for this one case) that correctly determines
    that P(P) *would* never stop running *unless* aborted.

    *The above words have been improved to these words*
    If simulating [*termination analyzer*] H correctly simulates
    its input D until H correctly determines that its simulated D
    [*cannot possibly reach its own simulated final halt state*]
    then

    H can abort its simulation of D and correctly report that
    [*its simulated*] D specifies a non-halting sequence of
    configurations.


    I would say because all my reviewers have been
    dishonest

    I recall that you gave a nonempty list of those you decided had been
    honest. IIRC then you have work to do on your use of "all".


    giving disagreement much more priority
    than truth.

    Truth is a speck of belief in a universe of illusions. Few satisfying interchanges seeking truth will have more than a few truths among many disagreements as the disagreements progressively prompt restrictions
    upon the space of meaning until truth remains.

    Arthur Conan Doyle said it better than me.


    I had to box you into a corner where not acknowledging
    it would make you look utterly ridiculous.

    I recall seeing a shrinking box as terminology was clarified
    satisfactorily. I should note, language often defines a set of (sets of) solutions rather than one and a prompt may be taken to ask for any
    solution, the unique solution, a valuation of the universal generality
    of a propositional statement, a valuation of any restricted generality
    of such, or more besides. You should expect to be required to box your reviewers into a corner before they give a valuation or solution even
    when many will foolishly offer them.

    We're doing (almost) logic here, if Sipser and Linz do not box their
    readers into a corner then I should avoid them.


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

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Tristan Wibberley@[email protected] to comp.theory on Fri Nov 7 16:41:23 2025
    From Newsgroup: comp.theory

    On 07/11/2025 16:13, olcott wrote:
    On 11/7/2025 9:59 AM, Tristan Wibberley wrote:

    Did it take 3 three years to establish both of:

      (a) common meaning/understanding
      (b) a match between perceived purpose and actual purpose


    It took three years to box someone into a corner
    where they could not simply dodge the question.

    well dodged that man.

    --
    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@[email protected] to comp.theory on Fri Nov 7 10:44:09 2025
    From Newsgroup: comp.theory

    On 11/7/2025 10:41 AM, Tristan Wibberley wrote:
    On 07/11/2025 16:13, olcott wrote:
    On 11/7/2025 9:59 AM, Tristan Wibberley wrote:

    Did it take 3 three years to establish both of:

      (a) common meaning/understanding
      (b) a match between perceived purpose and actual purpose


    It took three years to box someone into a corner
    where they could not simply dodge the question.

    well dodged that man.


    That was dozens of people that consistently
    dodged that question many thousands of times.

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

    --
    Copyright 2025 Olcott "Talent hits a target no one else can hit; Genius
    hits a target no one else can see." Arthur Schopenhauer
    --- Synchronet 3.21a-Linux NewsLink 1.2