I see three main pieces of potential confusion here:
Turing completeness
undecidability of the halting problem
Rice’s Theorem itself
Here’s my intuition for each. Bear in mind that I’m trying to convey intuition here, not formal proofs.
Turing completeness: something is Turing complete if it can simulate a computer running any program—though not necessarily very quickly. A human with paper and pencil can simulate a computer. Magic the Gathering can simulate a computer with a fairly elaborate setup. Etc. Computers can simulate everything in the universe (as far as we can tell so far), so if something can simulate a computer, it can simulate anything.
Halting problem: suppose you’re trying to predict whether a certain program halts. Here’s what the program does: it runs an extremely high-fidelity simulation of you attempting to predict whether the program halts, and then does the opposite of whatever simulated-you predicts. Moral of the story: there are programs for which you, personally, cannot predict whether they halt. More generally, we can replace “you” with any putative halt-checker, and conclude that for any program which attempts to predict whether other programs halt, there is some program which fools it—there is no perfect halt-checker.
Rice’s theorem: rather than a halt-checker, you want to write an X-checker: a program which decides whether other programs do X. But if I had an X-checker, then I could use it to build a halt-checker. I take some program which does X (so my X-checker returns “True” on that program). Then, I construct a new program: it runs some arbitrary program, then throws away the result and runs the program which does X. Why would this matter? Well, if my arbitrary program doesn’t halt, then my new program will never actually get to do X. So, my X-checker will return “True” on the new program if-and-only-if the arbitrary program halts.
If I want to know whether Rice’s theorem applies to some property of programs, I think through this construction, and think about whether it actually works—whether an X-checker would actually let me build a halt-checker this way. (Note that there are much more complicated proofs of Rice’s Theorem. I don’t understand those, and it’s quite possible that this intuition misses some key things which they cover.)
I see three main pieces of potential confusion here:
Turing completeness
undecidability of the halting problem
Rice’s Theorem itself
Here’s my intuition for each. Bear in mind that I’m trying to convey intuition here, not formal proofs.
Turing completeness: something is Turing complete if it can simulate a computer running any program—though not necessarily very quickly. A human with paper and pencil can simulate a computer. Magic the Gathering can simulate a computer with a fairly elaborate setup. Etc. Computers can simulate everything in the universe (as far as we can tell so far), so if something can simulate a computer, it can simulate anything.
Halting problem: suppose you’re trying to predict whether a certain program halts. Here’s what the program does: it runs an extremely high-fidelity simulation of you attempting to predict whether the program halts, and then does the opposite of whatever simulated-you predicts. Moral of the story: there are programs for which you, personally, cannot predict whether they halt. More generally, we can replace “you” with any putative halt-checker, and conclude that for any program which attempts to predict whether other programs halt, there is some program which fools it—there is no perfect halt-checker.
Rice’s theorem: rather than a halt-checker, you want to write an X-checker: a program which decides whether other programs do X. But if I had an X-checker, then I could use it to build a halt-checker. I take some program which does X (so my X-checker returns “True” on that program). Then, I construct a new program: it runs some arbitrary program, then throws away the result and runs the program which does X. Why would this matter? Well, if my arbitrary program doesn’t halt, then my new program will never actually get to do X. So, my X-checker will return “True” on the new program if-and-only-if the arbitrary program halts.
If I want to know whether Rice’s theorem applies to some property of programs, I think through this construction, and think about whether it actually works—whether an X-checker would actually let me build a halt-checker this way. (Note that there are much more complicated proofs of Rice’s Theorem. I don’t understand those, and it’s quite possible that this intuition misses some key things which they cover.)