我正在研究算法,我遇到了这个练习:
'证明没有程序/算法确定程序P是否在给定输入x上使用未初始化的变量。'
以下是我提出的证明:
假设有一个算法Det来确定程序P是否在给定输入x上使用未初始化的变量。
让程序
P(x)的 如果Det(P,x)为真 没做什么 其他 变量i 打印我
在这里我们看到了一个矛盾。如果Det(P,x)为假,那么我们使用了未初始化的变量。我们没有在其他地方使用未初始化的变量,所以每当它返回true时,它就错了。
我不确定我是否正在以正确的方式思考。
答案 0 :(得分:2)
我认为你几乎拥有它,但你必须多说一点才能真正展现矛盾。
你的程序是完美的,即'P(x):如果Det(P,x)为真则不做任何其他变量我打印i'。您还展示了Det(P,x)求值为false的情况,但是您忘了提及如果Det(P,x)求值为true会发生什么(完整性需要这种情况)。例如:
假设Det(P,x)为真。然后,Det确定P(x)使用带输入x的未初始化变量。但这是不可能的,因为P表示如果Det(P,x)为真,那么我们就不使用未初始化的变量。
现在假设Det(P,x)为假。然后,Det确定P(x)不使用未初始化的变量。但这是不可能的,因为P表示如果Det(P,x)为真,那么我们使用未初始化的变量i。
因此,评估Det(P,x)总是会导致矛盾,这意味着它不存在。
编辑:此证明不正确!观察Det(P,x)只能检查P,如果Det(P,x)看到对自身的调用,则Det(P,x)选择使用未初始化的变量并返回true。目前正试图找到正确的解决方案(见评论)。