คุณพูดถูกว่าปัญหาการหยุดพักเป็นตัวอย่างของ "การพิสูจน์โดยแย้ง" ประเภทที่สอง - มันเป็นแค่คำสั่งเชิงลบ
สมมติว่าdecides_halt(M)
เป็นภาคที่บอกว่าเครื่องM
ตัดสินใจว่าการป้อนข้อมูลของมันเป็นเครื่องที่หยุด (นั่นคือM
เป็นโปรแกรมที่สำหรับเครื่องm
และการป้อนข้อมูลบางอย่างi
ตัดสินใจว่าm
หยุดในการป้อนข้อมูลi
)
ลืมไปสักครู่เกี่ยวกับวิธีการพิสูจน์ปัญหาการหยุดชะงักคือคำสั่งที่ไม่มีเครื่องจักรที่ตัดสินปัญหาการหยุดชะงัก เราอาจจะระบุใน Coq เป็นหรือบางทีเราต้องการที่จะบอกว่าเครื่องใดก็ตามไม่ได้แก้ปัญหาที่ลังเล(exists M, decides_halt M) -> False
forall M, decides_halt M -> False
ปรากฎว่าไม่มีสัจพจน์ใด ๆ ทั้งสอง formalization เทียบเท่าใน 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
ไม่ใช่ isomorphic)
diagonalization ข้างต้นแสดงให้เห็นตัวอย่างของวิธีการที่คุณอาจจะไปเกี่ยวกับความขัดแย้งอันเกิดจากมอร์ฟระหว่างและ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.
แม้จะไม่ได้ดูรายละเอียดใด ๆ เราสามารถเห็นได้จากคำแถลงว่าการพิสูจน์นี้ใช้เวลาเพียงการมีอยู่ของการอ้างถึงและแสดงให้เห็นว่ามันเป็นไปไม่ได้ ครั้งแรกที่เราจะให้ทั้งสองด้านของ bijection ชื่อและseq
index
กุญแจสำคัญคือพฤติกรรมของ bijection ในลำดับพิเศษf := fun n => S (seq n n)
และดัชนีของมันindex f
นั้นขัดแย้งกัน การพิสูจน์ปัญหาการหยุดชะงักจะได้รับความขัดแย้งในลักษณะที่คล้ายกันยกตัวอย่างสมมติฐานของมันเกี่ยวกับเครื่องที่แก้ปัญหาการหยุดชะงักด้วยเครื่องที่เลือกอย่างระมัดระวัง (และโดยเฉพาะอย่างยิ่งที่ขึ้นอยู่กับเครื่องปลอม)