আপনি ঠিক ঠিক বলেছেন যে থামানো সমস্যাটি দ্বিতীয় ধরণের "বিপরীতে প্রমাণের" উদাহরণ - এটি সত্যই কেবল একটি নেতিবাচক বিবৃতি।
ধরা যাক decides_halt(M)
এমন একটি শিকারী যা বলছে যে মেশিনটি M
সিদ্ধান্ত নেয় যদি তার ইনপুটটি এমন একটি মেশিন থাকে যা থামে (যা M
কোনও প্রোগ্রাম যা কিছু মেশিন m
এবং ইনপুট জন্য i
সিদ্ধান্ত নেয় যে m
ইনপুটটিতে থামানো আছে কিনা i
)।
কীভাবে এটি প্রমাণ করতে হয় তা সম্পর্কে এক মুহুর্তের জন্য ভুলে যাওয়া, থামার সমস্যাটি হ'ল বক্তব্যটি এমন কোনও মেশিন নেই যা থামানো সমস্যার সিদ্ধান্ত নেয় dec আমরা এটি কক হিসাবে এই হিসাবে বর্ণনা (exists M, decides_halt M) -> False
করতে পারি, বা সম্ভবত আমরা বলতে চাই যে কোনও প্রদত্ত মেশিন থামানো সমস্যার সমাধান করে না forall M, decides_halt M -> False
। দেখা যাচ্ছে যে কোনও অলক্ষেত্র ছাড়াই এই দুটি আনুষ্ঠানিকতা কোকের সমতুল্য। (আমি প্রমাণটি বানান করেছি যাতে আপনি দেখতে পারেন যে এটি কীভাবে কাজ করে তবে 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
বিপরীত। থামানো সমস্যার প্রমাণটি একইভাবে একটি বৈপরীত্য তৈরি করবে, এমন একটি মেশিন সম্পর্কে তার অনুমানটি ইনস্ট্যান্ট করে যা সাবধানতার সাথে নির্বাচিত মেশিনের সাহায্যে (এবং বিশেষত এমন একটি যা আসলে ধরে নেওয়া মেশিনের উপর নির্ভর করে) with