आप बिल्कुल सही कह रहे हैं कि हॉल्टिंग समस्या "विरोधाभास द्वारा सबूत" के दूसरे प्रकार का एक उदाहरण है - यह वास्तव में सिर्फ एक नकारात्मक बयान है।
मान लीजिए decides_halt(M)
कि एक विधेय है जो कहता है कि मशीन यह M
तय करती है कि उसका इनपुट एक ऐसी मशीन है जो हाल्ट करता है (यानी, M
एक प्रोग्राम है जो कुछ मशीन m
और इनपुट i
के लिए तय करता है कि m
इनपुट पर रुका हुआ है i
)।
इसे साबित करने के तरीके के बारे में एक पल के लिए भूल जाना, हॉल्टिंग समस्या का कथन है कि ऐसी कोई मशीन नहीं है जो हॉल्टिंग समस्या का फैसला करती है। हम इसे कोक के रूप में (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
विरोधाभासी है। हॉल्टिंग समस्या का प्रमाण इसी तरह से एक विरोधाभास को प्राप्त करेगा, एक मशीन के बारे में अपनी परिकल्पना को त्वरित रूप से लागू करना जो ध्यान से चुनी गई मशीन के साथ हॉल्टिंग समस्या को हल करता है (और विशेष रूप से एक जो वास्तव में ग्रहण की गई मशीन पर निर्भर करता है)।