เรารู้อะไรบ้างเกี่ยวกับปัญหาการหยุดใช้งานเวอร์ชันที่ จำกัด


16

( อัปเดต : คำถามที่มีรูปแบบที่ดีกว่าถูกโพสต์ที่นี่เนื่องจากความคิดเห็นสำหรับคำตอบที่ยอมรับด้านล่างแสดงว่าคำถามนี้ไม่ได้กำหนดไว้อย่างดี)


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

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

คำถามคือ:

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

UPDATE

บางทีการปฏิรูปที่ดีขึ้นของสิ่งที่ฉันเป็นความเข้าใจที่ดีขึ้นของสิ่งที่กำหนดชุดที่ตัดสินใจได้ ฉันพยายามแยกการพิสูจน์ความไม่แน่นอนแบบคลาสสิกออกมาเพราะมันไม่ได้เพิ่มข้อมูลใด ๆ เกี่ยวกับความเด็ดเดี่ยวยกเว้นกรณีที่คุณเรียกใช้ HALT ด้วยตัวเอง

ความเป็นมา: สมมติว่าความขัดแย้งมีเครื่องทัวริงที่สามารถตัดสินใจอินพุตซึ่งเป็นการเข้ารหัสสำหรับเครื่องทัวริงและไม่ว่าหยุดทำงานหรือไม่ จากนั้นให้พิจารณาเครื่องจักรทัวริงที่ใช้และและใช้เพื่อตัดสินใจว่าหยุดหรือไม่แล้วทำตรงกันข้ามคือหยุดถ้าหยุดและไม่หยุดถ้าหยุด จากนั้นแสดงให้เห็นถึงความขัดแย้งเช่นเดียวกับMQMM ( X ) K M X Q M ( X ) K M ( X ) M ( X ) K ( K ) KXM(X)KMXQM(X)KM(X)M(X)K(K)K ควรหยุดถ้าไม่หยุดและไม่หยุดเมื่อหยุด

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

UPDATE

จากความคิดเห็นด้านล่างฉันได้อธิบายความหมายของเครื่องทัวริงที่ไม่อ้างอิงตนเอง

เป้าหมายคือการกำหนดเป็นชุดที่ไม่นำไปสู่ความขัดแย้งที่เกิดขึ้นในการพิสูจน์ (cf. "เบื้องหลัง" ด้านบน) มันอาจถูกกำหนดไว้ดังนี้:

สมมติว่ามีเครื่องทัวริงที่ตัดสินปัญหาการหยุดชะงักสำหรับชุดเครื่องทัวริงSดังนั้นSจะไม่อ้างอิงตัวเองสำหรับQหากไม่รวมเครื่องทั้งหมดที่เรียกใช้QบนS (โดยตรงหรือโดยอ้อม) (ชัดเจนซึ่งหมายความว่าQไม่สามารถเป็นสมาชิกของSได้)QSSQQSQS

หากต้องการชี้แจงเกี่ยวกับความหมายโดยการเรียกใช้บนSทางอ้อม:QS

การเรียกบนSนั้นแทนด้วยเครื่องทัวริงQ ที่มีชุดของสถานะและอินพุตเริ่มต้นที่แน่นอนที่เป็นไปได้บางอย่างบนเทป (ตรงกับสมาชิกของSใด ๆ) โดยมีหัวเริ่มต้นที่จุดเริ่มต้นของอินพุตนั้น เครื่องWจะเรียกQบนS "อ้อม" ถ้ามี ( จำกัด ) ลำดับขั้นตอนที่Wจะใช้เวลาที่จะทำให้การกำหนดค่าของ "homomorphic" เพื่อกำหนดค่าเริ่มต้นของQ ( S )QSQSWQSWQ(S)

อัพเดท 2

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

อัพเดท 3

ความหมายของทัวริงเครื่อง homomorphism:

TM A คือโฮโมมอร์ฟิคถึง TM B หากกราฟการเปลี่ยนแปลงของ A คือโฮโมมอร์ฟิคกับของ B ในความหมายมาตรฐานของโฮโมมอร์ฟิซึมของกราฟด้วยโหนดที่มีป้ายกำกับและขอบ กราฟการเปลี่ยนแปลง (V, E) ของ TM เป็นเช่นนั้น V = สถานะ E = ช่วงการเปลี่ยนภาพระหว่างรัฐ แต่ละส่วนโค้งจะถูกระบุด้วยสัญลักษณ์ (S, W, D), S = อ่านเทปและ W = สัญลักษณ์ที่จะเขียนลงไปและ D = ทิศทางที่การแสดงของหัวย้ายไป


5
"ชุดการอ้างอิงที่ไม่อ้างอิงตนเอง" ที่เหลือก่อนที่ฉันจะพูดถึงเรื่องนี้อย่างสมเหตุสมผลฉันต้องการคำจำกัดความของ "การอ้างอิงตนเอง" อย่างไรก็ตามฉันคิดว่ามันจะเป็นเรื่องยากที่จะกำหนด?
Sam Nead

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

