ปัญหาการหยุดชะงักสามารถตัดสินใจได้สำหรับโปรแกรมแท้ ๆ ในคอมพิวเตอร์ในอุดมคติหรือไม่?


25

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

อันที่จริงแล้วเป็นกรณีนี้หรือไม่? หากไม่เป็นเช่นนั้นตัวอย่างเอกสารหรือหลักฐานที่หักล้างข้อเรียกร้องนี้มีอะไรบ้าง


35
โปรดทราบว่าการพิสูจน์มาตรฐานว่าปัญหาการหยุดชะงักไม่สามารถตัดสินใจได้ (เช่นปัญหาที่อธิบายไว้ในวิกิพีเดีย: en.wikipedia.org/wiki/Halting_problem#Sketch_of_proof ) ทั้งหมดทำงานกับรูปแบบการคำนวณที่ไม่ได้เป็นตัวแทนของ I / O และในขณะที่เช่นทัวริงเครื่องจักรเป็นสภาวะพฤติกรรมของพวกเขาถูกกำหนดอย่างเป็นทางการในแง่ของฟังก์ชั่นบริสุทธิ์ ดังนั้นในบางแง่ "โปรแกรมที่บริสุทธิ์บนคอมพิวเตอร์ในอุดมคติ" นั้นจริงๆแล้วการตั้งค่าที่ปัญหาการหยุดชะงักมักจะพิสูจน์ได้ว่าไม่สามารถตัดสินใจได้
Ben

1
คุณทำวิจัยอะไร Googling "ปัญหาการหยุดชะงัก" ควรตอบคำถามนี้ให้คุณแล้ว
Jonathan Cast

คำตอบ:


38

นี่เป็นข้อพิสูจน์ถึงความไม่แน่นอนโดยการลดปัญหาการหยุดชะงัก

การลดลง:ให้เครื่องและอินพุตสร้าง Turing Machineซึ่งไม่ได้อ่านอินพุตใด ๆ แต่เขียนและบนเทปและจำลองบนจนกระทั่งหยุดทำงานMxHMxMxM

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



@HendrikJan อย่างแม่นยำ!
Lieuwe Vinkhuijzen

16

ไม่มันไม่ใช่และยิ่งไปกว่านั้นมันไม่ได้ขึ้นอยู่กับ I / O

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


18
ฉันไม่เห็นประเด็นในคำตอบนี้ เพียงเพราะในปัจจุบันเราไม่ทราบว่ามีจำนวนดังกล่าวไม่ได้หมายความว่ามันไม่ได้และในอนาคตเราก็ไม่สามารถเขียนตัววิเคราะห์สแตติกที่สามารถตัดสินใจได้ ทางเลือกที่ดีกว่าคือการใช้ปัญหาที่ไม่อาจทราบได้บางอย่าง ตัวอย่างเช่นเป็นที่ทราบกันดีว่าไม่มีโปรแกรมใดที่สามารถแก้สมการไดโอแฟนไทน์ได้ทั้งหมดและการแก้สมการนี้เป็นงานที่คล้ายกับที่แสดงในคำตอบ
Bakuriu

2
ทีนี้ถ้าปัญหาการหยุดชะงักสามารถตัดสินใจได้แล้วทุกปัญหาจะสามารถตัดสินใจได้ถ้าเราสามารถใส่มันลงในแบบฟอร์มที่เราถามว่าโปรแกรมหยุดหรือไม่ หรือคำถามใด ๆ ของแบบฟอร์ม: มีชุดนับได้และฉันสามารถตัดสินใจได้ว่าองค์ประกอบที่เป็นไปได้ใด ๆ ของแต่ละบุคคลอยู่ในชุดหรือไม่ ชุดว่างเปล่าหรือไม่? สมการไดโอแฟนไทน์มีชุดของคำตอบที่เป็นไปได้มากมายและฉันสามารถตรวจสอบว่าแต่ละคำตอบที่เป็นไปได้นั้นเป็นคำตอบหรือไม่ หากปัญหาการหยุดชะงักคือการตัดสินใจได้สมการไดโอแฟนไทน์จะถูกตัดสินได้
gnasher729

10
@ gnasher729 ใช่และเนื่องจากพวกเขาไม่ใช่ปัญหาการหยุดชะงักไม่สามารถตัดสินใจได้ นั่นคือจุดของฉัน ในขณะที่คำสั่งในคำตอบนี้ไม่มีความหมายจริง: "พิจารณาคำจำกัดความทางคณิตศาสตร์นี้ในขณะนี้เราไม่มีความคิดว่าโปรแกรมที่จะตัดสินใจว่าจะหยุดหรือไม่ % ความหมาย "
Bakuriu

6
นี่ไม่ใช่กรณีที่คล้ายกันกับวิธีสามารถตัดสินใจได้ว่าπมีลำดับของตัวเลขหรือไม่ ปัญหาการหยุดชะงักไม่สามารถตัดสินใจได้ในคลาสของปัญหาไม่ใช่ปัญหาเดียว
npostavs

2

การพิสูจน์แบบคลาสสิกโดยการทแยงมุม เป็นเครื่องที่บริสุทธิ์ไม่เพียง แต่เป็นเครื่องทัวริงที่บริสุทธิ์ แต่ไม่ได้พึ่งพา "ปัญหาเปิด"

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

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


0

สำหรับบันทึกหลักฐานการพิสูจน์ความไม่ได้มาตรฐานของปัญหาการหยุดชะงักนั้นขึ้นอยู่กับความคิดเดียวกับ quines: เป็นไปได้ที่จะเขียนโปรแกรมบางคำศัพท์ย่อยซึ่งประเมินเป็นซอร์สโค้ดสำหรับโปรแกรมทั้งหมด จากนั้นหากมีฟังก์ชั่นhaltsที่ให้ซอร์สโค้ดสำหรับโปรแกรมคืนค่า True หากโปรแกรมนั้นหยุดในอินพุตทั้งหมดและ False มิฉะนั้นจะเป็นโปรแกรมทางกฎหมาย:

prog() = if halts "prog" then prog() else ()

ที่"prog"จะแสดงออกบางอย่างที่ประเมินเพื่อซอร์สโค้ดสำหรับprog; อย่างไรก็ตามคุณจะเห็นได้อย่างรวดเร็วว่าprogหยุด (สำหรับอินพุตทั้งหมด) ถ้าไม่หยุดซึ่งเป็นความขัดแย้ง ไม่มีสิ่งใดในหลักฐานนี้ที่ต้องอาศัย I / O ในทางใดทางหนึ่ง (คุณต้องการให้ I / O เขียนควินินหรือไม่)

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

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