@bintou 2016-01-21T09:59:36.000000Z 字数 4126 阅读 1203

# SCOOPING THE LOOP SNOOPER

計算理論 詩歌

SCOOPING THE LOOP SNOOPER

A proof that the Halting Problem is undecidable
Geoffrey K. Pullum
(School of Philosophy, Psychology and Language Sciences, University of Edinburgh)

No general procedure for bug checks will do.
Now, I won't just assert that, I'll prove it to you.
I will prove that although you might work till you drop,
you cannot tell if computation will stop.

For imagine we have a procedure called P
that for specified input permits you to see
whether specified source code, with all of its faults,
defines a routine that eventually halts.

You feed in your program, with suitable data,
and P gets to work, and a little while later
(in finite compute time) correctly infers
whether infinite looping behavior occurs.

If there will be no looping, then P prints out 'Good.'
That means work on this input will halt, as it should.
But if it detects an unstoppable loop,
then P reports 'Bad!' — which means you're in the soup.

Well, the truth is that P cannot possibly be,
because if you wrote it and gave it to me,
I could use it to set up a logical bind

Here's the trick that I'll use — and it's simple to do.
I'll define a procedure, which I will call Q,
that will use P's predictions of halting success
to stir up a terrible logical mess.

For a specified program, say A, one supplies,
the first step of this program called Q I devise
is to find out from P what’s the right thing to say
of the looping behavior of A run on A.

But otherwise, Q will go back to the top,
and start off again, looping endlessly back,
till the universe dies and turns frozen and black.

And this program called Q wouldn't stay on the shelf;
I would ask it to forecast its run on itself.
When it reads its own source code, just what will it do?
What’s the looping behavior of Q run on Q?

If P warns of infinite loops, Q will quit;
yet P is supposed to speak truly of it!
And if Q's going to quit, then P should say ‘Good.’
Which makes Q start to loop! (P denied that it would.)

No matter how P might perform, Q will scoop it:
Q uses P's output to make P look stupid.
Whatever P says, it cannot predict Q:
P is right when it’s wrong, and is false when it's true!

I've created a paradox, neat as can be —
and simply by using your putative P.
When you posited P you stepped into a snare;
Your assumption has led you right into my lair.

So where can this argument possibly go?
I don't have to tell you; I'm sure you must know.
A reductio: There cannot possibly be
a procedure that acts like the mythical P.

You can never find general mechanical means
for predicting the acts of computing machines;
it's something that cannot be done. So we users
must find our own bugs. Our computers are losers!

2. 假设P存在，构造Q，输入任意程序A，调用P去判断A在输入为A下是否死循环。如果A死循环，则Q结束运行；否则，Q自己进入死循环。
简单记为：Q(A) : If P(A, A) -->Bad, Stop; else Loop.

3. 现在运行Q，输入是自己本身，即Q，请问答案是什么？ 如果Q死循环，则Q结束运行；如果Q不死循环，则Q进入死循环；矛盾！
即：Q(Q): If P(Q, Q) -->Bad, Stop; else Loop. 翻译成悖论就是：如果P判断Q在输入为Q不停机的话，则Q立即停机；如果P判断Q在输入为Q停机的话，则Q进入死循环。

• 私有
• 公开
• 删除