C++ 停止p‌;r‌;o‌;b&x200C;l‌;e&x200C;我的意思是程序不能检查其他程序?

C++ 停止p‌;r‌;o‌;b&x200C;l‌;e&x200C;我的意思是程序不能检查其他程序?,c++,c,computer-science,halting-problem,C++,C,Computer Science,Halting Problem,我在上理论课,我们刚刚讨论了停顿问题。据我所知,这个问题无法解决的原因是,如果有一个程序停止,它告诉我们一个程序是否停止,而你写了另一个程序来证明 function Proof (program, input) if (Halt(program, input)) loop infinitely; else return 1 ProofFour(program, input) if(FourCheck(program, input) return 5; else return 4;

我在上理论课,我们刚刚讨论了停顿问题。据我所知,这个问题无法解决的原因是,如果有一个程序停止,它告诉我们一个程序是否停止,而你写了另一个程序来证明

function Proof (program, input) 

if (Halt(program, input)) loop infinitely; 
else return 1
ProofFour(program, input) 

if(FourCheck(program, input) return 5; 
else return 4; 
对我来说,问题的关键在于if条件是程序无限循环,这是Halt的失败条件

这是我不确定的部分:

假设您有一个程序来检查另一个程序是否在某个输入上返回数字4。让我们把这个程序称为FourCheck。然后,我们可以编写另一个这样的程序

function Proof (program, input) 

if (Halt(program, input)) loop infinitely; 
else return 1
ProofFour(program, input) 

if(FourCheck(program, input) return 5; 
else return 4; 
在这种情况下,我们可以称为ProofFour(ProofFour,input)。如果FourCheck()返回true,则ProofFour返回5,这使得FourCheck()的输出不正确。如果FourCheck返回false,则ProofFour返回4,再次使FourCheck()的输出不正确

因此,假设您基本上没有程序来检查其他程序是否正确,因为您总是可以构造一个类似于Proof()和Proof four()的程序,它基本上反转checker程序的输出

ProofFour(program, input) 

if(FourCheck(program, input)) return 5; 
else return 4; 
在上面引用的程序中,对
ProofFour(ProofFour,input)
的调用格式不正确:第一个
ProofFour
可以,因为它将一个程序和一个输入作为输入,但第二个
ProofFour
应该有两个参数。这意味着您需要为第二个
Prooffour
提供一对输入,因为:
Prooffour(Prooffour,(someprog,input))
当您使用这个定义良好的表单时,很难(如果不是不可能)解释为什么不可能创建FourCheck()

现在我稍微改变一下:

ProofFour(input)

if(FourCheck(ProofFour, input)) return 5; 
else return 4;

这是定义明确的形式。程序中的ProofFour只是指向程序文本的指针。现在很明显,Fourcheck无法检查程序证明Four。

我想你回答了你自己的问题。总是可以“反转”程序的输出吗?这个问题似乎是离题的,因为应该在上问它。你不能编写一个程序来决定所有程序的
暂停或不暂停
,这就是反例所展示的。这并不意味着你不能为某个程序编写一个决定停止或不停止的程序。对于任何程序,你都可以通过运行程序并查看它返回的内容来“检查它”——当然,有些程序可能永远不会返回。你可以做类似于停止问题的事情。