Bạn hoàn toàn đúng khi nói rằng vấn đề tạm dừng là một ví dụ về loại "bằng chứng mâu thuẫn" thứ hai - đó thực sự chỉ là một tuyên bố tiêu cực.
Giả sử decides_halt(M)
là một vị từ nói rằng máy M
quyết định xem đầu vào của nó có phải là máy dừng hay không (nghĩa là M
chương trình dành cho một số máy m
và đầu vào i
, quyết định nếu m
dừng trên đầu vào i
).
Quên một lúc về cách chứng minh nó, vấn đề tạm dừng là tuyên bố rằng không có máy nào quyết định vấn đề tạm dừng. Chúng tôi có thể nêu điều này trong Coq như (exists M, decides_halt M) -> False
, hoặc có thể chúng tôi muốn nói rằng bất kỳ máy cụ thể nào không giải quyết được vấn đề tạm dừng forall M, decides_halt M -> False
. Nó chỉ ra rằng không có bất kỳ tiên đề nào, hai chính thức này là tương đương trong Coq. (Tôi đã đánh vần bằng chứng để bạn có thể thấy nó hoạt động như thế nào, nhưng firstorder
sẽ làm toàn bộ!)
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.
Tôi nghĩ rằng một trong hai tuyên bố không quá khó để chứng minh là một đối số đường chéo, mặc dù việc chính thức hóa máy móc, khả năng tính toán và tạm dừng có lẽ là thách thức hợp lý. Đối với một ví dụ đơn giản, nó không quá khó khăn để chứng minh định lý diagonalization Cantor (xem https://github.com/bmsherman/finite/blob/master/Iso.v#L277-L291 cho một bằng chứng cho thấy nat -> nat
và nat
không đẳng cấu).
Đường chéo ở trên đưa ra một ví dụ về cách bạn có thể bắt nguồn từ một mâu thuẫn từ một đẳng cấu giữa nat -> nat
và nat
. Đây là bản chất của bằng chứng đó được nêu trong một ví dụ khép kín:
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.
Ngay cả khi không nhìn vào các chi tiết, chúng ta có thể thấy từ tuyên bố rằng bằng chứng này chỉ tồn tại sự tồn tại của một mệnh đề và chứng minh điều đó là không thể. Trước tiên, chúng tôi cung cấp cho hai bên của tên gọi seq
và index
. Điều quan trọng là hành vi của bijection trong chuỗi đặc biệt f := fun n => S (seq n n)
và chỉ số của nó index f
là trái ngược nhau. Bằng chứng của vấn đề tạm dừng sẽ dẫn đến một mâu thuẫn theo cách tương tự, đưa ra giả thuyết của nó về một cỗ máy giải quyết vấn đề tạm dừng với một máy được chọn cẩn thận (và đặc biệt là một máy thực sự phụ thuộc vào máy giả định).