ฉันรู้ว่าไอดริสมีประเภทตาม แต่ไม่สมบูรณ์ สิ่งใดที่ไม่สามารถทำได้โดยการยกเลิกความสมบูรณ์ของทัวริงและสิ่งนี้เกี่ยวข้องกับการมีประเภทตาม
ฉันเดาว่านี่เป็นคำถามที่เฉพาะเจาะจง แต่ฉันไม่ทราบจำนวนมากเกี่ยวกับประเภทพึ่งพาและระบบประเภทที่เกี่ยวข้อง
ฉันรู้ว่าไอดริสมีประเภทตาม แต่ไม่สมบูรณ์ สิ่งใดที่ไม่สามารถทำได้โดยการยกเลิกความสมบูรณ์ของทัวริงและสิ่งนี้เกี่ยวข้องกับการมีประเภทตาม
ฉันเดาว่านี่เป็นคำถามที่เฉพาะเจาะจง แต่ฉันไม่ทราบจำนวนมากเกี่ยวกับประเภทพึ่งพาและระบบประเภทที่เกี่ยวข้อง
คำตอบ:
Idris สำเร็จแล้ว! มันจะตรวจสอบหาผลรวม (สิ้นสุดลงเมื่อเขียนโปรแกรมด้วยข้อมูล, ผลผลิตเมื่อเขียนโปรแกรมด้วย codata) แต่ไม่ต้องการให้ทุกอย่างเป็นผลรวม
ที่น่าสนใจคือการมีข้อมูลและ codata นั้นเพียงพอที่จะทำแบบจำลองทัวริงครบถ้วนเนื่องจากคุณสามารถเขียน monad สำหรับฟังก์ชั่นบางส่วน ผมทำอย่างนี้ปีที่ผ่านมาใน Coq - มันอาจ bitrotted โดยขณะนี้ แต่ที่นี่มันยังคง: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v
คุณต้องหลบหนีไปหนึ่งครั้งเพื่อทำสิ่งเหล่านี้ แต่ Idris อนุญาตให้คุณทำเช่นนั้นได้
Idris จะไม่ลดฟังก์ชั่นบางส่วนที่ระดับประเภทเพื่อให้สามารถตรวจสอบประเภทได้อย่างต่อเนื่อง นอกจากนี้มีเพียงโปรแกรมทั้งหมดเท่านั้นที่สามารถเชื่อได้อย่างสมเหตุสมผลว่าเป็นบทพิสูจน์
อันดับแรกฉันคิดว่าคุณเคยได้ยินวิทยานิพนธ์เกี่ยวกับคริสตจักรทัวริงซึ่งระบุว่าสิ่งที่เราเรียกว่า "การคำนวณ" เป็นสิ่งที่สามารถทำได้ด้วยเครื่องทัวริง (หรือโมเดลอื่น ๆ ที่เทียบเท่า) ดังนั้นภาษาทัวริงที่สมบูรณ์จึงเป็นสิ่งหนึ่งที่สามารถแสดงการคำนวณใด ๆ ได้ ในทางกลับกันภาษาทัวริงที่ไม่สมบูรณ์นั้นเป็นภาษาที่มีการคำนวณบางอย่างที่ไม่สามารถแสดงออกมาได้
ตกลงนั่นไม่ได้ให้ข้อมูลอะไรมาก ขอยกตัวอย่าง มีสิ่งหนึ่งที่คุณไม่สามารถทำได้ในภาษาทัวริงที่ไม่สมบูรณ์: คุณไม่สามารถเขียนเครื่องจำลองทัวริง (มิฉะนั้นคุณสามารถเข้ารหัสการคำนวณใด ๆ บนเครื่องทัวริงจำลอง)
ตกลงว่ายังไม่ได้ให้ข้อมูลมากนัก คำถามจริงคือโปรแกรมใดที่มีประโยชน์ไม่สามารถเขียนในภาษาทัวริงที่ไม่สมบูรณ์ ไม่มีใครคิดคำนิยามของ“ โปรแกรมที่มีประโยชน์” ซึ่งรวมถึงโปรแกรมทั้งหมดที่มีคนเขียนไว้เพื่อจุดประสงค์ที่เป็นประโยชน์และไม่ได้รวมการคำนวณของทัวริงทั้งหมด ดังนั้นการออกแบบภาษาทัวริงที่ไม่สมบูรณ์ซึ่งคุณสามารถเขียนโปรแกรมที่มีประโยชน์ทั้งหมดยังคงเป็นเป้าหมายการวิจัยระยะยาว
ขณะนี้มีภาษาทัวริงที่ไม่สมบูรณ์หลายประเภทแตกต่างกันออกไปและพวกเขาต่างกันในสิ่งที่พวกเขาทำไม่ได้ อย่างไรก็ตามมีชุดรูปแบบทั่วไป: ภาษาทัวริงที่สมบูรณ์ต้องมีวิธีการที่จะยกเลิกหรือดำเนินการต่อไปตามเวลาที่ไม่ได้ถูก จำกัด ด้วยขนาดโปรแกรมและเงื่อนไขสำหรับโปรแกรมที่จะใช้จำนวนหน่วยความจำที่ขึ้นอยู่กับอินพุต . ภาษาการเขียนโปรแกรมที่จำเป็นส่วนใหญ่จะให้ความสามารถเหล่านี้ผ่านในขณะที่ลูปและการจัดสรรหน่วยความจำแบบไดนามิกตามลำดับ ภาษาโปรแกรมที่ใช้งานได้ส่วนใหญ่จะให้ความสามารถเหล่านี้ผ่านการเรียกซ้ำและการซ้อนโครงสร้างข้อมูล
ไอดริสเป็นแรงบันดาลใจอย่างมากโดยAGDA AGDA เป็นภาษาที่ออกแบบมาสำหรับทฤษฎีบทพิสูจน์ ตอนนี้การพิสูจน์ทฤษฎีบทและโปรแกรมที่ทำงานนั้นสัมพันธ์กันอย่างใกล้ชิดดังนั้นคุณสามารถเขียนโปรแกรมใน Agda ได้เช่นเดียวกับที่คุณพิสูจน์ทฤษฎีบท โดยสังหรณ์ใจหลักฐานของทฤษฎีบท“ A หมายถึง B” เป็นฟังก์ชั่นที่ใช้พิสูจน์ทฤษฎีบท A เป็นอาร์กิวเมนต์และส่งกลับหลักฐานของทฤษฎีบทบี
เนื่องจากเป้าหมายของระบบคือการพิสูจน์ทฤษฎีบทคุณจึงไม่สามารถให้โปรแกรมเมอร์เขียนฟังก์ชันตามอำเภอใจได้ ลองนึกภาพภาษาที่ให้คุณเขียนฟังก์ชั่นวนซ้ำแบบโง่ ๆ ที่เรียกตัวเองว่า:
oops : A -> B
oops x = oops x
คุณไม่สามารถปล่อยให้การมีอยู่ของฟังก์ชันนั้นทำให้คุณเชื่อได้ว่า A หมายถึง B หรืออย่างอื่นคุณจะสามารถพิสูจน์อะไรได้เลยไม่ใช่แค่ทฤษฎีบทที่แท้จริง! ดังนั้น Agda (และผู้พิสูจน์ทฤษฎีบทที่คล้ายกัน) จึงห้ามการเรียกซ้ำโดยพลการ เมื่อคุณเขียนฟังก์ชันแบบเรียกซ้ำคุณต้องพิสูจน์ว่ามันสิ้นสุดลงเสมอดังนั้นเมื่อใดก็ตามที่คุณเรียกใช้มันในการพิสูจน์ทฤษฎีบท A คุณรู้ว่ามันจะสร้างบทพิสูจน์ของทฤษฎีบท B
ข้อ จำกัด ในทางปฏิบัติของ Agda ในทันทีคือคุณไม่สามารถเขียนฟังก์ชันเรียกซ้ำโดยพลการ เนื่องจากระบบจะต้องสามารถปฏิเสธฟังก์ชั่นที่ไม่สิ้นสุดทั้งหมด undecidability ของปัญหาการหยุดชะงัก (หรือทฤษฎีบทของข้าวทั่วไป) ทำให้แน่ใจว่ามีการยกเลิกฟังก์ชั่นที่ถูกปฏิเสธเช่นกัน ปัญหาที่เพิ่มขึ้นในทางปฏิบัติคือคุณต้องช่วยระบบในการพิสูจน์ว่าการทำงานของคุณสิ้นสุดลง
มีการวิจัยอย่างต่อเนื่องเกี่ยวกับการสร้างระบบพิสูจน์เพิ่มเติมให้เหมือนภาษาการเขียนโปรแกรมโดยไม่กระทบกับการรับประกันว่าถ้าคุณมีฟังก์ชั่นจาก A ถึง B มันก็ดีเหมือนหลักฐานทางคณิตศาสตร์ที่ A แปลว่า B. ขยายระบบให้ยอมรับมากขึ้น ฟังก์ชั่นสิ้นสุดเป็นหนึ่งในหัวข้อการวิจัย ทิศทางการขยายอื่น ๆ รวมถึงการรับมือกับข้อกังวล "โลกแห่งความจริง" เช่นอินพุต / เอาต์พุตและการทำงานพร้อมกัน ความท้าทายอีกประการหนึ่งคือการทำให้ระบบเหล่านี้สามารถเข้าถึงมนุษย์ปุถุชนได้ (หรืออาจโน้มน้าวให้มนุษย์ทั่วไปเชื่อว่าพวกเขาสามารถเข้าถึงได้จริง)
ฉันไม่คุ้นเคยกับไอดริส มันเป็นความท้าทายที่ฉันพูดถึง เท่าที่ฉันเข้าใจจากการคร่าวๆคร่าวๆที่งานพิมพ์ปี 2013ไอดริสก็เสร็จสมบูรณ์ แต่มีตัวตรวจสอบจำนวนทั้งสิ้น ตัวตรวจสอบผลรวมตรวจสอบว่าทุกฟังก์ชั่นมีคำอธิบายประกอบพร้อมกับคำหลักtotal
สิ้นสุดลง ส่วนภาษาที่มีเพียงโปรแกรม Idris ที่ทุกฟังก์ชั่นรวมทั้งหมดมีความคล้ายคลึงกับอาร์ดาที่แสดงออก (อาจจะไม่ตรงกันแน่นอนเนื่องจากความแตกต่างในทฤษฎีประเภท แต่ใกล้พอที่คุณจะไม่สังเกตจนกว่าคุณจะพยายามอย่างจงใจ)
สำหรับตัวอย่างอื่น ๆ ของภาษาที่ไม่ทัวริงสมบูรณ์ในวิธีที่ต่างกันดูข้อ จำกัด ในทางปฏิบัติของภาษาสมบูรณ์แบบที่ไม่ใช่ทัวริงเช่น Coq คืออะไร (ซึ่งคำตอบนี้คือการขยายขนาดใหญ่นำมาจาก)
sizeof(void*)
) ในคำตอบของฉันฉันปฏิบัติต่อภาษาด้วยวิธีที่สมบูรณ์แบบดังนั้น SML หรือ C จึงถือว่าเป็นทัวริงที่สมบูรณ์