Anda benar bahwa masalah penghentian adalah contoh dari jenis kedua "bukti oleh kontradiksi" - itu benar-benar hanya pernyataan negatif.
Misalkan decides_halt(M)
adalah predikat yang mengatakan bahwa mesin M
memutuskan apakah inputnya adalah mesin yang berhenti (yaitu, M
program yang untuk beberapa mesin m
dan input i
, memutuskan apakah m
berhenti pada input i
).
Lupa sejenak tentang bagaimana membuktikannya, masalah penghentian adalah pernyataan bahwa tidak ada mesin yang memutuskan masalah penghentian. Kami mungkin menyatakan ini dalam Coq sebagai (exists M, decides_halt M) -> False
, atau mungkin kami lebih suka mengatakan mesin yang diberikan tidak menyelesaikan masalah penghentian forall M, decides_halt M -> False
. Ternyata tanpa aksioma, dua formalisasi ini setara dalam Coq. (Saya sudah menguraikan buktinya sehingga Anda dapat melihat cara kerjanya, tetapi firstorder
akan melakukan semuanya!)
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.
Saya pikir kedua pernyataan itu tidak terlalu sulit untuk dibuktikan sebagai argumen diagonalisasi, meskipun memformalkan mesin, komputabilitas, dan penghentian mungkin cukup menantang. Sebagai contoh yang lebih sederhana, tidak terlalu sulit untuk membuktikan teorema diagonalisasi Cantor (lihat https://github.com/bmsherman/finite/blob/master/Iso.v#L277-L291 untuk bukti bahwa nat -> nat
dan nat
bukan isomorfik).
Diagonalisasi di atas memberikan contoh bagaimana Anda bisa mendapatkan kontradiksi dari isomorfisme antara nat -> nat
dan nat
. Inilah inti dari bukti yang diuraikan sebagai contoh yang lengkap:
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.
Bahkan tanpa melihat perinciannya, kita dapat melihat dari pernyataan bahwa bukti ini mengambil keberadaan belaka dan menunjukkan bahwa itu mustahil. Pertama-tama kita memberi dua sisi nama seq
dan nama index
. Kuncinya adalah bahwa perilaku bijih pada urutan khusus f := fun n => S (seq n n)
dan indeksnya index f
bertentangan. Bukti masalah terputus-putus akan menghasilkan kontradiksi dengan cara yang sama, membuat hipotesis tentang mesin yang menyelesaikan masalah penghentian dengan mesin yang dipilih dengan hati-hati (dan khususnya yang benar-benar tergantung pada mesin yang diasumsikan).