您完全正确的说,暂停问题是第二种“通过矛盾证明”的例子-实际上,这只是一个否定的陈述。
假设decides_halt(M)
一个谓词说那台机器M
决定它的输入是否是停止的机器(即M
,对于某些机器m
和输入i
,是一个程序,它决定输入是否m
停止i
)。
暂时忘记如何证明它,暂停问题就是这样的陈述:没有机器决定暂停问题。我们可以在Coq中声明为(exists M, decides_halt M) -> False
,或者也许我们更愿意说任何给定的机器都无法解决停机问题forall M, decides_halt M -> False
。事实证明,在没有任何公理的情况下,这两个形式化在Coq中是等效的。(我已经拼出了证明,以便您可以看到它是如何工作的,但是firstorder
会做全部事情!)
Parameter machine:Type.
Parameter decides_halt : machine -> Prop.
(* Here are two ways to phrase the halting problem: *)
Definition halting_problem : Prop :=
(exists M, decides_halt M) -> False.
Definition halting_problem' : Prop :=
forall M, decides_halt M -> False.
Theorem statements_equivalent :
halting_problem <-> halting_problem'.
Proof.
unfold halting_problem, halting_problem'; split; intros.
- exact (H (ex_intro decides_halt M H0)).
- destruct H0.
exact (H x H0).
Qed.
我认为,尽管将机器形式化,可计算性和暂停形式化可能是相当有挑战性的,但无论哪种陈述都很难证明是对角化论点。对于一个简单的示例,证明Cantor的对角化定理并不难(参见 https://github.com/bmsherman/finite/blob/master/Iso.v#L277-L291的证明nat -> nat
和nat
不同构)。
上面的对角线化提供了一个示例,说明如何从之间的同构推导矛盾 nat -> nat
和nat
。这是作为独立示例内联的证明的本质:
Record bijection A B :=
{ to : A -> B
; from : B -> A
; to_from : forall b, to (from b) = b
; from_to : forall a, from (to a) = a
}.
Theorem cantor :
bijection nat (nat -> nat) ->
False.
Proof.
destruct 1 as [seq index ? ?].
(* define a function which differs from the nth sequence at the nth index *)
pose (f := fun n => S (seq n n)).
(* prove f differs from every sequence *)
assert (forall n, f <> seq n). {
unfold not; intros.
assert (f n = seq n n) by congruence.
subst f; cbn in H0.
eapply n_Sn; eauto.
}
rewrite <- (to_from0 f) in H.
apply (H (index f)).
reflexivity.
Qed.
即使不看细节,我们也可以从陈述中看到,该证明仅是双射的存在,并证明这是不可能的。我们首先给双射的两侧命名为seq
和index
。关键在于双射在特殊序列上的行为f := fun n => S (seq n n)
及其索引index f
是矛盾的。停止问题的证明将以类似的方式产生矛盾,实例化其关于一台机器的假设,该机器可通过精心选择的机器(特别是实际依赖于假定机器的机器)来解决该停止问题。