On 01/10/2021 15:36, olcott wrote:
> On 10/1/2021 9:12 AM, Mike Terry wrote:
>> On 01/10/2021 01:54, olcott wrote:
>>> On 9/30/2021 7:39 PM, André G. Isaak wrote:
>>>> On 2021-09-30 18:26, olcott wrote:
>>>>> On 9/30/2021 7:18 PM, André G. Isaak wrote:
>>>>>> On 2021-09-30 17:21, olcott wrote:
>>>>>>> On 9/30/2021 5:55 PM, André G. Isaak wrote:
>>>>>>>> On 2021-09-30 16:12, olcott wrote:
>>>>>>>>
>>>>>>>>> Because of a critique of my work in another forum I have
>>>>>>>>> discovered that the halt status that H1(P,P) reports is
>>>>>>>>> consistent with the behavior of int main() { P(P); }
>>>>>>>>
>>>>>>>> But how does this address the Linz proof then? You've derived
>>>>>>>> your P from H, not from H1. So all that matter with respect to
>>>>>>>> the Linz proof is what *H*(P, P) returns. That some other
>>>>>>>> decider H1, from which P is *not* derived, can correctly decide
>>>>>>>> P(P) has no bearing on Linz's claim. H1 cannot decide P1(P1)
>>>>>>>> where P1 is derived from H1 in the same way that P is derived
>>>>>>>> from H.
>>>>>>>>
>>>>>>>
>>>>>>> H(P,P) is correct and H1(P,P) is correct.
>>>>>>
>>>>>> So you're saying they both return true? If so, why on earth do you
>>>>>> *need* H1? Why bring it up at all?
>>>>>>
>>>>>
>>>>> H(P,P) correctly determines that its input never reaches its final
>>>>> state whether or not H aborts the simulation of this input.
>>>>>
>>>>> H1(P,P) correctly determines that its input reaches its final state.
>>>>
>>>> They have the *same* input. Therefore they cannot both be correct
>>>> unless they give the same answer. You can't have one of them claim
>>>> that P(P) never reaches its final state and the other say that P(P)
>>>> does reach its final state *and* claim they are both correct.
>>>>
>>>> That's Trump Logic.
>>>>
>>>> André
>>>>
>>>>
>>>
>>> You have to wait until finish converting functions H1 and H to pure
>>> functions. They do derive this result now yet it is possible that
>>> this result is an artifact of their requirement of static local data
>>> to derive these results.
>>
>> Or some other form of cheating such as a function taking its own
>> address, and varying its processing according to that address.
>>
>> (I suggested this was all that was going on a couple of weeks ago, but
>> you neither confirmed nor denied that. Almost as though you actually
>> don't understand /yourself/ what's going on. (Surely that cannot
>> be...!))
>
> I don't reply to nonsense.
>
>
>>>
>>> If it works out like preliminary analysis indicates a pair of
>>> functions with identical machine code and identical inputs really do
>>> have different output because the input to H(P,P) calls H and the
>>> input to H1(P,P) calls H (thus does not call H1).
>>
>> Of course an /unrestricted/ x86 program can do that - all it has to do
>> is look at its own address and behave differently according to that
>> address. (Like your H/H1 routines.) Or cheat with global variables
>> etc..
>>
>
> The halting theorem counter-examples present infinitely nested
> simulation (non-halting) behavior to every simulating halt decider.
>
> When the input P to a simulating halt decider H1 does not call this same
> decider and instead calls another different decider H, then infinitely
> nested simulation is not specified for H1(P,P) as it is for H(P,P).
>
>> If you are concerned with saying things of relevance to TMs and Linz's
>> proof, you need to limit your C code to doing things that directly
>> correspond with what TMs can do.
>
> Yes that was my biggest challenge. I didn't even know the criteria for
> that even though Kaz gave me this criteria months ago. After carefully
> checking and double checking this criteria seems sufficient:
>
> In computer programming, a pure function is a function that has the
> following properties:[1][2]
>
> (1) The function return values are identical for identical arguments (no
> variation with local static variables, non-local variables, mutable
> reference arguments or input streams).
>
> (2) The function application has no side effects (no mutation of local
> static variables, non-local variables, mutable reference arguments or
> input/output streams).
>
https://en.wikipedia.org/wiki/Pure_function
And maybe you also should also be adhering to:
(3) The function does not take its own address and use that as a basis
to modify its processing.
I mean, you say "after careful checking this criteria seems sufficient:
...", but we all know you've not done any such "careful checking" or
given any serious thought at all to your underlying computing model and
its relationship to Linz's TM-based proof. Perhaps there are a whole
host of other restrictions you need to keep things workable? How would
you know if there were? You can't analyse the situation yourself - and
you've only settled on "pure functions" because that's what Kaz
mentioned. [btw, "criteria" is plural]
The Linz proof works because TMs have certain features:
[PURE]
- the same TM start state (including tape) always implies exactly
the same follow-on computation step states, and so properties
based on those follow-on step states like
"one of the follow-on step states is a halt state" aka
"computation halts" are well defined.
[COMPOSE]
- it is possible to include one TMs coded algorithm as a sub-part of
a second machine's coded algorithm, and computations running in
the second TM from the start of the incoporated "TM coded
algorithm" will likewise follow exactly the same computation steps
as for the original TM [given the same tape input, of course], and
so produce the same final result.
(COMPOSE is my name for the second feature...)
The COMPOSE feature is what supports Linz's use of a (modified) copy of
H incorporated into his derived H^. For a given input, his
H_Incoporated within H^ is guaranteed to track exactly the same
calculation steps as the H TM with that same input, and so is guaranteed
to arrive at the same qn/qy state as the original H. That is quite
trivial, and would be understood by anyone with a basic understanding of
TMs.
So your H/H1 give different answers for the same input, yet have "the
same machine code" - what does this imply? One way of looking at it
would be to say that copying the code within your computation model
doesn't satisfy COMPOSE. I think Andy would take that position, and
it's ok but I think not very useful for someone trying to write x86 code
as a more convenient (but broadly equivalent) alternative to discussing
TM-based proofs directly. If this is to be the way of looking at it,
then /what actually is/ the right way of copying an algorithm that
guarantees COMPOSE? Which of your H/H1 is the correct composition for
the original H machine, and why that one and not the other? Strictly
speaking, I suspect the answer is /neither/ of them, but this is all way
too complicated for what you're doing. Don't go there! :)
A better approach (IMO) is to say that the original idea for using C/x86
was maybe reasonable, but needs some restrictions to ensure basic [PURE]
and [COMPOSE] features hold. So you say you want to have pure
functions, which seems reasonable to me because then the correspondence
between your C code and TMs is more direct, making it easier to discuss
the Linz (TM) proof in terms of your C code. (I don't think you
understand those reasons, but hey...)
But for exactly the same reason, you would need to ensure COMPOSE
feature holds and algorithms are composable, preferably as "equivalent
code" callable functions, within your system. That fails when a
function can take its own address and vary its behaviour based on that
address. The function needs to base all its logic on JUST its input
arguments.
Just to confirm - that is what you're doing in your H/H1, right? (Like
I suggested a couple of weeks ago. You still seem to be avoiding this
question.)
A quick note - I don't see any problem with you using machine addresses
observed from your emulation traces. After all, your code can control
the way it emulates, including assigning machine addresses (in effect
state identifiers) to the code being emulated if required - nothing
there a TM can't directly do so that wouldn't break the simple
correspondence you need. The problems come if H/H1 take their /own/
address and then use that when analysing the trace data they receive.
>
>> Otherwise the relationship between your computing model and TMs will
>> become distorted and the conclusions you want to draw from your
>> program's behaviour to TM behaviour may simply not apply.
>>
>> I know that last paragraph is WAAAAAY over your head (computation
>> models? too abstract!) so you will just ignore it. Or perhaps spray
>> your "Objection Begone!" Turing-equivalence spray at it, which never
>> works for you. :)
>>
>> Anyway, you need to work out /why/ copying an algorithm can produce
>> different behaviour in the copy, and STOP DOING IT!! (Just like you
>> seem to have recognised that non-pure functions are to be avoided.
>> I'm not sure whether using your own machine code address breaks the
>> "pure function" rules per se, but the effect on your efforts is the
>> same so it doesn't really matter.)
>>
>>
>> Mike.
>
> My redesign meets all of the above pure function criteria.
>
> It really is the case that a pair of pure functions with identical
> machine code will have different behavior on the same input when this
> input calls one of these functions in pathological self-reference and
> not the other. Identical functions, identical input, differing
> relationships between the functions and their input.
And what do you think that means for your refutation of the Linz proof?
Linz is about TMs, and in TM-world the TM H, and the embedded (modified)
copy of H within H^ DO NECESSARILY behave identically for the same input.
If you have concocted some programming environment where that doesn't
hold, that wouldn't refute Linz - at most it would just mean that the
Linz proof isn't (directly) applicable for that environment, so you were
never "refuting" anything to start with. And of course that wouldn't
mean HP undecidability didn't hold for that environment, just in case
you're thinking of trying that one! (Proof of HP in that environment
could probably just use reduction to the HP-for-TMs problem.)
And if it does hold, then the Linz proof is going to work, and H will
decide (H^,H^) incorrectly like it's been doing for you so far.
Mike.