Ви абсолютно праві, що проблема зупинки є прикладом другого виду "доказу протиріччя" - це насправді лише негативне твердження.
Припустимо 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
суперечлива. Доказ проблеми зупинки може викликати протиріччя аналогічним чином, обґрунтовуючи її гіпотезу щодо машини, яка вирішує проблему зупинки з ретельно вибраною машиною (і зокрема, тією, яка насправді залежить від передбачуваної машини).