1
วิสัย Alaggan ตอนนี้ฉันต้องการคำจำกัดความของ "เรียกบนSทางอ้อม" ซึ่งฉันสงสัยว่าเป็นเรื่องยากที่จะนิยามได้ว่าเป็น "การอ้างอิงตนเอง" ดั้งเดิม :)QS
Rob Simmons

2
สิ่งนี้ทำให้เกิดคำถามที่น่าสนใจ: หลักฐานทั้งหมดที่ไม่สามารถคำนวณได้ มีการพิสูจน์ความไม่แน่นอนใด ๆ ที่ไม่ได้พึ่งพาวิธีการทแยงมุมโดยตรงหรือโดยอ้อม?
Mohammad Al-Turkistany

2
คำถามที่อาจเป็นไปได้: มีทฤษฎีความสลับซับซ้อนของทฤษฎีบท rices ในทฤษฎีการคำนวณหรือไม่? , MO: ครบถ้วนปัญหาที่ยากที่สุดที่ง่ายที่สุด
Kaveh

คำตอบ:


9

ฉันคิดว่าจะต้องใช้เวลาอีกเล็กน้อยกว่าจะได้คำถามที่ "ชัดเจน" โดยเฉพาะนี่เป็นปัญหา:

การเรียก Q บน S นั้นแทนด้วยเครื่องทัวริง Q ที่มีชุดของสถานะและอินพุตเริ่มต้นที่แน่นอนที่เป็นไปได้บางอย่างบนเทป (ตรงกับสมาชิกของ S ใด ๆ ) โดยเริ่มต้นที่หัวของอินพุตนั้น เครื่อง W เรียก Q บน S "ทางอ้อม" หากมีลำดับ (จำกัด ) ของขั้นตอนที่ W จะใช้เพื่อทำให้การกำหนดค่า "homomorphic" เป็นค่าเริ่มต้นของ Q (S)

ปัญหาหนึ่งคือมีเครื่องทัวริงจำนวนมากซึ่งคำนวณฟังก์ชันเดียวกัน ในการโต้แย้งแนวทแยงมุมมาตรฐานฉันสามารถแทนที่รูทีนย่อย Q ด้วย decider อีกอันสำหรับ HALT เนื่องจากมีพวกมันมากมาย หรือฟังก์ชั่นที่เทียบเท่ากับ HALT ดังนั้นจึงไม่ชัดเจนเลยสำหรับฉันที่จะนิยามความคิดของคุณเกี่ยวกับ "การร้องขอทางอ้อม"

อาจมีคำถามที่แตกต่างกัน: สำหรับชุดทัวริงของปัญหาการหยุดทำงานที่สามารถตัดสินใจได้? ที่นี่มีคำตอบมากมาย: ทรัพยากรที่ จำกัด TM (เช่นใช้พื้นที่ f (n) เท่านั้นโดยที่ f คือฟังก์ชันที่คำนวณได้บางส่วน), TM ที่ถูก จำกัด การใช้งานด้วยวิธีการบางอย่าง (เช่นหัวอ่านเคลื่อนที่เพียงทางเดียว) ฯลฯ แต่คำถามที่น่าสนใจอีกข้อหนึ่งคือการเป็นสมาชิกในชุดที่ จำกัด นั้นสามารถตัดสินใจได้หรือว่าคุณต้อง จำกัด ตัวเองกับ "สัญญาปัญหา" ซึ่งคุณจะรับประกันเฉพาะคำตอบที่ถูกต้องในชุดย่อยของอินพุต "สัญญา" แต่ไม่ยืนยัน การเป็นสมาชิก


โอเคดีลองทำสิ่งนี้: ให้ H เป็นเซต (อนันต์) ของทัวริงทั้งหมดที่เทียบเท่ากับ HALT แล้วแทนที่QของฉันQกับHH
M. Alaggan

มันไม่ง่ายอย่างนั้น คำจำกัดความของคุณขัดแย้งกันในขณะนี้เนื่องจากคุณกำลังมองหา HALT ที่คำนวณได้ แต่ถ้านี่คือการคำนวณฟังก์ชั่นการคำนวณใด ๆ ที่เทียบเท่ากับมัน แต่ถ้าชุดอินพุตของคุณมีปัญหากึ่งคำนวณ (TM) คุณจะมีความขัดแย้งตั้งแต่การตัดสินใจปัญหาการหยุดพักสำหรับ TM นั้นจะให้ขั้นตอนการตัดสินใจสำหรับปัญหานั้น
Mark Reitblatt

