ทำไมอัลกอริทึม Hindley-Milner จะไม่ให้ผลเช่น t1 -> t2


14

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

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

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

(ดูเหมือนว่าคุณจะได้รับประเภท "เสีย" ใน MLแต่ฉันถามเกี่ยวกับแคลคูลัสแลมบ์ดา)

คำตอบ:


16

ในแคลคูลัสแลมบ์ดาที่ไม่มีค่าคงที่ด้วยระบบประเภท Hindley-Milner คุณไม่สามารถรับชนิดดังกล่าวได้ซึ่งผลลัพธ์ของฟังก์ชันเป็นตัวแปรชนิดที่ไม่ได้รับการแก้ไข ตัวแปรทุกประเภทจะต้องมี "แหล่งกำเนิด" อยู่ที่ไหนซักแห่ง ยกตัวอย่างเช่นมีระยะเวลาของชนิดไม่มีแต่มีระยะเวลาของประเภทอัลฟ่าα,β.αβ (ฟังก์ชั่นตัวตน λ x . x )α.ααλx.x

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

เพียงเพราะไม่มีค่าบางประเภทไม่ได้หมายความว่าไม่มีเงื่อนไขของประเภทนั้น: อาจมีคำที่ไม่มีค่าเช่นคำที่ไม่สิ้นสุด (พูดอย่างแม่นยำคำที่ไม่มีรูปแบบปกติ) เหตุผลที่ไม่มีคำแลมบ์ดาที่มีประเภทดังกล่าวคือคำศัพท์ HM ที่พิมพ์ได้ดีทั้งหมดนั้นกำลังทำให้เป็นปกติ นี่คือการวางนัยทั่วไปของผลลัพธ์ที่ระบุว่าแคลคูลัสแลมบ์ดาที่พิมพ์อยู่นั้นกำลังทำให้เป็นมาตรฐานอย่างมาก มันเป็นผลมาจากความจริงที่ว่าระบบ Fเป็นปกติอย่างยิ่ง: ระบบ F เหมือน HM แต่ช่วยให้ปริมาณประเภททุกที่ในรูปแบบไม่เพียง แต่ในระดับสูง ยกตัวอย่างเช่นในระบบไฮน์, มีชนิด ( α . α ) ( α . α ) - แต่ ΔΔ=λx.xx(α.α)(α.α)พิมพ์ไม่ดีΔΔ

HM และ System F เป็นตัวอย่างของระบบประเภทที่มีการติดต่อกันของCurry-Howard : คำศัพท์ที่พิมพ์ได้ดีนั้นสอดคล้องกับการพิสูจน์ในตรรกะบางอย่างและประเภทนั้นสอดคล้องกับสูตร หากระบบประเภทสอดคล้องกับทฤษฎีที่สอดคล้องกันจากนั้นทฤษฎีนั้นไม่อนุญาตให้มีการพิสูจน์ทฤษฎีบทเช่น ; ดังนั้นจึงมีความเป็นคำประเภทที่สอดคล้องกันไม่มีอัลฟ่า, βA,B,ABบีตา ระบบประเภทช่วยให้หนึ่งสามารถอนุมาน "ทฤษฎีบทได้ฟรี" เกี่ยวกับฟังก์ชั่นมากกว่าโครงสร้างข้อมูลα,β.αβ

YY(λx.x)α.αA,B,AB

การค้นหาเส้นแบ่งที่ละเอียดระหว่างระบบการพิมพ์ที่ช่วยให้มั่นใจได้ว่าการทำบรรทัดฐานปกติและระบบการพิมพ์ที่แข็งแกร่งนั้นไม่ใช่ปัญหาที่ยากและน่าสนใจ มันเป็นปัญหาที่สำคัญเพราะมันเป็นตัวกำหนดว่า logics ใดที่เป็นเสียงในคำอื่น ๆ ที่โปรแกรมรวบรวมหลักฐานของทฤษฎีบท คุณสามารถก้าวต่อไปได้ไกลกว่า System F แต่กฎมีความซับซ้อนมากขึ้น ตัวอย่างเช่นแคลคูลัสของการสร้างแบบอุปนัยซึ่งเป็นพื้นฐานของผู้ช่วยพิสูจน์ Coq , normalizing อย่างยิ่งยังสามารถอธิบายโครงสร้างข้อมูลและขั้นตอนวิธีอุปนัยทั่วไปพวกเขาและอื่น ๆ

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


"มันเป็นผลมาจากความจริงที่ว่าระบบ F กำลังฟื้นฟูอย่างมาก" จะแสดงให้เห็นได้อย่างไรว่า HM กำลังปรับสภาพปกติอย่างรุนแรงเป็นผลมาจากการที่ระบบ F กำลังทำให้ระบบกลับสู่ปกติอย่างมาก?
Rafael Castro

1
@RafaelCastro ทุกคำที่พิมพ์ได้ดีใน HM นั้นพิมพ์ได้ดีใน System F ทุกคำที่พิมพ์ได้ดีใน System F คือ SN ดังนั้นทุกคำที่พิมพ์ได้ดีใน HM คือ SN
Gilles 'หยุดชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.