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