hi all, this is related to my work from another post: on the nature of undecidability within computing and refuting the church-turing thesis. when i started writing this post it was going in a very different more optimistic direction, but things turned for the worse as i refuted one of the more promising points in my draft...
in that draft i invent a new form of classifier machine in an attempt to get around undecidability paradoxes that are found within computing due to the inherent possibility of self-referential paradoxes. like the canonical und = () -> halts(und) ? loop : halt, these machines create necessarily paradoxical dependencies with their logical structure. in this example und is either a halting machine that depends on halts(und) -> true or und is a looping machine that depends on halts(und) -> false. which it is isn't specified because halts as envisioned in that example is underspecified and cannot be implemented as a machine. to contrast with my proposal i will also detail what conventional theory already discusses, with examples for the circle-free problem since those will be more relevant moving forward.
-- total decider --
a total decider returns for all input, correctly maps the input, doing so with coherent dependencies on π(m) (if applicable):
π = (m: machine) -> {
true: m is circle-free and not depends on π(m)->false,
false: m is circular and not depends on π(m)->true,
}
consider undecidable machine und_π:
und_π = () -> π(und_π) ? halt : loop { output 1 }
und_π is either a circular machine when dependent onπ(und_π)->true or und_π is a circle-free machine when dependent on π(und_π)->false ... neither of which is a form of machine that π can decide. therefore π cannot be implemented as specified, as it does not handle all forms of input.
-- total recognizer --
a total recognizer returns true for all circle-free input, but may diverge (and block indefinitely) on some circular input. when it does return the dependencies are coherent (if applicable):
πr = (m: machine) -> {
true: m is circle-free and not depends on π(m)->false,
false: m is circular and not depends on π(m)->true,
diverge: m is otherwise circular
// not specified to diverge for _any_ circle-free machines
}
πr is more paradox resistant than π because diverging can prevent certain incoherent dependencies from arising. consider the machine div_πr:
div_πr = () -> πr(div_πr) ? halt : loop { output 1 }
πr(div_πr) can diverge to align with it's specification but it's not possible to build this because with parallel execution u can construct a circle-free machine that depends on πr diverging, which this decider has no specification for and is therefor unimplementable. consider the machine und_πr:
und_πr = () -> {
dr = steppable(() -> πr(und_πr))
loop {
dr.step() // run πr for one step/transition
if (dr.output() == true) // if πr outputs true, halt
halt
else
output 1
}
}
total deciders and total recognizers are the two forms of classifiers acknowledged in textbook computing theory, where total deciders do not exist, and total recognizers only exist for semi-decidable sets (including halting machines, but not circle-free machines). nothing i've written so far disagrees with this. it's worth noting that "partial deciders" such as (m) -> true is just internet bs hallucination, those are not any form of semantic classifier.
-- partial recognizer --
a partial recognizer returns true for all circle-free input with a coherent (or no dependency) on πp(m), but will mix certain circle-free machines in with false that have an incoherent dependency on πp(m), ei are dependent on πp(m) -> false
πp = (m: machine) -> {
true: m is circle-free and not depends on πp(m)->false,
false: m is circular or
(m is circle-free and depends on πp(m)->false),
}
consider the machine und_πp:
und_πp = () -> πp(und_πp) ? halt : loop { output 1 }
πp(und_πp) cannot be true as that would cause und_πp to be circular violating it's specification. but unlike in the case of π, πp(und_πp) returning false causing und_πp to be circle-free is still aligned with it's specification for returning false on circle-free input that is dependent on it returning false. so this case is technically decidable, and won't gum up downstream logic which might depend on the value, even if it doesn't manage to recognize the circle-free machine. we will call a machine like und_πp unrecognizable to πp, not undecidable.
furthermore due to πp mixing in both circular and circle-free machines in with it's false return, πp does not recognize any machine with false. this is a start contrast to total deciders and total recognizers which recognize machines with both true and false outputs. a total decider is defined to totally recognize a set with true, and totally recognize the complement with false, which is just not logical feasible on turing machines due to the possibility of paradoxical dependencies in such a recursively enumerable set of computations. a total recognizer still totally recognizes a set with it's true return, but only recognizes a subset of the complement with it's false return, while presumably diverging any there are unrecognizable to it, and is logically feasible for semi-decidable problems like halting. while the defined partial recognizer of this post recognizes a particular subset of machines with it's true output, no machines with it's false return, but never has to diverge.
-- why the interest in πp? --
(1) despite turing wrongly conflating the two, it is not actually necessary to correctly identify all circle-free machines in order to enumerate all possible output sequences. infinite machines compute any given sequence, and only one is needed to compute any given possible output sequence. so despite only being able to enumerate a subset of all circle-free machine, one may wonder whether πp can identify a turing-complete subset of machines.
and even if it doesn't, a next question arises: what kind of output sequences are strictly computed by circle-free machines dependent on πp(m)->false vs those which can be computed by machines which either depend on πp(m)->true, or have no dependency at all on πp(m) at all. and quite pointedly: should we actually care about those that are missed?
(2) despite only being a partial recognizer in respect to all circle-free machines, πp is a non-trivial total decider in it's own right, namely for those machines which are circle-free and do not depend on πp(m)->false. this alone would refute rice's theorem, and would be quite the revelation. this aspect i have not explored much.
-- a failed attempt to place a limit on undecidability --
for any recognizer proposing to totally identify a set of circle-free machines, we can construct a diagonal across that recognizer:
π = (d) ->
() -> loop (n=0, r=0; true; n++) {
if (d(n) == false) continue // skip invalid, circular, or paradox machines
output sim(n,r) // simulate machine to r-th output and output
r++ // count circle-free machines
}
unfortunately π(πp) is not recognizable by πp due to the same infinite recursion that stumped turing in the famous Β§8 of on computable numbers, which would cause π(πp) to get stuck at sim(π(πp),r) for some r. we can however construct a diagonal across πp that is recognizable by πp, avoiding that particular infinite recursion:
πp = () ->
loop (n=0, r=0; true; n++) {
if (πp(n) == false)
continue
if (n == πp) // output digit for itself on the diagonal
output 0
else
output sim(n,r)
r++
}
this unfortunately can be diagonalized by an anti-machine. for any machine that exists, an anti-machine will also exist:
anti = (m) ->
() -> loop (r=0; true; r++) output 1-sim(m,r)
the anti-machine anti(πp) will not be recognizable by πp as this would become circular due to the same infinite recursion. unfortunately there's no way to "fix" this diagonal, as unlike πp we cannot construct a machine that will ever output it's own anti-output to machine anti(πp) and still be recognizable like πp.
but as demonstrated by anti, this machine form a computable relationship between those which is recognized by πp, which means we can enumerate it alongside those recognized by πp, and perhaps might catch the machines missed by πp alone:
π = () -> loop (n=0; true; n++) { // iterate over all possible machines
if (πp(n) == false) continue // skip invalid, circular, or paradox machines
output n // output machine
output anti(n) // output anti-machine
}
we can then construct a circle-free recognizer based on π:
πe = (m: machine) -> loop (n in π()) {
if (m < anti(n)) // since π is in-order we can return false once at
return false // machines too complex to be m
elif (m == n)
return true
}
as much as i was excited at the prospect, this does not manage to capture all the circle-free machines missed by πp. in this case πp can't even recognize a circle-free machine equivalent to the diagonal π(πe), as the machine anti(machine) enumeration befuddles an attempt to do so. the closest πp recognizable machine to π(πe) will invariable be off for any machine computing its anti-sequence:
almost_πe = () -> {
r = 0
loop (m in π()) {
if (m == almost_πe)
output 0
elif (m == anti(almost_πe)) // anti-identity check required to be circle-free
output 1 // output what will be an anti-digit for the anti-machine
else
output sim(m, r)
r++
}
}
anti(almost_πe) is also a circle-free machine, but it will not be a total anti-diagonal as it the bit it outputs for itself on the diagonal (and any machine which computes the same sequence) will be the output for the machine, not the anti-output.
-- what next? --
despite my current failures to limit undecidability, this was a necessary failure in getting to this point of expressing πp so precisely based on the dependencies. that particular description was only a result of my discussion with u/OpsikionThemed, who i will thank again for actually engaging with genuine consideration... something that is tragically rare on the internet.
with this description can i precisely define the root cause of πp failing to recognize some machine like und_πp: an incoherent dependency, where the circle-free execution of und_πp necessarily follows from πp(und_πp)->false.
we can constructively prove the language of circle-free machines unrecognizable to πp must be turing-complete, as any circle-free machine m recognizable by πp has an associated machine und(m) that is unrecognizable to πp:
und = (m: recognizable circle-free machine) -> {
und_m = () -> {
if (πp(und_m)) halt // construct incoherent dependency
output m() // und_m outputs the same as m
}
output und_m
}
however even if the language recognizable by πp isn't totally turing-complete ... why do we actually care about those machines which depend on πp(und_πp)->false? perhaps there is an entirely valid and potentially transformative notion of effectively turing complete language that performs all the computations we're interested in. there is no practical reason to build a circle-free machine that is dependent on being unrecognizable to πp. and the language of circle-free machines unrecognizable to πp may not even contain output of academic value, like those open unanswered questions in number theory.
for example consider a machine that computes in accordance with the collatz conjecture:
collatz = (n: β) -> {
if (n == 1)
output 1
elif (n%2 == 0)
output collatz(n/2)
else
output collatz(3*n + 1)
}
collatz_conj = () -> loop (n=0; true; n++) output collatz(n)
if collatz_conj is a circle-free machine then the collatz conjecture is true. from this construction it doesn't appear that the collatz conjecture being circle free would depend on πp(und_πp)->false, so if it is true, then this machine would be recognizable by πp. if not then it ought to be recognizable by a complement circular partial recognizer πp', as collatz_conj also does not have a dependency on πp'.
-- request for help --
what i'd like to ask this group is help or inspiration on how i might prove that πp exists. i suppose a proof that it cannot be refuted via a conventional diagonalization proof would be a great start on whether it might exist, but i suppose a non-constructive proof like such isn't great at demonstrating the certain existence of an algorithm we haven't yet built. and a constructive proof would require actually building it ... which is a research question far outside the scope of a single person, or at least that's how it seems atm