ไอดริสไม่สามารถทำอะไรได้โดยยอมแพ้ทัวริงครบถ้วน


35

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

ฉันเดาว่านี่เป็นคำถามที่เฉพาะเจาะจง แต่ฉันไม่ทราบจำนวนมากเกี่ยวกับประเภทพึ่งพาและระบบประเภทที่เกี่ยวข้อง


2
ฉันเดาว่าคุณกำลังมองหาตัวอย่างที่เป็นรูปธรรม? ฉันไม่คุ้นเคยกับ Idris แต่ใน Isabelle / HOL คุณไม่สามารถเขียน (หรือมากกว่ารวบรวม) ฟังก์ชั่นที่ไม่เคยยุติ (แย่กว่านั้นคือคุณต้องแสดงหลักฐานการเลิกจ้าง)
Raphael

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

1
คาดเดาข้อผิดพลาดนี้มาจาก Edwin Brady กล่าวว่า Idris คือ "Pacman complete" ฉันคิดว่าประเด็นหลักของเขาโดยการพูดว่า "Pacman complete" แทนที่จะเป็น "ทัวริงสมบูรณ์" คือเขาต้องการเน้นย้ำถึงความสำคัญของภาษาที่สามารถรวบรวมได้ง่ายโดยสมองมนุษย์ไม่ใช่แค่เครื่องจักร! .. ภาษาที่โง่เช่น BrainFuck การทำให้เสร็จสมบูรณ์ แต่อาจต้องใช้สมองของมนุษย์สักครู่เพื่อทำความเข้าใจกับโค้ดที่เขียนใน BrainFuck ดังนั้นการพัฒนาและการบำรุงรักษาที่สำคัญยิ่งกว่านั้นโปรแกรม Pacman ใน BrainFuck ใช้ความพยายามอย่างมาก ..
Michelrandahl

@Mitzh ไม่จริง ฉันคิดว่าเป็นเพราะฉันเข้าใจผิดบางสิ่งที่ฉันได้ยินเขาพูดในการพูดคุย
Squidly

คำตอบ:


50

Idris สำเร็จแล้ว! มันจะตรวจสอบหาผลรวม (สิ้นสุดลงเมื่อเขียนโปรแกรมด้วยข้อมูล, ผลผลิตเมื่อเขียนโปรแกรมด้วย codata) แต่ไม่ต้องการให้ทุกอย่างเป็นผลรวม

ที่น่าสนใจคือการมีข้อมูลและ codata นั้นเพียงพอที่จะทำแบบจำลองทัวริงครบถ้วนเนื่องจากคุณสามารถเขียน monad สำหรับฟังก์ชั่นบางส่วน ผมทำอย่างนี้ปีที่ผ่านมาใน Coq - มันอาจ bitrotted โดยขณะนี้ แต่ที่นี่มันยังคง: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v

คุณต้องหลบหนีไปหนึ่งครั้งเพื่อทำสิ่งเหล่านี้ แต่ Idris อนุญาตให้คุณทำเช่นนั้นได้

Idris จะไม่ลดฟังก์ชั่นบางส่วนที่ระดับประเภทเพื่อให้สามารถตรวจสอบประเภทได้อย่างต่อเนื่อง นอกจากนี้มีเพียงโปรแกรมทั้งหมดเท่านั้นที่สามารถเชื่อได้อย่างสมเหตุสมผลว่าเป็นบทพิสูจน์


4
ผู้ชายคนนั้นเอง ผลผลิตในบริบทนี้คืออะไร
Squidly

5
คู่กับการเลิกจ้าง: ในขณะที่คำนิยามอุปนัยจะต้องยุติ (โดยการใช้ข้อมูลทั้งหมด) คำนิยามแบบเหรียญจะต้องมีประสิทธิผล - ในทางปฏิบัติหมายถึงสั้น ๆ ว่าการเรียกซ้ำจะต้องได้รับการปกป้องโดยผู้สร้าง ฉันพบว่าคำอธิบายนี้ชัดเจนที่สุด (ymmv): adam.chlipala.net/cpdt/html/Coinductive.html
Edwin Brady

14

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

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

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

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

ไอดริสเป็นแรงบันดาลใจอย่างมากโดย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 คืออะไร (ซึ่งคำตอบนี้คือการขยายขนาดใหญ่นำมาจาก)


3
" โปรแกรมที่มีประโยชน์อะไรที่ไม่สามารถเขียนด้วยภาษาทัวริงที่ไม่สมบูรณ์" เครื่องเสมือน Java
David Richerby

@DavidRicherby คุณไม่ได้เหรอ? JVM ทัวริงสมบูรณ์จริงหรือ มีข้อ จำกัด เกี่ยวกับขนาดของวัตถุแต่ละชิ้นคุณสามารถจัดเรียงและเข้าถึงจำนวนวัตถุที่ไม่ จำกัด ได้หรือไม่ ตัวอย่างเช่นใน C คำตอบน่าจะไม่ใช่เพราะมีเพียงค่าตัวชี้จำนวน จำกัด เท่านั้น
Gilles 'ดังนั้นหยุดความชั่วร้าย'

สำหรับผู้อ่านที่สนใจในส่วนนั้นเรามีโพสต์อีกเกี่ยวกับสาเหตุที่ไม่มีภาษาการเขียนโปรแกรมสำหรับภาษาที่สิ้นสุดเสมอ
Raphael

3
@Gilles ฉันใช้จุดของคุณ แต่มันไม่เทียบเท่าหรือมากกว่าที่จะบอกว่าไม่มีภาษาการเขียนโปรแกรมจริงทัวริงสมบูรณ์? ท้ายที่สุดการดำเนินการใด ๆ ก็จะประสบกับปัญหาและอุปสรรคที่คุณกล่าวถึง ดูเหมือนว่าช้างตัวใหญ่จะอยู่ในห้องขณะที่คิดว่าไอดริสแพ้โดยไม่ทัวริงเสร็จสมบูรณ์ มันเสียมากกว่าภาษาอื่นหรือเปล่า หากคุณห้ามการจัดเก็บข้อมูลภายนอกที่ไม่ได้ จำกัด (เช่นโปรแกรมหยุดพูดว่า "โปรดใส่ดิสก์ตัวต่อไป / ก่อนหน้า") ดังนั้นภาษาใด ๆ จึงไม่ได้รับการทำให้ทัวริงสมบูรณ์ดังนั้นคำถามใด ๆ
David Richerby

3
@DavidRicherby ความคิดเห็นของฉัน (แต่ไม่ใช่คำตอบของฉัน) อยู่ในโหมด geek ทฤษฎีการเขียนโปรแกรมภาษา หากคุณใช้ข้อมูลจำเพาะอย่างเป็นทางการของ SML (ตัวอย่าง) มันเป็นไปได้ที่จะออกแบบ (แต่แน่นอนว่าไม่ได้นำไปใช้ในโลกทางกายภาพ) การใช้งานของภาษาที่สามารถจำลองโปรแกรมที่คำนวณได้ทั้งหมด สิ่งนี้ไม่เป็นเช่นนั้นใน C เนื่องจากความสมบูรณ์ของหน่วยความจำถูกสร้างเป็นภาษา ( sizeof(void*)) ในคำตอบของฉันฉันปฏิบัติต่อภาษาด้วยวิธีที่สมบูรณ์แบบดังนั้น SML หรือ C จึงถือว่าเป็นทัวริงที่สมบูรณ์
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.