Вы совершенно правы, что проблема остановки является примером второго типа «доказательства от противоречия» - это на самом деле просто отрицательное утверждение.
Предположим, 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.
Я думаю, что любое утверждение не слишком сложно доказать в качестве аргумента диагонализации, хотя формализация машин, вычислимость и остановка, вероятно, достаточно сложны. Для более простого примера, это не так уж трудно доказать теорему диагонализации Кантора (см 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
противоречивы. Доказательство проблемы остановки могло бы привести к противоречию аналогичным образом, создавая свою гипотезу о машине, которая решает проблему остановки с помощью тщательно выбранной машины (и, в частности, той, которая фактически зависит от предполагаемой машины).