1) HALT ที่ไม่สามารถคำนวณได้หมายถึงความไม่แน่นอนหรือไม่? ฉันสมมติว่า HALT ที่คำนวณได้นี้มีอยู่โดยหวังว่าจะมีความขัดแย้ง 2) ฉันไม่คุ้นเคยกับแนวคิดที่ว่าฟังก์ชั่นที่คำนวณได้ทั้งหมดนั้นเทียบเท่ากับฟังก์ชั่นอื่น ๆ ฉันอ้างถึงคุณและหมายความว่ามันเป็นฟังก์ชั่นที่ช่วยแก้ปัญหา HALT Apparently λx.1นั้นคำนวณได้ แต่มันไม่ได้ตัดสินใจว่า HALT โปรดแก้ไขให้ฉันถ้าฉันผิดโปรด เกี่ยวกับปัญหากึ่งคำนวณ HALT อาจใช้ขั้นตอนจำนวนอนันต์ซึ่งจะไม่นำไปสู่ความขัดแย้งในหลักฐานดั้งเดิมที่ HALT ไม่สามารถตัดสินใจได้
M. Alaggan

1) ถูกต้อง แต่ปัญหากำลังพยายามกำหนดความคิดของคุณของ "การอ้างอิงตนเอง" ไม่ว่าจะเป็นข้อ จำกัด ที่อ่อนแอซึ่งทำให้เกิดเส้นทแยงมุมในขณะที่ฉันโต้เถียงหรือเป็นข้อ จำกัด ที่แข็งแกร่งซึ่งกำจัดทุกอย่าง 2) มันง่าย "เทียบเท่าที่คำนวณได้" หมายความว่ามีการทำแผนที่ที่คำนวณได้จากที่หนึ่งไปยังอีกที่ที่รักษาคำตอบ แต่ถ้าฉันสามารถคำนวณคำตอบฉันสามารถโกงและทำให้การทำแผนที่เล็กน้อย 3) ถ้า TM ตัดสินใจ HALT ไม่ยุติตัวเองมันไม่ใช่ Decider สำหรับ HALT
Mark Reitblatt

อย่างอื่นที่ทำให้สับสนเล็กน้อยก็คือความสับสนของ TM กับปัญหาการตัดสินใจที่คำนวณโดยพวกเขา ไม่ใช่เรื่องปกติที่จะพูดถึง TM ที่มีค่าเทียบเท่ากับคอมพิวเตอร์ ค่อนข้างฟังก์ชั่นที่คำนวณโดยพวกเขาสามารถเทียบเท่า (หรือเท่ากับ) ปัญหาคือการพยายามบอกว่า TM ไม่ได้จำลอง TM แบบอื่นยากที่จะนิยามโดยทั่วไปโดยไม่ให้อะไรที่เป็นรูปธรรมเพื่อแยกฟังก์ชั่นที่คำนวณโดยพวกเขา ตัวอย่างเช่น Log-space TM ไม่สามารถจำลอง TM เพื่อแก้ปัญหา EXP-space
Mark Reitblatt

9

หากฉันเข้าใจแรงจูงใจของคุณอย่างถูกต้องดูเหมือนว่านี่เป็นปัญหา "ความถูกต้องของคอมไพเลอร์" มากกว่าปัญหา "ปัญหาการหยุดชะงักที่ จำกัด " คุณมีคุณสมบัติ (เลิกจ้าง) ที่คุณพิสูจน์แล้วสำหรับบางโปรแกรมระดับแหล่งProgที่คุณต้องการจากนั้นขยายไปยังรหัสเรียบเรียงเพื่อให้ได้คุณสมบัติเดียวกันของคอมไพล์ (Prog) แต่คอมไพเลอร์สามารถ (โดยทั่วไป) ทำสิ่งที่โง่ ๆ โดยพลการเช่นใช้รันไทม์ที่สมบูรณ์แบบ (พูด JVM) รวบรวมโปรแกรมการยุติของคุณให้เป็น JVM bytecode จากนั้นก็ถ่ายโอนไฟล์ปฏิบัติการที่เริ่มต้น JVM และดึงข้อมูลมันด้วย

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

ทางเลือกหนึ่งคือการมีคอมไพเลอร์ที่ใช้เป็นอินพุตโปรแกรม Progและการพิสูจน์สิ้นสุด (Prog)และผลลัพธ์ที่คอมไพล์ (Prog)และยุติ (คอมไพล์ (Prog)) - หลังเป็นหลักฐานที่สามารถตรวจสอบซ้ำได้อย่างอิสระ คอมไพเลอร์ กระดาษคลาสสิกในเรื่องนี้คือ Necula และ Lee's การออกแบบและการใช้งานคอมไพเลอร์ที่ได้รับการรับรองนั้นผมเชื่อว่า

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

(PS ฉันหวังว่าคำตอบนี้มีประโยชน์ - ฉันรู้ว่ามันค่อนข้างแตกต่างจากคำถามที่คุณถามดังนั้นแจ้งให้เราทราบหากฉันออกนอกฐานและ / หรือทำซ้ำสิ่งที่คุณรู้อยู่แล้ว)


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