พิสูจน์ความลังเลของปัญหาการหยุดชะงัก


25

ฉันมีปัญหาในการทำความเข้าใจการพิสูจน์ความลังเลของปัญหาการหยุดชะงัก

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

หากผลตอบแทนไม่ว่าจะเป็นโปรแกรมหรือไม่หยุดกับการป้อนข้อมูลทำไมเราต้องผ่านรหัสของPสำหรับทั้งและ ?H(a,b)abPab

ทำไมเราไม่ป้อนด้วยPและป้อนข้อมูลโดยพลการพูดx ?H()Px


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

2
คุณสามารถป้อนสิ่งที่คุณต้องการ โครงสร้างของการพิสูจน์นี้ต้องการการพิจารณาอินพุตเฉพาะ H
David Richerby

1
คุณสามารถให้ข้อมูลใด ๆ กับโปรแกรม จุดมุ่งหมายคือการค้นหาความขัดแย้ง ในทางทฤษฎีเครื่อง 'H' ควรทำงานได้กับอินพุตทุกชนิด ดังนั้นเราพิจารณาหนึ่งในอินพุตที่เป็นไปได้ทั้งหมดซึ่งนำไปสู่ความขัดแย้ง
Ugnes

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

ที่เกี่ยวข้องอาจซ้ำซ้อน: cs.stackexchange.com/questions/42819/…
Ilmari Karonen

คำตอบ:


27

หลักฐานมีวัตถุประสงค์เพื่อค้นหาความขัดแย้ง คุณต้องเข้าใจว่าความขัดแย้งที่ได้มาคืออะไรเพื่อที่จะเข้าใจว่าเหตุใดจึงถูกใช้เป็นอินพุตสำหรับตัวมันเอง ความขัดแย้งคือไม่เป็นทางการ: หากเรามีเครื่อง H (a, b) ที่ตัดสินใจว่า "a accepts b" เราสามารถสร้างเครื่องที่ยอมรับเครื่องที่ไม่ยอมรับตัวเอง (อ่านสองสามครั้งจนกว่าคุณจะรับมัน) เครื่องที่แสดงในภาพ - เรียกมันว่าM - M ( P ) =ทำPPMM(P)=Pไม่ยอมรับ ?P

ความขัดแย้งเกิดขึ้นเมื่อคุณถามว่า: ทำMยอมรับหรือไม่ พยายามหาทางเลือกสองทางเพื่อดูว่ามีความขัดแย้งอย่างไรM

ยอมรับM ถ้าหาก Mเท่านั้นMMMไม่ยอมรับ ; นี่เป็นสิ่งที่ขัดแย้งกันอย่างชัดเจนM

นี่คือเหตุผลที่มันเป็นสิ่งจำเป็นสำหรับการพิสูจน์การเรียกใช้ บนตัวเองไม่ใช่อินพุตโดยพลการ นี่เป็นรูปแบบทั่วไปในการพิสูจน์ความเป็นไปไม่ได้ที่รู้จักกันในชื่ออาร์กิวเมนต์แนวทแยงP


38

ไม่ต้องสนใจภาพสักครู่ เราจะไปถึงในไม่ช้า โปรแกรมควรจะเป็นผู้ทดสอบหยุด: เมื่อเราให้Hการป้อนข้อมูลของโปรแกรมการ(คิดเป็นรายชื่อของโปรแกรม) และสิ่งที่ทุกสำหรับ , H ( , B )ทำหน้าที่ดังต่อไปนี้H(a,b)HaabH(a,b)

  1. หากโปรแกรมที่แสดงโดยหยุดเมื่อได้รับเป็น input H ( , )จะตอบว่า "ใช่" ในทางกลับกันหากโปรแกรมที่อธิบายโดยการรันตลอดไปเมื่อได้รับอินพุตbดังนั้นH ( a , b )จะตอบว่า "ไม่"abH(a,b)abH(a,b)
  2. ที่สำคัญโปรแกรมมักจะหยุดและให้คำตอบที่ถูกต้องสำหรับการใด ๆคู่( , B )H(a,b)

