ขีด จำกัด ของการเขียนโปรแกรมฟังก์ชั่นรวมคืออะไร?


19

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

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

คำตอบ:


16

ขึ้นอยู่กับภาษาที่ใช้งานทั้งหมด

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

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

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

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

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


ขอบคุณสำหรับคำตอบ. การรวมกันค่อนข้างช่วย แต่ก็ยังเป็นปัญหาที่ยากมาก สิ่งที่ฉันหมายถึงกับ "ทุกสิ่งที่เป็นไปได้ในทางทฤษฎีจะถูกกำหนดแบบคงที่สามารถกำหนดแบบคงที่" ก็คือมันจะเป็นไปได้ยากมากหรือไม่ในการวิเคราะห์ความสัมพันธ์ทั้งหมดระหว่างอินพุตและเอาต์พุตถ้าคุณมีทรัพยากรเพียงพอที่จะทำเช่นนั้น . หรือเหตุผลพื้นฐานที่ว่าทำไมถึงมีข้อ จำกัด ? เช่นเดียวกับ Theorm's theorm พิสูจน์ว่านี่เป็นกรณีของฟังก์ชั่นบางส่วน หรือฉันเข้าใจทฤษฎีบทของ Rice หรือไม่
Matthijs Steen

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

(โอ๊ะ; กด Enter ตั้งใจ) ... แต่นี้เปิดขึ้นเคล็ดลับโง่อีกเพราะผมสามารถถามคำถามที่ตัดสินไม่ได้เกี่ยวกับการทำงานประจำตัวถ้าฉันต้องการ "สำหรับบางคนXเป็น(identity X)เครื่องทัวริงที่หยุด?" แน่นอนว่าดูเหมือนจะไม่เกี่ยวกับ identityแต่คุณจะกำหนด "เกี่ยวกับ" อย่างไร
พอลสแตนซิเฟอร์

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

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

16

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

LLL

  1. LLLLมีความสอดคล้อง นี่เป็นเพียงสิ่งที่ทฤษฎีบทของ Goedel ออกมาสมมติว่าคุณสามารถทำเลขคณิตได้ ดังนั้นเราจึงรู้ว่าเราไม่สามารถเขียนตัวแปลภาษาเป็นภาษาที่ใช้งานได้ทั้งหมด

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

  3. ด้านพลิกของด้านพลิกคือคณิตศาสตร์ยาก! ดังนั้นจึงไม่มีความรู้สึกว่าภาษาทั้งหมดนั้น "วิเคราะห์ได้อย่างสมบูรณ์" - แม้ว่าคุณจะรู้ว่าฟังก์ชั่นนั้นสิ้นสุดลงคุณอาจต้องทำงานสร้างสรรค์มากมายเพื่อพิสูจน์ว่ามันมีคุณสมบัติที่คุณต้องการ ตัวอย่างเช่นเพียงแค่รู้ว่าฟังก์ชั่นจากรายการไปยังรายการทั้งหมดไม่ได้ช่วยให้คุณพิสูจน์ว่ามันเป็นฟังก์ชั่นการเรียงลำดับ ...


ขอบคุณสำหรับคำตอบ. ฉันได้อ่านโพสต์เกี่ยวกับปัญหานี้ที่Lambda the Ultimate weblogแต่บางคนในความคิดเห็นระบุว่าถึงแม้ว่ามันจะเป็นไปไม่ได้ที่จะมีผู้ประเมินของตัวเองเป็นคำศัพท์ที่สร้างขึ้นได้อย่างชัดเจนปกติก็เป็นไปได้ ผู้ประเมินด้วยเทคนิคบางอย่าง ดังนั้นฉันสงสัยว่ามีปัญหาที่ไม่สามารถแก้ไขได้ (หรือประมาณ) ในภาษาที่ใช้งานได้ทั้งหมดด้วยเทคนิคการออกนอกเส้นทางบ้างไหม?
Matthijs Steen

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

ตอนนี้ดูเหมือนว่าควรจะง่ายกว่านั้นมากเพื่อพิสูจน์ว่าภาษาทั้งหมดไม่สามารถรองรับล่ามของมันเอง ฉันเข้าใจคุณผิดหรือเปล่า? การใช้เส้นทแยงมุมอย่างง่ายภาษาใด ๆ ที่มีฟังก์ชั่นที่ไม่มีจุดคงที่ไม่สามารถรองรับล่ามของตัวเองได้ (ไม่ว่าจะรองรับการคำนวณทางคณิตศาสตร์หรือไม่ก็ตาม) อาร์กิวเมนต์ได้รับการอธิบายโดย Conor McBride ที่นี่: mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis

@ TomEllis: ข้อโต้แย้งของฉันเป็นหลักเหมือนกับ Conor ในความเป็นจริงโพสต์ของเขาทำให้การสังเกตนี้ (ด้วยปัญญาของ Conor) เมื่อเขาเรียกมันว่า "Epimenides / คันทอร์ / รัสเซล / รัสเซล / ควิน / โกเดล / ทัวริงโต้แย้ง"
Neel Krishnaswami
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.