是否有可能证明Coq中的暂停问题尚不确定?


23

我正在观看安德烈·鲍尔(Andrej Bauer)的“ 接受建构主义数学的五个阶段 ”,他说存在两种矛盾的证明(或者数学家称之为矛盾证明的两件事):

  1. 假设是错误的……等等等等,矛盾。因此,P为真。PP
  2. 假设是真的...等等等等,矛盾。因此, P为假。PP

第一个等效于排除中间定律(LEM),第二个等效于如何证明否定。

停止问题(HP)的不确定性证明是通过矛盾证明:假设有一台机器可以决定HP ...等等等等,这是矛盾的。因此,D不存在。DD

因此,让为“ D存在并可以决定HP”。假设P是真的...等等等等,矛盾。因此,P为假。PDPP

这看起来像是第二种矛盾的证明,因此可以证明Coq中暂停问题的不确定性(不假设LEM)吗?

编辑:我会看到一些有关使用矛盾证明这一点的观点。我知道使用对角线化也可以证明这一点。


2
@cody为什么否定性陈述需要矛盾?还是您要限制使用Coq?
David Richerby '17

3
@DavidRicherby我实际上有点夸张,因为只有在没有公理的情况下,这才是正确的。在这种情况下,(免裁剪)证明的第一步(最低)必须是直觉上自然推论的非介绍性内容。在存在公理/假设的情况下,首先进行此步骤不会造成任何伤害,因为它是可逆的,但有时可以避免。
科迪

2
您知道标题相同的论文吗?(我认为在那儿我明确指出,停止甲骨文不存在的通常证明是有建设性的。)
Andrej Bauer

1
@AndrejBauer,我不知道。刚发现。是的,您声明“停止oracle的不存在的通常证明是构造式否定的另一个例子。”
拉斐尔·卡斯特罗

1
@RafaelCastro:作为一名本科生,您在问很好的问题。我只是鼓励您大胆地去以前没有(或至少不是很多)本科生去过的地方。
安德烈·鲍尔

Answers:


20

您完全正确的说,暂停问题是第二种“通过矛盾证明”的例子-实际上,这只是一个否定的陈述。

假设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 -> natnat不同构)。

上面的对角线化提供了一个示例,说明如何从之间的同构推导矛盾 nat -> natnat。这是作为独立示例内联的证明的本质:

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.

即使不看细节,我们也可以从陈述中看到,该证明仅是双射的存在,并证明这是不可能的。我们首先给双射的两侧命名为seqindex。关键在于双射在特殊序列上的行为f := fun n => S (seq n n)及其索引index f是矛盾的。停止问题的证明将以类似的方式产生矛盾,实例化其关于一台机器的假设,该机器可通过精心选择的机器(特别是实际依赖于假定机器的机器)来解决该停止问题。


欢迎光临本站!希望您能坚持使用-您可能希望进行简短的导览,以了解有关Stack Exchange工作原理的更多信息。
大卫·里希比

2
我忘记了这个问题也可以通过对角化论证来证明。您的回答很有趣,但是我想看看是否有可能使用Coq中的矛盾来证明HM。我将在问题中更清楚地说明这一点。
拉斐尔·卡斯特罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.