อาร์กิวเมนต์ที่เป็นไปไม่ได้ที่จะสร้างนั้นขึ้นอยู่กับการกระทำของโปรแกรม "วิปริต" โดยเฉพาะคือPซึ่งใช้Hเป็นรูทีนย่อย Pรับอินพุตเป็นรายการของโปรแกรมใด ๆ , xHPHPxและทำสิ่งต่อไปนี้:

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

ไม่ยากที่จะเห็นว่า

จะหยุดถ้าหากโปรแกรม xP(x)xจะทำงานตลอดไปเมื่อได้รับคำอธิบายเป็นอินพุต

จนถึงตอนนี้ดีมาก: จะเป็นโปรแกรมตราบใดที่รูทีนย่อยHPHเป็นโปรแกรม

ตอนนี้กลับไปที่รูปภาพ จะเกิดอะไรขึ้นถ้าให้คำอธิบายเป็นอินพุต? ภาพอธิบายเพียงสถานการณ์นั้น: ให้pเป็นคำอธิบายของโปรแกรมPPpPจากนั้นแทนลงในส่วนที่ไฮไลต์ด้านบนเราจะได้

จะหยุดถ้าหากโปรแกรม P ( p )จะทำงานตลอดไปP(p)P(p)

เห็นได้ชัดว่าพฤติกรรมขัดแย้งนี้เป็นไปไม่ได้ดังนั้นเราจึงถูกบังคับให้ข้อสรุปว่า subroutine ไม่สามารถเป็นผู้ทดสอบหยุดชะงักเพราะมันล้มเหลวในกรณีหนึ่งที่มันได้รับ( P , P )เป็น input อาจมีบางกรณีที่Hทำงานได้อย่างที่ควรจะเป็น แต่เนื่องจากHล้มเหลวในสถานการณ์อย่างน้อยหนึ่งสถานการณ์จึงไม่สามารถหยุดการทดสอบได้อย่างสมบูรณ์ตามที่ต้องการH(p,p)HH


ฉันชอบคำตอบนี้ แม้ว่าตอนนี้ฉันจะเข้าใจหลักฐานแล้ว แต่ดูเหมือนว่าจะพิสูจน์ว่า H สามารถโยนข้อ จำกัด การเรียกซ้ำได้
โทรสาร

2
@Fax Hไม่ได้รับการโทรติดต่อมากกว่าหนึ่งครั้งไม่มีการเรียกซ้ำในกรณีPใด ๆ H(P, P)ไม่ได้ดำเนินการPเพียงแค่ "วิเศษ" กำหนดว่าจะPหยุดหรือไม่เมื่อผ่านตัวเอง
Ajedi32

@ Ajedi32 H(P,P)ไม่จำเป็นต้องดำเนินการPแต่จะต้องดำเนินการH(x ↦ H(x,x), P)เป็นส่วนหนึ่งของการพิจารณาว่าPหยุดหรือไม่ ซึ่งขยายไปH(x ↦ H(y ↦ H(y,y), x), P)เรื่อย ๆ
โทรสาร

@Fax การดำเนินการของHไม่ได้ระบุไว้ในหลักฐานนี้ ดังนั้นไม่ต้องดำเนินการอะไรไม่ว่าจะเป็นPหรือของตัวเอง การพิสูจน์เริ่มต้นด้วยการสันนิษฐานว่ามีโปรแกรมบางอย่างHอยู่ซึ่งตัดสินใจแก้ปัญหาอย่างน่าอัศจรรย์จากนั้นก็พิสูจน์ให้เห็นว่าการดำรงอยู่ของโปรแกรมดังกล่าวจะขัดแย้งกันและไม่มีโปรแกรมดังกล่าวอยู่จริง
Ajedi32

