เป็นไปได้ที่จะพิสูจน์ความลังเลของปัญหาการหยุดพักใน Coq หรือไม่?


23

ฉันกำลังดู " ห้าขั้นตอนของการยอมรับคณิตศาสตร์เชิงสร้างสรรค์ " โดย Andrej Bauer และเขาบอกว่ามีการพิสูจน์สองแบบด้วยความขัดแย้ง (หรือสองสิ่งที่นักคณิตศาสตร์เรียกการพิสูจน์ด้วยความขัดแย้ง):

  1. สมมติว่าเป็นเท็จ ... blah blah blah, ความขัดแย้ง ดังนั้นPจึงเป็นจริงPP
  2. สมมติว่าเป็นจริง ... blah blah blah, ความขัดแย้ง ดังนั้นPจึง เป็นเท็จPP

คนแรกเทียบเท่ากับกฎหมายว่าด้วยการแยกคนกลาง (LEM) และคนที่สองคือวิธีพิสูจน์การปฏิเสธ

การพิสูจน์ความลังเลของปัญหา Halting (HP) เป็นข้อพิสูจน์จากความขัดแย้ง: สมมติว่ามีเครื่องที่สามารถตัดสินใจ HP ... blah blah blah, ความขัดแย้ง ดังนั้นDไม่มีอยู่DD

ดังนั้นให้เป็น " Dอยู่และสามารถตัดสินใจ HP" สมมติว่าPเป็นจริง ... blah blah blah, ความขัดแย้ง ดังนั้นPจึงเป็นเท็จPDPP

ดูเหมือนว่าการพิสูจน์ชนิดที่สองโดยความขัดแย้งดังนั้นจึงเป็นไปได้ที่จะพิสูจน์ความลังเลของปัญหาการหยุดชะงักใน Coq (โดยไม่สมมติ LEM)

แก้ไข: ฉันจะเห็นบางจุดเกี่ยวกับการพิสูจน์โดยใช้ความขัดแย้ง ฉันรู้ว่าสิ่งนี้สามารถพิสูจน์ได้โดยใช้เส้นทแยงมุม


2
@cody เหตุใดคำสั่งปฏิเสธจึงต้องการความขัดแย้ง? หรือคุณกำลัง จำกัด Coq?
David Richerby

3
@ DavidRicherby จริง ๆ แล้วฉันพูดเกินจริงไปเล็กน้อยเพราะมันเป็นเรื่องจริงในกรณีที่ไม่มีสัจพจน์ ในกรณีนั้นขั้นตอนแรก (ต่ำสุด) ของการพิสูจน์ (แบบไม่ต้องตัด) จะต้องไม่ใช่แบบอินโทรในการหักธรรมชาติตามสัญชาตญาณ ในกรณีที่มีสัจพจน์ / สมมติฐานแล้วมันไม่เคยเจ็บที่จะใช้ขั้นตอนนี้ก่อนเพราะมันกลับไม่ได้ แต่บางครั้งก็สามารถหลีกเลี่ยงได้
ดี้

2
คุณรู้เกี่ยวกับกระดาษที่มีชื่อเดียวกัน? (ฉันคิดว่าในนั้นฉันระบุอย่างชัดเจนว่าการพิสูจน์ปกติของการไม่อยู่ของ Oracle Halting นั้นสร้างสรรค์)
Andrej Bauer

1
@ AndrejBauer ฉันไม่รู้ เพิ่งพบมัน ใช่คุณกล่าวว่า "การพิสูจน์โดยทั่วไปของการไม่มีอยู่ของ oracle หยุดนิ่งเป็นอีกตัวอย่างหนึ่งของการพิสูจน์เชิงสร้างสรรค์ของการปฏิเสธ"
Rafael Castro

1
@RafaelCastro: ในฐานะนักเรียนระดับปริญญาตรีคุณกำลังถามคำถามที่ดี ฉันแค่สนับสนุนให้คุณกล้าไปอย่างที่ไม่เคยมีนักศึกษาระดับปริญญาตรี (หรืออย่างน้อยก็ไม่มาก) มาก่อน
Andrej Bauer

คำตอบ:


20

คุณพูดถูกว่าปัญหาการหยุดพักเป็นตัวอย่างของ "การพิสูจน์โดยแย้ง" ประเภทที่สอง - มันเป็นแค่คำสั่งเชิงลบ

สมมติว่า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นั้นขัดแย้งกัน การพิสูจน์ปัญหาการหยุดชะงักจะได้รับความขัดแย้งในลักษณะที่คล้ายกันยกตัวอย่างสมมติฐานของมันเกี่ยวกับเครื่องที่แก้ปัญหาการหยุดชะงักด้วยเครื่องที่เลือกอย่างระมัดระวัง (และโดยเฉพาะอย่างยิ่งที่ขึ้นอยู่กับเครื่องปลอม)


ยินดีต้อนรับสู่เว็บไซต์! ฉันหวังว่าคุณจะไปไหนมาไหน - คุณอาจต้องการทัวร์สั้น ๆ ของเราเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการทำงานของ Stack Exchange
David Richerby

2
ฉันลืมว่าปัญหานี้ได้รับการพิสูจน์ด้วยการโต้เถียงในแนวทแยง คำตอบของคุณน่าสนใจ แต่ฉันอยากจะเห็นบางประเด็นเกี่ยวกับว่าเป็นไปได้ที่จะพิสูจน์ HM โดยใช้ความขัดแย้งใน Coq ฉันจะทำให้ชัดเจนยิ่งขึ้นในคำถาม
Rafael Castro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.