• Re: How is this answer not self-evident ? --- Recursive simulation

    From Mike Terry@news.dead.person.stones@darjeeling.plus.com to comp.theory on Wed Aug 27 01:17:04 2025
    From Newsgroup: comp.theory

    On 26/08/2025 07:14, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    On 8/25/2025 3:12 PM, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    On 8/25/2025 1:58 PM, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    DD correctly simulated by HHH cannot possibly
    reach its own simulated "return" statement
    final halt state is proven by the fact that
    when the abort code is disabled that DD() never
    stops running.

    When the abort code is disabled HHH(DD) never returns and that's why DD >>>>> never stops running. DD never even gets to execute the logic that
    "behaves opposite" to HHH(DD)'s verdict.


    Finally you are paying attention to this.

    The fact that HHH(DD) never returns due to runaway recursion shows that >>>>> HHH isn't a universal decider.


    *Yes it does show this in this case*
    HHH never even aimed to be a universal decider
    it only aimed on reporting on the behavior of
    DD correctly simulated by HHH.

    To do that, you first have to blow the fuse that
    pins down the DD which is to be tested. And /then/
    call HHH(DD).

    For instance:

    int main()
    {
    (void) HHH(DD); // warm up the decider; discard the result

    // DD is now the non-halting one; no more changes take place

    if (HHH(DD)) {
    ...
    } else {
    ...
    }
    }


    I don't understand what you are saying.
    I will guess that the first HHH(DD) initializes
    the static data on the basis that HHH tests this
    data to see if it has been initialized.

    This HHH(DD) returns zero, right? It tweaks the static data and then
    begins simulating the procedural entry point DD.

    Correct

    It then detects the
    runaway behavior and aborrts the simulation, returning 0.
    Isn't that right?

    It doesn't "detect runaway behaviour". It matches PO's so-called "Infinite Recursive Emulation"
    pattern in its collected trace data, and then, yes, it returns 0.


    Then the second HHH(DD) already has its static data
    initialized and see this. That would be an easy fix.

    Would it be an easy fix in such a way that it keeps your previous
    test cases working?

    What PO needs to do is keep whatever tests he needs in HHH, along with collecting whatever (trace)
    data is needed to support those tests, but do exactly the same collection and testing in each
    emulation level of HHH:

    [SL0] HHH(DD)
    [SL0] ..emulates DD()..
    [SL1] DD()
    [SL1] ..calls HHH(DD)
    [SL1] HHH(DD) // e.g. this HHH [SL1]
    [SL1] ..emulates DD().. // needs to capture trace data
    [SL2] DD() // for this <=== emulation [SL2]
    [SL2] ..calls HHH(DD) // and nested sub-emulations [SL3,4,5...] [SL2] HHH(DD) // but obviously NOT for [SL0] or [SL1] [SL2] ..emulates DD()..
    [SL3] DD()
    [SL3] ..calls HHH(DD)
    [SL3] HHH(DD)
    [SL3] ..emulates DD()..

    HHH /at every emulation level n/ needs to do the same:
    - emulate DD() [SLn+1]
    - collect trace entries from [SLn+1, SLn+2, SLn+3,...]
    into its /own/ local trace table. [NOT into a global trace table owned by HHH [SL0]
    - analyse that local trace for abort patterns in [SLn+1, SLn+2, SLn+3,...]
    and watch for [SLn+1] halting "naturally"
    - return 0 or 1 according to above analysis

    What's so confusing about that? HHH [SLn] is emulating [SLn+1] instruction by instruction and has
    complete access to [SLn+1] state, including what instructions are being emulated, and all the memory
    space of [SLn+1] (which happens to be its own memory space) including [SLn+1]'s current stack
    position and so on. Basically, anything [SLn+1] is doing, HHH [SLn] can see. That includes if
    [SLn+1] itself emulates a nested [SLn+2] emulation, and so on.

    [If you're not familiar with PO's emulation, code in HHH emulates a single instruction in the
    emulation it's performing by calling a "primitive op" DebugStep() which is actually implemented in
    x86utm code. When HHH [SLn+1] performs a DebugStep() the code used is "call <DebugStep notional
    address>", having previously pushed required arguments onto its stack. All apparent to HHH [SLn]. ]

    But PO just can't work it out. I thought recently he might have had some kind of breakthrough, but
    all the talk of spinning up extra runs of HHH(DD) to "warm up the static data" is crazy (ISTM...).


    Without any fix, this second HHH(DD) thinks it is the the simulated one
    which must not perform the abort check.

    PO has (I believe) never /wanted/ to make inner HHH emulations different. He just didn't know how
    to implement it properly, and it came out that way.

    I think its reasonable to say PO never thought his way through what he needed his code to do, in
    order to support his proof refutation goals. I think he started coding and just added more bits
    whenever something didn't do what he expected. I think now he's become even more entangled in a fog
    of objections from various posters, and has totally lost track of where he's going. He's just
    tinkering around the edges trying to keep posters happy, without understanding /why/ they are objecting.

    Because HHH(DD) never stops running that does
    prove that HHH(DD)==0 would be correct if HHH
    could return.

    That's like saying is_prime(4) would be correct if only 4 would be 1
    smaller than it is.

    There is no "would" in math, only "is" or "is not".

    Hey, you know, Escher's Waterfall would be a perpetual motion machine,
    if only the illusion could jump out of the picture.


    On the other hand if the original HHH determined
    its halt status for DD by examining the relationship
    between DD and HHH it could correctly return 0
    without static data.

    How can you distinguish "original HHH" from "derived HHH"
    without static data? You can make it a parameter.

    I don't believe PO would want to distinguish levels of HHH, if he could work out how to track his
    nested emulations /properly/, without the global trace table!

    Recently PO has been posting that if he eliminates the global data HHH will never halt. That
    suggests he's thinking posters are suggesting he just delete the global data variable! But then his
    code will have a compiler error, so he must delete all the code that used that global data, i.e. all
    his abort tests! Well Duh! If he deletes the abort tests of course HHH never halts. Does he
    really think that was being suggested?

    What was suggested was rewriting the tests to /work properly/, e.g. make the trace table local to
    HHH. I doubt you would take long to get a design along those lines working.


    But then you are making it crystal clear that there
    are two deciders.

    Right - two deciders is getting silly! PO wants one decider, coded correctly so each emulation
    level behaves identically (as emulations must...).

    [..snip remainder..]

    Mike.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory on Tue Aug 26 20:39:33 2025
    From Newsgroup: comp.theory

    On 8/26/2025 7:17 PM, Mike Terry wrote:
    On 26/08/2025 07:14, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    On 8/25/2025 3:12 PM, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    On 8/25/2025 1:58 PM, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    DD correctly simulated by HHH cannot possibly
    reach its own simulated "return" statement
    final halt state is proven by the fact that
    when the abort code is disabled that DD() never
    stops running.

    When the abort code is disabled HHH(DD) never returns and that's
    why DD
    never stops running.-a DD never even gets to execute the logic that >>>>>> "behaves opposite" to HHH(DD)'s verdict.


    Finally you are paying attention to this.

    The fact that HHH(DD) never returns due to runaway recursion shows >>>>>> that
    HHH isn't a universal decider.


    *Yes it does show this in this case*
    HHH never even aimed to be a universal decider
    it only aimed on reporting on the behavior of
    DD correctly simulated by HHH.

    To do that, you first have to blow the fuse that
    pins down the DD which is to be tested. And /then/
    call HHH(DD).

    For instance:

    -a-a-a int main()
    -a-a-a {
    -a-a-a-a-a (void) HHH(DD); // warm up the decider; discard the result

    -a-a-a-a-a // DD is now the non-halting one; no more changes take place >>>>
    -a-a-a-a-a if (HHH(DD)) {
    -a-a-a-a-a-a-a-a ...
    -a-a-a-a-a } else {
    -a-a-a-a-a-a-a-a ...
    -a-a-a-a-a }
    -a-a-a }


    I don't understand what you are saying.
    I will guess that the first HHH(DD) initializes
    the static data on the basis that HHH tests this
    data to see if it has been initialized.

    This HHH(DD) returns zero, right? It tweaks the static data and then
    begins simulating the procedural entry point DD.

    Correct

    It then detects the
    runaway behavior and aborrts the simulation, returning 0.
    Isn't that right?

    It doesn't "detect runaway behaviour".-a It matches PO's so-called
    "Infinite Recursive Emulation" pattern in its collected trace data, and then, yes, it returns 0.


    Which I conclusively prove is runaway behavior
    when I disable the abort and DD() never stops running.


    Then the second HHH(DD) already has its static data
    initialized and see this. That would be an easy fix.

    Would it be an easy fix in such a way that it keeps your previous
    test cases working?

    What PO needs to do is keep whatever tests he needs in HHH, along with collecting whatever (trace) data is needed to support those tests, but
    do exactly the same collection and testing in each emulation level of HHH:

    [SL0]-a HHH(DD)
    [SL0]-a ..emulates DD()..
    [SL1]-a-a-a DD()
    [SL1]-a-a-a ..calls HHH(DD)
    [SL1]-a-a-a-a-a HHH(DD)-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a // e.g. this HHH [SL1]
    [SL1]-a-a-a-a-a ..emulates DD()..-a-a-a-a-a-a-a-a // needs to capture trace data
    [SL2]-a-a-a-a-a-a-a DD()-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a // for this <=== emulation [SL2]
    [SL2]-a-a-a-a-a-a-a ..calls HHH(DD)-a-a-a-a-a-a-a-a // and nested sub-emulations
    [SL3,4,5...]
    [SL2]-a-a-a-a-a-a-a-a-a HHH(DD)-a-a-a-a-a-a-a-a-a-a-a-a-a-a // but obviously NOT for [SL0] or
    [SL1]
    [SL2]-a-a-a-a-a-a-a-a-a ..emulates DD()..
    [SL3]-a-a-a-a-a-a-a-a-a-a-a DD()
    [SL3]-a-a-a-a-a-a-a-a-a-a-a ..calls HHH(DD)
    [SL3]-a-a-a-a-a-a-a-a-a-a-a-a-a HHH(DD)
    [SL3]-a-a-a-a-a-a-a-a-a-a-a-a-a ..emulates DD()..

    HHH /at every emulation level n/ needs to do the same:
    --a emulate DD() [SLn+1]
    --a collect trace entries from [SLn+1, SLn+2, SLn+3,...]
    -a-a into its /own/ local trace table.-a [NOT into a global trace table owned by HHH [SL0]
    --a analyse that local trace for abort patterns in [SLn+1, SLn+2, SLn+3,...]
    -a-a and watch for [SLn+1] halting "naturally"
    --a return 0 or 1 according to above analysis

    What's so confusing about that?-a HHH [SLn] is emulating [SLn+1]
    instruction by instruction and has complete access to [SLn+1] state, including what instructions are being emulated, and all the memory space
    of [SLn+1] (which happens to be its own memory space) including
    [SLn+1]'s current stack position and so on.-a Basically, anything [SLn+1]
    is doing, HHH [SLn] can see.-a That includes if [SLn+1] itself emulates a nested [SLn+2] emulation, and so on.

    [If you're not familiar with PO's emulation, code in HHH emulates a
    single instruction in the emulation it's performing by calling a
    "primitive op" DebugStep() which is actually implemented in x86utm
    code.-a When HHH [SLn+1] performs a DebugStep() the code used is "call <DebugStep notional address>", having previously pushed required
    arguments onto its stack.-a All apparent to HHH [SLn]. ]


    If HHH could even know the address of DebugStep()
    then it could know its own address and there is
    no need for more than one simulation. As soon as
    HHH sees DD calling itself its abort criteria is met.

    But PO just can't work it out.-a I thought recently he might have had
    some kind of breakthrough, but all the talk of spinning up extra runs of HHH(DD) to "warm up the static data" is crazy (ISTM...).


    That seems to be Kaz's idea.
    I may have gotten his wrong.


    Without any fix, this second HHH(DD) thinks it is the the simulated one
    which must not perform the abort check.

    PO has (I believe) never /wanted/ to make inner HHH emulations
    different.-a He just didn't know how to implement it properly, and it
    came out that way.


    The key thing is that unless we allocate the
    execution_trace data once it gets erased at
    every invocation.

    I think its reasonable to say PO never thought his way through what he needed his code to do, in order to support his proof refutation goals.

    I have all that totally down pat for at least three years.
    Making HHH a pure function of its inputs is the last step.

    I think he started coding and just added more bits whenever something
    didn't do what he expected.-a I think now he's become even more entangled
    in a fog of objections from various posters, and has totally lost track
    of where he's going.-a He's just tinkering around the edges trying to
    keep posters happy, without understanding /why/ they are objecting.


    It has never been anything like this.
    Its all exactly the same as my original design
    of at least three years ago. I have changed the
    test data to make it easier to understand.

    I changed to DDD() because people didn't seem
    to understand the execution trace of DD correctly
    simulated by HHH. It seems to have turned out to
    be the case that they just don't understand
    execution traces at all.

    Because HHH(DD) never stops running that does
    prove that HHH(DD)==0 would be correct if HHH
    could return.

    That's like saying is_prime(4) would be correct if only 4 would be 1
    smaller than it is.

    There is no "would" in math, only "is" or "is not".

    Hey, you know, Escher's Waterfall would be a perpetual motion machine, >>>> if only the illusion could jump out of the picture.


    On the other hand if the original HHH determined
    its halt status for DD by examining the relationship
    between DD and HHH it could correctly return 0
    without static data.

    How can you distinguish "original HHH" from "derived HHH"
    without static data? You can make it a parameter.

    I don't believe PO would want to distinguish levels of HHH, if he could
    work out how to track his nested emulations /properly/, without the
    global trace table!


    All that I need is for one HHH to see the whole
    execution trace of all of the levels of DD. I
    have that now. Or the whole other method only
    requires HHH to know its own machine address.

    Recently PO has been posting that if he eliminates the global data HHH
    will never halt.-a That suggests he's thinking posters are suggesting he just delete the global data variable!-a But then his code will have a compiler error, so he must delete all the code that used that global
    data, i.e. all his abort tests!-a Well Duh!-a If he deletes the abort
    tests of course HHH never halts.-a Does he really think that was being suggested?


    Disabling the abort has the same practical consequence
    as eliminating the trace data. It conclusively proves
    that DD() doesn't really halt because it never stops
    running.

    What was suggested was rewriting the tests to /work properly/, e.g. make
    the trace table local to HHH.-a I doubt you would take long to get a
    design along those lines working.


    HHH needs to either see two complete traces of
    DD where it sees the same function called twice
    in sequence or it needs to know its own machine
    address. Then it sees DD calling itself.


    But then you are making it crystal clear that there
    are two deciders.

    Right - two deciders is getting silly!-a PO wants one decider, coded correctly so each emulation level behaves identically (as emulations must...).


    Each emulation level has always behaved identically.
    It is only HHH seeing these execution traces that changes.

    [..snip remainder..]

    Mike.

    --
    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 Richard Damon@Richard@Damon-Family.org to comp.theory on Tue Aug 26 21:57:38 2025
    From Newsgroup: comp.theory

    On 8/26/25 9:39 PM, olcott wrote:
    On 8/26/2025 7:17 PM, Mike Terry wrote:
    On 26/08/2025 07:14, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    On 8/25/2025 3:12 PM, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    On 8/25/2025 1:58 PM, Kaz Kylheku wrote:
    On 2025-08-25, olcott <polcott333@gmail.com> wrote:
    DD correctly simulated by HHH cannot possibly
    reach its own simulated "return" statement
    final halt state is proven by the fact that
    when the abort code is disabled that DD() never
    stops running.

    When the abort code is disabled HHH(DD) never returns and that's >>>>>>> why DD
    never stops running.-a DD never even gets to execute the logic that >>>>>>> "behaves opposite" to HHH(DD)'s verdict.


    Finally you are paying attention to this.

    The fact that HHH(DD) never returns due to runaway recursion
    shows that
    HHH isn't a universal decider.


    *Yes it does show this in this case*
    HHH never even aimed to be a universal decider
    it only aimed on reporting on the behavior of
    DD correctly simulated by HHH.

    To do that, you first have to blow the fuse that
    pins down the DD which is to be tested. And /then/
    call HHH(DD).

    For instance:

    -a-a-a int main()
    -a-a-a {
    -a-a-a-a-a (void) HHH(DD); // warm up the decider; discard the result >>>>>
    -a-a-a-a-a // DD is now the non-halting one; no more changes take place >>>>>
    -a-a-a-a-a if (HHH(DD)) {
    -a-a-a-a-a-a-a-a ...
    -a-a-a-a-a } else {
    -a-a-a-a-a-a-a-a ...
    -a-a-a-a-a }
    -a-a-a }


    I don't understand what you are saying.
    I will guess that the first HHH(DD) initializes
    the static data on the basis that HHH tests this
    data to see if it has been initialized.

    This HHH(DD) returns zero, right? It tweaks the static data and then
    begins simulating the procedural entry point DD.

    Correct

    It then detects the
    runaway behavior and aborrts the simulation, returning 0.
    Isn't that right?

    It doesn't "detect runaway behaviour".-a It matches PO's so-called
    "Infinite Recursive Emulation" pattern in its collected trace data,
    and then, yes, it returns 0.


    Which I conclusively prove is runaway behavior
    when I disable the abort and DD() never stops running.


    Then the second HHH(DD) already has its static data
    initialized and see this. That would be an easy fix.

    Would it be an easy fix in such a way that it keeps your previous
    test cases working?

    What PO needs to do is keep whatever tests he needs in HHH, along with
    collecting whatever (trace) data is needed to support those tests, but
    do exactly the same collection and testing in each emulation level of
    HHH:

    [SL0]-a HHH(DD)
    [SL0]-a ..emulates DD()..
    [SL1]-a-a-a DD()
    [SL1]-a-a-a ..calls HHH(DD)
    [SL1]-a-a-a-a-a HHH(DD)-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a // e.g. this HHH [SL1]
    [SL1]-a-a-a-a-a ..emulates DD()..-a-a-a-a-a-a-a-a // needs to capture trace data
    [SL2]-a-a-a-a-a-a-a DD()-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a // for this <=== emulation [SL2]
    [SL2]-a-a-a-a-a-a-a ..calls HHH(DD)-a-a-a-a-a-a-a-a // and nested sub-emulations
    [SL3,4,5...]
    [SL2]-a-a-a-a-a-a-a-a-a HHH(DD)-a-a-a-a-a-a-a-a-a-a-a-a-a-a // but obviously NOT for [SL0] or
    [SL1]
    [SL2]-a-a-a-a-a-a-a-a-a ..emulates DD()..
    [SL3]-a-a-a-a-a-a-a-a-a-a-a DD()
    [SL3]-a-a-a-a-a-a-a-a-a-a-a ..calls HHH(DD)
    [SL3]-a-a-a-a-a-a-a-a-a-a-a-a-a HHH(DD)
    [SL3]-a-a-a-a-a-a-a-a-a-a-a-a-a ..emulates DD()..

    HHH /at every emulation level n/ needs to do the same:
    --a emulate DD() [SLn+1]
    --a collect trace entries from [SLn+1, SLn+2, SLn+3,...]
    -a-a-a into its /own/ local trace table.-a [NOT into a global trace table >> owned by HHH [SL0]
    --a analyse that local trace for abort patterns in [SLn+1, SLn+2,
    SLn+3,...]
    -a-a-a and watch for [SLn+1] halting "naturally"
    --a return 0 or 1 according to above analysis

    What's so confusing about that?-a HHH [SLn] is emulating [SLn+1]
    instruction by instruction and has complete access to [SLn+1] state,
    including what instructions are being emulated, and all the memory
    space of [SLn+1] (which happens to be its own memory space) including
    [SLn+1]'s current stack position and so on.-a Basically, anything
    [SLn+1] is doing, HHH [SLn] can see.-a That includes if [SLn+1] itself
    emulates a nested [SLn+2] emulation, and so on.

    [If you're not familiar with PO's emulation, code in HHH emulates a
    single instruction in the emulation it's performing by calling a
    "primitive op" DebugStep() which is actually implemented in x86utm
    code.-a When HHH [SLn+1] performs a DebugStep() the code used is "call
    <DebugStep notional address>", having previously pushed required
    arguments onto its stack.-a All apparent to HHH [SLn]. ]


    If HHH could even know the address of DebugStep()
    then it could know its own address and there is
    no need for more than one simulation. As soon as
    HHH sees DD calling itself its abort criteria is met.

    But PO just can't work it out.-a I thought recently he might have had
    some kind of breakthrough, but all the talk of spinning up extra runs
    of HHH(DD) to "warm up the static data" is crazy (ISTM...).


    That seems to be Kaz's idea.
    I may have gotten his wrong.


    Without any fix, this second HHH(DD) thinks it is the the simulated one
    which must not perform the abort check.

    PO has (I believe) never /wanted/ to make inner HHH emulations
    different.-a He just didn't know how to implement it properly, and it
    came out that way.


    The key thing is that unless we allocate the
    execution_trace data once it gets erased at
    every invocation.

    I think its reasonable to say PO never thought his way through what he
    needed his code to do, in order to support his proof refutation goals.

    I have all that totally down pat for at least three years.
    Making HHH a pure function of its inputs is the last step.

    I think he started coding and just added more bits whenever something
    didn't do what he expected.-a I think now he's become even more
    entangled in a fog of objections from various posters, and has totally
    lost track of where he's going.-a He's just tinkering around the edges
    trying to keep posters happy, without understanding /why/ they are
    objecting.


    It has never been anything like this.
    Its all exactly the same as my original design
    of at least three years ago. I have changed the
    test data to make it easier to understand.

    I changed to DDD() because people didn't seem
    to understand the execution trace of DD correctly
    simulated by HHH. It seems to have turned out to
    be the case that they just don't understand
    execution traces at all.

    Because HHH(DD) never stops running that does
    prove that HHH(DD)==0 would be correct if HHH
    could return.

    That's like saying is_prime(4) would be correct if only 4 would be 1 >>>>> smaller than it is.

    There is no "would" in math, only "is" or "is not".

    Hey, you know, Escher's Waterfall would be a perpetual motion machine, >>>>> if only the illusion could jump out of the picture.


    On the other hand if the original HHH determined
    its halt status for DD by examining the relationship
    between DD and HHH it could correctly return 0
    without static data.

    How can you distinguish "original HHH" from "derived HHH"
    without static data? You can make it a parameter.

    I don't believe PO would want to distinguish levels of HHH, if he
    could work out how to track his nested emulations /properly/, without
    the global trace table!


    All that I need is for one HHH to see the whole
    execution trace of all of the levels of DD. I
    have that now. Or the whole other method only
    requires HHH to know its own machine address.

    Recently PO has been posting that if he eliminates the global data HHH
    will never halt.-a That suggests he's thinking posters are suggesting
    he just delete the global data variable!-a But then his code will have
    a compiler error, so he must delete all the code that used that global
    data, i.e. all his abort tests!-a Well Duh!-a If he deletes the abort
    tests of course HHH never halts.-a Does he really think that was being
    suggested?


    Disabling the abort has the same practical consequence
    as eliminating the trace data. It conclusively proves
    that DD() doesn't really halt because it never stops
    running.

    But without the abort code, HHH fails to be a decider, so doesn't
    disprove the proof.


    What was suggested was rewriting the tests to /work properly/, e.g.
    make the trace table local to HHH.-a I doubt you would take long to get
    a design along those lines working.


    HHH needs to either see two complete traces of
    DD where it sees the same function called twice
    in sequence or it needs to know its own machine
    address. Then it sees DD calling itself.

    But seeing the two complete traces isn't proof of non-halting, as it
    sees in the first trace that THAT simulator might abort its simulation.

    Your problem is you HHH uses incorrect logic based on lying to itself.



    But then you are making it crystal clear that there
    are two deciders.

    Right - two deciders is getting silly!-a PO wants one decider, coded
    correctly so each emulation level behaves identically (as emulations
    must...).


    Each emulation level has always behaved identically.
    It is only HHH seeing these execution traces that changes.

    And EVERY HHH does that same thing when we look at the behavior of its
    correct simulation (the simulation which continues past it being aborted).


    [..snip remainder..]

    Mike.




    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Kaz Kylheku@643-408-1753@kylheku.com to comp.theory on Wed Aug 27 06:01:54 2025
    From Newsgroup: comp.theory

    On 2025-08-27, Mike Terry <news.dead.person.stones@darjeeling.plus.com> wrote:
    But PO just can't work it out. I thought recently he might have had some kind of breakthrough, but
    all the talk of spinning up extra runs of HHH(DD) to "warm up the static data" is crazy (ISTM...).

    The extra run was my idea. and the "warm up" terminology mine; I
    borrowed that from the area of pseudo-random number generators.
    Some pseudo-random number geenerators do not begin generating
    sequences with good properties until they are called a bunch of times,
    to scramble them (throwing away the results). This is called warm-up.

    My purpose behind the warm-up was to get the machinery to blow its fuse,
    so then after that the functions no longer cheat. Burning fuses
    creates heat, so why not use that term.

    PO latched onto it as some new paradigm for doing something unclearly specified.

    A top-level call to HHH(DD) might return 0, but if we call that and
    discard the result:

    (void) HHH(DD); // burn the fuse

    if (HHH(DD) == 0) // ... real test

    After burning the fuse, things don't go well any more. Unexpectedly, PO
    had some "eureka" out of this.
    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @Kazinator@mstdn.ca
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory on Wed Aug 27 09:28:15 2025
    From Newsgroup: comp.theory

    On 8/27/2025 1:01 AM, Kaz Kylheku wrote:
    On 2025-08-27, Mike Terry <news.dead.person.stones@darjeeling.plus.com> wrote:
    But PO just can't work it out. I thought recently he might have had some kind of breakthrough, but
    all the talk of spinning up extra runs of HHH(DD) to "warm up the static data" is crazy (ISTM...).

    The extra run was my idea. and the "warm up" terminology mine; I
    borrowed that from the area of pseudo-random number generators.
    Some pseudo-random number geenerators do not begin generating
    sequences with good properties until they are called a bunch of times,
    to scramble them (throwing away the results). This is called warm-up.

    My purpose behind the warm-up was to get the machinery to blow its fuse,
    so then after that the functions no longer cheat. Burning fuses
    creates heat, so why not use that term.

    PO latched onto it as some new paradigm for doing something unclearly specified.

    A top-level call to HHH(DD) might return 0, but if we call that and
    discard the result:

    (void) HHH(DD); // burn the fuse

    if (HHH(DD) == 0) // ... real test

    After burning the fuse, things don't go well any more. Unexpectedly, PO
    had some "eureka" out of this.


    This is all moot.
    It seems that I have figured out how HHH can model
    the structural recursive simulation relationship
    between HHH and DD as a pure function of the input
    to HHH(DD) thus HHH(DD)==0 as a pure function of
    its input.
    --
    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 Chris M. Thomasson@chris.m.thomasson.1@gmail.com to comp.theory on Wed Aug 27 16:41:52 2025
    From Newsgroup: comp.theory

    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory on Wed Aug 27 18:52:01 2025
    From Newsgroup: comp.theory

    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.
    --
    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 Chris M. Thomasson@chris.m.thomasson.1@gmail.com to comp.theory on Wed Aug 27 17:29:31 2025
    From Newsgroup: comp.theory

    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory on Wed Aug 27 20:24:12 2025
    From Newsgroup: comp.theory

    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.
    --
    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 Chris M. Thomasson@chris.m.thomasson.1@gmail.com to comp.theory on Wed Aug 27 18:32:00 2025
    From Newsgroup: comp.theory

    On 8/27/2025 6:24 PM, olcott wrote:
    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.


    So are you trying to say that an out of memory condition means the
    program under your test will always halt, or always never halt? ;^)
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory on Wed Aug 27 21:06:27 2025
    From Newsgroup: comp.theory

    On 8/27/2025 8:32 PM, Chris M. Thomasson wrote:
    On 8/27/2025 6:24 PM, olcott wrote:
    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.


    So are you trying to say that an out of memory condition means the
    program under your test will always halt, or always never halt? ;^)

    As someone here pointed out (I think it was Mike) a
    blown stack is a non-halting condition because my
    C code is intended to model Turing machine behavior.
    Thus when DD correctly simulated by HHH hits a blown
    stack this proves that DD does not halt.
    --
    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 Richard Damon@Richard@Damon-Family.org to comp.theory on Wed Aug 27 22:21:29 2025
    From Newsgroup: comp.theory

    On 8/27/25 10:06 PM, olcott wrote:
    On 8/27/2025 8:32 PM, Chris M. Thomasson wrote:
    On 8/27/2025 6:24 PM, olcott wrote:
    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.


    So are you trying to say that an out of memory condition means the
    program under your test will always halt, or always never halt? ;^)

    As someone here pointed out (I think it was Mike) a
    blown stack is a non-halting condition because my
    C code is intended to model Turing machine behavior.
    Thus when DD correctly simulated by HHH hits a blown
    stack this proves that DD does not halt.


    No, a blown stack is a failure of the approximation to determine what
    the actual behavior would be.

    It is quite possible for a correct simulation of a provable halting
    algorithm to blow the stack of a given simulator, and that doesn't prove
    that the algorithm is non-halting.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From =?UTF-8?B?QW5kcsOpIEcuIElzYWFr?=@agisaak@gm.invalid to comp.theory on Wed Aug 27 20:31:39 2025
    From Newsgroup: comp.theory

    On 2025-08-27 20:06, olcott wrote:
    On 8/27/2025 8:32 PM, Chris M. Thomasson wrote:
    On 8/27/2025 6:24 PM, olcott wrote:
    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.


    So are you trying to say that an out of memory condition means the
    program under your test will always halt, or always never halt? ;^)

    As someone here pointed out (I think it was Mike) a
    blown stack is a non-halting condition because my
    C code is intended to model Turing machine behavior.
    Thus when DD correctly simulated by HHH hits a blown
    stack this proves that DD does not halt.

    No. It tells you that if DD halts, it requires a machine with a larger
    stack.

    Andr|-
    --
    To email remove 'invalid' & replace 'gm' with well known Google mail
    service.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From olcott@polcott333@gmail.com to comp.theory on Wed Aug 27 21:37:04 2025
    From Newsgroup: comp.theory

    On 8/27/2025 9:31 PM, Andr|- G. Isaak wrote:
    On 2025-08-27 20:06, olcott wrote:
    On 8/27/2025 8:32 PM, Chris M. Thomasson wrote:
    On 8/27/2025 6:24 PM, olcott wrote:
    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.


    So are you trying to say that an out of memory condition means the
    program under your test will always halt, or always never halt? ;^)

    As someone here pointed out (I think it was Mike) a
    blown stack is a non-halting condition because my
    C code is intended to model Turing machine behavior.
    Thus when DD correctly simulated by HHH hits a blown
    stack this proves that DD does not halt.

    No. It tells you that if DD halts, it requires a machine with a larger stack.

    Andr|-


    The reason that that stack is blown in non-terming behavior
    [Complete proof that the input to HHH(DD)==0 --- The HP proof is wrong]
    --
    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 Fred. Zwarts@F.Zwarts@HetNet.nl to comp.theory on Thu Aug 28 10:51:59 2025
    From Newsgroup: comp.theory

    Op 28.aug.2025 om 04:37 schreef olcott:
    On 8/27/2025 9:31 PM, Andr|- G. Isaak wrote:
    On 2025-08-27 20:06, olcott wrote:
    On 8/27/2025 8:32 PM, Chris M. Thomasson wrote:
    On 8/27/2025 6:24 PM, olcott wrote:
    On 8/27/2025 7:29 PM, Chris M. Thomasson wrote:
    On 8/27/2025 4:52 PM, olcott wrote:
    On 8/27/2025 6:41 PM, Chris M. Thomasson wrote:
    On 8/26/2025 6:39 PM, olcott wrote:
    [...]

    Runaway train... To where? Crash?


    OOM error.


    Blown stack?

    Out-Of-Memory error probably not
    a blown stack because each recursive
    emulation gets a new 64K stack.


    So are you trying to say that an out of memory condition means the
    program under your test will always halt, or always never halt? ;^)

    As someone here pointed out (I think it was Mike) a
    blown stack is a non-halting condition because my
    C code is intended to model Turing machine behavior.
    Thus when DD correctly simulated by HHH hits a blown
    stack this proves that DD does not halt.

    No. It tells you that if DD halts, it requires a machine with a larger
    stack.

    Andr|-


    The reason that that stack is blown in non-terming behavior
    [Complete proof that the input to HHH(DD)==0 --- The HP proof is wrong]


    Infinite recursion is only one of the reasons for a blown stack. There
    are many other possibilities. To prove that there is non-termination behaviour, we need another proof.
    In this case it is clear that HHH just fails to reach the final halt
    state, where other simulators have no problem to reach the final halt
    state specified by exactly the same input.
    HHH stops the simulation prematurely, for invalid reasons. You try to
    prove that it is correct by assuming it is correct. That is invalid
    circular logic.
    --- Synchronet 3.21a-Linux NewsLink 1.2