1
@Fax คุณยกประเด็นที่ดีเกี่ยวกับโปรแกรมที่มีอยู่ซึ่งจะตัดสินปัญหาการหยุดชะงักยกเว้นเมื่อถูกเรียกตัวเอง ดูมีข้อพิสูจน์ใด ๆ เกี่ยวกับความลังเลของปัญหาการหยุดชะงักที่ไม่ได้ขึ้นอยู่กับการอ้างอิงตนเองหรือการเบี่ยงเบน? สำหรับคำถามที่น่าสนใจเกี่ยวกับเรื่องนั้น
Ajedi32

9

ลองพิสูจน์ให้ดีกว่าด้วยภาพเคลื่อนไหว และเนื่องจากคำตอบควรมีมากกว่าลิงค์ไปยังเว็บไซต์นี่คือคำตอบสำหรับคำถามของคุณ

อันดับแรกให้เราจำได้ว่าหลักฐานการไม่มีอยู่ของออราเคิล Halting ทำงานอย่างไร เราพิสูจน์ให้เห็นว่าผู้สมัครใด ๆHสำหรับออราเคิล Halting มีโปรแกรมPและอินพุตaที่Hล้มเหลวในการทำนายสิ่งที่ถูกต้องP(a)ทำ

ทฤษฎีบท:ปล่อยให้Hเป็นโปรแกรมใด ๆ ที่รับสองอินพุตและคืนค่าอย่างใดอย่างหนึ่งhaltหรือloopเสมอ จากนั้นจะมีโปรแกรมQและอินพุตaที่Q(a)หยุดถ้าและถ้าH(Q,a)กลับloopมา

พิสูจน์ พิจารณาโปรแกรม

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

ขอและQ = P a = Pอย่างใดอย่างหนึ่งH(Q,a) = haltหรือH(Q,a) = loop:

  • ถ้าH(Q,a) = haltแล้วQ(a)(ซึ่งเป็นเพียงP(P)) Pวิ่งตลอดไปโดยความหมายของ
  • ถ้าH(Q,a) = loopแล้วQ(a)หยุดโดย definitoin Pของ

QED

คุณถามว่าทำไมเราพิจารณาH(P,P)แทนสำหรับบางคนอื่น ๆH(P,X) Xคำตอบที่ชัดเจนคือ "เพราะH(P,P)สิ่งที่ทำให้การพิสูจน์"! หากคุณใช้H(P,X)โดยพลการXคุณจะติดขัด แน่นอนหลักฐานจะมีลักษณะเช่นนี้:

หลักฐานหัก พิจารณาโปรแกรม

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

ให้Q = Pและสำหรับพลบางส่วนa = X Xอย่างใดอย่างหนึ่งH(Q,X) = haltหรือH(Q,X) = loop:

  • สมมติว่าH(Q,X) = haltเราไม่สามารถบอกได้ว่าP(X)ทำอะไรเพราะไม่ว่าจะP(X)หยุดพักขึ้นอยู่กับสิ่งที่H(X,X)ส่งคืน เราติดอยู่ อย่างไรก็ตามหากเรารู้P(X)และX(X)เป็นเช่นเดียวกันเราสามารถสร้างความก้าวหน้าได้ (ดังนั้นเราควรจะใช้จริงๆX = P)
  • ถ้าแล้วเราจะติดอยู่อีกครั้งและเราจะพังถ้าH(Q,a) = loopX = P

ไม่มี QED

ฉันหวังว่าสิ่งนี้แสดงให้เห็นว่าเราต้องพิจารณาH(P,P)เพื่อให้ความคิดของเราทำงานได้


Haha. Awesome! :)
aelguindy

2

The upshot of the proof is this analogy:

If a person P claims s/he(P) can recognize the sentiment of every person P when s/he(P) sees something, then ask the claimant P to emulate the opposite of that sentiment in everyone s/he(P) sees. And then put her/him(P) in front of a mirror. S/he(P) will just not know what sentiment to express. 🙂

The subscripts (P) and (P) are used to disambiguate the pronouns.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.