This is a question that I got from these posts, which essentially talked about how the constant issue impacts discussions of simplicity, and thus I wanted to ask a question about Kolmogorov Complexity:
https://en.wikipedia.org/wiki/Kolmogorov_complexity#Invariance_theorem
What’s the lowest additive constant that can be achieved by a programming language while still being Turing-Complete?
Or equivalently, what’s the least overhead that you must have in order to describe an object like a computer program or string?
Bonus points for not only establishing a lower bound, but either finding a programming language that achieves the lower bound and showing the source, or actually creating a programming language that achieves the lower bound.
As a side question, I’d also like estimations of how much overhead/the additive constant is added to popular languages like Python, Java, C, C++, and Rust.
The constant is defined between pairs of languages, and it tells you “how many bits does it take to emulate language A in language B”. So it doesn’t make sense to talk about “the” constant of a language, it’s relative to what other language you are comparing it to.
So the answer is “it depends on the languages involved”.
I thought it was talking about the overhead to describe an object in an absolute sense, but it turns out the constant is related to the difficulty of language emulation.
Well, maybe you could create a graph that for each pair of languages contains the two numbers, and using methods such as HodgeRank (implementation), uncovered set or top cycle to create a single number for each language, which’d give you a simplicity comparison between languages. Ideas (with a little bit more detail) here and here (“Towards the Best Programming Language for Universal Induction”).
Fun hypothesis: I suspect that doing this, or constructing a prior over programming languages that gets updated according to observations (a sort of two-level AIXI) collapses UDASSA into egoism, because the programming language that says “my observation is the output of the empty program”.
So does that mean you worked a little on the additive constant issue I talked about in the question?
“Worked” as in “I thought a bit and have ideas that were shot down by others, but some intuitions”, yes—motivated by this podcast which contains a good explanation of the issues. I’ve been mainly motivated by philosophical problems with AIXI & Solomonoff induction, not by anything concrete, though. And it doesn’t seem super important, so I haven’t written any of it up.
Practical programming languages are generally designed to try to reduce the Kolmogorov complexity of most common tasks, when pretty-much ignoring the additive constant for the language itself. This strongly encourages the additive constant for the language itself to be large, by adding a great many libraries useful for many types of tasks. For estimating the actual Kolmogorov complexity of a specific task for something like the Universal Prior, you’re better off starting with one of the simplest Turing tarpits with low initial additive constant, and digging yourself out of the tarpit to the minimal extent actually required for that one specific task