มีส่วนย่อยของโปรแกรมที่หลีกเลี่ยงปัญหาการหยุดชะงักหรือไม่


21

ฉันเพิ่งอ่านคำอธิบายของปัญหาการหยุดพักอีกและมันทำให้ฉันคิดว่าปัญหาทั้งหมดที่ฉันเห็นที่ได้รับเป็นตัวอย่างที่เกี่ยวข้องกับลำดับอนันต์ แต่ฉันไม่เคยใช้ลำดับที่ไม่มีที่สิ้นสุดในโปรแกรมของฉัน - มันใช้เวลานานเกินไป แอปพลิเคชันในโลกแห่งความเป็นจริงทั้งหมดมีขอบเขตที่ต่ำและสูงกว่า แม้ reals ไม่ใช่ reals อย่างแท้จริง - มันเป็นค่าประมาณ 32/64 บิตเป็นต้น

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

โดยธรรมชาติแล้วโครงสร้างที่เพียงพอจะต้องไม่รวมการเรียกซ้ำและไม่ได้ถูก จำกัด ในขณะที่ลูป แต่ฉันสามารถเขียนโปรแกรมได้โดยไม่ต้องมีความสะดวกเพียงพอ

การอ่านจากอินพุตมาตรฐานเป็นตัวอย่างจะต้องถูก จำกัด แต่ก็ง่ายพอ - ฉันจะ จำกัด การป้อนข้อมูลของฉันเหลือ 10,000,000 ตัวอักษรขึ้นอยู่กับโดเมนปัญหา

TIA

[Update]

หลังจากอ่านความคิดเห็นและคำตอบบางทีฉันควรทบทวนคำถามอีกครั้ง

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

[อัพเดท 2]

นี่คือคำตอบคือใช่ย้อนกลับไปในปี 1967 จากhttp://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf

ปัญหาการหยุดชะงักอย่างน้อยในทางทฤษฎีสามารถแก้ไขได้สำหรับระบบ fi nite-state ได้รับการถกเถียงกันโดย Minsky ในปี 1967 [4]: ​​"... เครื่อง ite nite-state ใด ๆ หากปล่อยให้ตัวเองสมบูรณ์ รูปแบบซ้ำ ๆ ระยะเวลาของรูปแบบการทำซ้ำนี้ต้องไม่เกินจำนวนสถานะภายในของเครื่อง ... "

(และถ้าคุณติดกับเครื่องจักรทัวริง จำกัด คุณสามารถสร้าง oracle ได้)


13
"ลำดับไม่สิ้นสุด ... ใช้เวลานานเกินไป" ทำให้ฉันหัวเราะออกมาดัง ๆ
ไบรอัน Oakley

3
ฉันเชื่อว่า SQL92 และนิพจน์ทั่วไปเป็นตัวอย่างของภาษาที่รับประกันว่าจะหยุด
Elian Ebbing

2
กรุณาโพสต์ "Update2 ... " เป็นคำตอบ
S.Lott

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

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

คำตอบ:


8

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

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

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


10

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

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

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


2
หนึ่งสามารถมีคำสั่ง if หากการกระโดดจะต้องมีการส่งต่อไม่เคยย้อนกลับ ฉันคิดว่าเซตย่อยของภาษาเบสิกที่ จำกัด ซึ่ง "GOTO X" หมายถึงไปที่หมายเลขบรรทัด currentLine + X และ X ต้องมากกว่า 0 ถ้าบรรทัดไม่ถูกต้องให้หยุด สิ่งนี้จะเพิ่มความต้องการในการจัดเก็บข้อมูล แต่จะช่วยให้ตรรกะที่ไม่สำคัญบางอย่าง นี่อาจเทียบเท่ากับเครื่องสถานะ จำกัด ที่จุดยอดเป็นกราฟและกราฟนั้นอาจไม่มีวัฏจักรใด ๆ มิฉะนั้น FSM จะไม่ถูกต้อง นอกจากนี้รัฐใด ๆ ที่เป็นจุดจบจะต้องเป็นสถานะที่ยอมรับได้
งาน

3
มันอาจมีลูปที่มีขอบเขต - ตัวอย่างเช่น i = 1 ถึง 10 นั้นตัววนซ้ำที่ทำงานได้ดีเช่นกัน ดังนั้นมีปัญหา จำกัด จำนวนหนึ่งที่สามารถแก้ไขได้ - ทฤษฎีบทเฟอร์แมทเกี่ยวข้องกับลำดับเรียลของอนันต์อีกครั้ง แต่ถ้าเรา จำกัด โดเมนให้มีตัวเลขน้อยกว่า 1,000,000 ก็จะหยุด
daven11

2
ทำไมไม่มีเงื่อนไข ดูเหมือนว่าสภาพที่ไม่มีการกระโดดสามารถแสดงให้หยุดได้เสมอ ...
Billy ONeal

2
@ นิกกี้: แน่นอนมันเป็นข้อโต้แย้งที่อ่อนแอ ประเด็นก็คือว่าเช่นเครื่องตรวจจับที่ลังเลจะสามารถพิสูจน์หรือพิสูจน์หักล้างงบดังกล่าวโดยไม่จำเป็นในการหาหลักฐาน ปรีชาที่ฉันตั้งใจจะให้ผู้อ่านพัฒนาที่นี่คือภาษาที่เครื่องตรวจจับการหยุดชะงักเล็กน้อยสามารถเขียนได้เป็นภาษาที่ไม่สามารถแสดงปัญหาที่ง่ายแม้แต่ในทฤษฎีจำนวนเช่นทฤษฎีบทสุดท้ายของแฟร์มาต์หรือการคาดเดาของโกลด์บัค ภาษาที่มีประโยชน์มาก
Eric Lippert

3
@EricLippert: ผิด ภาษาดังกล่าวจะมีลูปการจัดเก็บที่เหมาะสมและสิ่งที่มีประโยชน์อื่น ๆ อีกมากมาย มันเป็นไปได้ที่จะเขียนโค้ดเกือบทุกอย่าง ดูเถิด, นี่คือ: coq.inria.fr
SK-logic

6

ผมขอแนะนำให้คุณอ่านGödel, Escher โสด มันเป็นหนังสือที่สนุกและให้ความกระจ่างซึ่งเหนือสิ่งอื่นใดที่สัมผัสกับทฤษฎีบทที่ไม่สมบูรณ์ของGödelและปัญหาการหยุดชะงัก

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


ขออภัยฉันอ่านผิด ฉันลบความคิดเห็นของฉันแล้ว แต่ฉันจะทบทวนข้อเสนอแนะของ GEB
AProgrammer

@zvrba อยู่ในรายการเรื่องรออ่านของฉันมาระยะหนึ่งแล้ว - อาจถึงเวลาดำน้ำแล้ว
daven11

5

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

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


3

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

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

ตัวอย่างเช่นปัญหาการหยุดชะงักสามารถแก้ไขได้ในเวลาพหุนามสำหรับอินพุตส่วนใหญ่ (อันที่จริงแล้วในเวลาเชิงเส้นถ้าฉันเข้าใจกระดาษอย่างถูกต้อง)

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

ประการที่สองคุณต้องระวังความหมายของ 'อินพุตมากที่สุด' หมายความว่าความน่าจะเป็นที่โปรแกรมสุ่มของ 'ความยาว' n สามารถตรวจสอบได้โดยอัลกอริทึมนี้มีแนวโน้มที่ 1 เนื่องจาก n มีแนวโน้มที่จะไม่มีที่สิ้นสุด กล่าวอีกนัยหนึ่งถ้า n มีขนาดใหญ่พอโปรแกรมแบบสุ่มที่มีความยาว n สามารถตรวจสอบได้ด้วยอัลกอริทึมนี้

โปรแกรมใดบ้างที่สามารถตรวจสอบได้โดยวิธีการที่อธิบายไว้ในเอกสาร โดยพื้นฐานแล้วโปรแกรมทั้งหมดที่หยุดก่อนที่จะทำซ้ำสถานะ (โดยที่ 'สถานะ' โดยประมาณจะสอดคล้องกับบรรทัดของรหัสในโปรแกรม)

แม้ว่าโปรแกรมเกือบทั้งหมดสามารถตรวจสอบได้ด้วยวิธีนี้ แต่ไม่มีโปรแกรมใดที่สามารถตรวจสอบด้วยวิธีนี้มีความน่าสนใจมากและโดยทั่วไปจะไม่ได้รับการออกแบบโดยมนุษย์ดังนั้นนี่จึงไม่มีคุณค่าในทางปฏิบัติใด ๆ

นอกจากนี้ยังระบุว่าความซับซ้อนของกรณีทั่วไปอาจไม่สามารถช่วยเราได้ในปัญหาการหยุดชะงักเนื่องจากโปรแกรมที่น่าสนใจเกือบทั้งหมดตรวจสอบได้ยาก หรืออีกนัยหนึ่งคือเกือบทุกโปรแกรมไม่มีความน่าสนใจ แต่ง่ายต่อการตรวจสอบ


2
-1 นี่เป็นสิ่งที่ผิดในหลาย ๆ ระดับ ...
281377

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

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

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

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

3

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

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

ข้อสันนิษฐานในทั้งสองกรณีนี้คือเครื่องหยุดไม่ติดตามเนื่องจากไม่มีหลักฐานว่ามีร่องรอย อย่างไรก็ตามในความเป็นจริงแล้วมันจะทำการติดตาม / เรียกใช้โปรแกรมที่มันรันด้วยอินพุตที่กำหนด

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

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

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

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


1

นี่คือคำตอบคือใช่ย้อนกลับไปในปี 1967 จากhttp://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf

ปัญหาการหยุดชะงักอย่างน้อยในทางทฤษฎีสามารถแก้ไขได้สำหรับระบบ fi nite-state ได้รับการถกเถียงกันโดย Minsky ในปี 1967 [4]: ​​"... เครื่อง ite nite-state ใด ๆ หากปล่อยให้ตัวเองสมบูรณ์ รูปแบบซ้ำ ๆ ระยะเวลาของรูปแบบการทำซ้ำนี้ต้องไม่เกินจำนวนสถานะภายในของเครื่อง ... "

(และถ้าคุณติดกับเครื่องจักรทัวริง จำกัด คุณสามารถสร้าง oracle ได้)

แน่นอนว่าต้องใช้เวลานานเท่าไรจึงจะเป็นอีกคำถามหนึ่ง


0

มีชุดย่อยของโปรแกรมที่สามารถกำหนดได้หากพวกเขาหยุด?

ใช่.

มันดีพอสำหรับโปรแกรมส่วนใหญ่หรือไม่?

กำหนด "มากที่สุด"

ฉันสามารถสร้างชุดภาษาสร้างที่ฉันสามารถกำหนด 'haltability' ของโปรแกรมได้หรือไม่

ใช่.

มีสิ่งที่เกือบทัวริงสมบูรณ์ซึ่งดีพอหรือไม่

กำหนด "เกือบ"

หลายคนเขียน Python โดยไม่ต้องใช้whileคำสั่งหรือเรียกซ้ำ

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

มันค่อนข้างง่ายที่จะหลีกเลี่ยงwhileและเรียกซ้ำ


สำหรับโปรแกรมที่กำหนดซึ่งอินพุตทั้งหมดถูก จำกัด ขอบเขตคุณสามารถพิจารณาได้ว่าโปรแกรมหยุดทำงานหรือไม่?

เลขที่

ถ้าเป็นเช่นนั้นข้อ จำกัด ของภาษาคืออะไรและอะไรคือข้อ จำกัด ของชุดอินพุต

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

วิธีการมาตรฐานในการหยุดปัญหาคือเพื่อให้การพิสูจน์ใช้ชุดคณิตศาสตร์ที่มีความสมบูรณ์ยิ่งขึ้นกว่าในภาษาการเขียนโปรแกรม

การขยายระบบพิสูจน์ง่ายกว่าการ จำกัด ภาษา ข้อ จำกัด ใด ๆ นำไปสู่ข้อโต้แย้งสำหรับอัลกอริธึมเดียวที่ยากต่อการแสดงออกเนื่องจากข้อ จำกัด

ชุดสูงสุดของโครงสร้างเหล่านี้จะกำหนดภาษาที่สามารถอนุมานได้ว่าจะหยุดหรือไม่ มีการศึกษาบางอย่างที่ทำกับสิ่งนี้หรือไม่?

ใช่. มันเรียกว่า "ทฤษฎีกลุ่ม" ชุดของค่าปิดภายใต้ชุดของการดำเนินการ สิ่งที่เข้าใจกันดี


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

เก็บไว้ในใจforห่วงคือx < 42ในขณะที่ห่วงและคนมักจะนำสิ่งที่มีความซับซ้อนมากขึ้นในระยะเงื่อนไขที่มากกว่าเพียงแค่
Billy ONeal

@BillyONeal: จุดดี ใน Python การforวนซ้ำนั้นมีข้อ จำกัด อย่างมากในการทำงานผ่านตัววนซ้ำ อย่างไรก็ตามการforวนซ้ำทั่วไปใน Java สามารถรวมเงื่อนไขเพิ่มเติมที่ทำให้การใช้งานตัววนซ้ำง่าย ๆ
S.Lott

"มีปัญหาที่แน่นอนซึ่งโปรแกรมสามารถกล่าวได้หยุดหรือไม่" คำตอบยังคงใช่ "ปัญหามีการตั้งค่า จำกัด เพียงใด" หนอ จำกัด แน่นอน หากคุณยอมแพ้ในการพยายามประมาณจำนวนจริงและยึดตามจำนวนธรรมชาติซึ่งปิดอยู่ภายใต้การดำเนินการทางคณิตศาสตร์ทั้งหมดคุณกำลังทำทฤษฎีกลุ่มสามัญ เลขคณิตแบบแยกส่วน ไม่มีอะไรพิเศษ. มันไม่ชัดเจนในสิ่งที่คุณถาม คุณกำลังถามว่าเลขคณิตแบบแยกส่วนคืออะไร?
S.Lott

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