อะไรคือระบบพิมพ์ที่แข็งแกร่งที่รู้จักกันดีที่สุดซึ่งอนุมานได้?


22

เป็นที่ทราบกันดีว่าการอนุมานของ Hindley-Milner (การพิมพ์ -calculus พร้อม polymorphism) นั้นมีการอนุมานประเภทที่สามารถตัดสินใจได้: คุณสามารถสร้างชนิดหลักการสำหรับโปรแกรมใด ๆ โดยไม่มีคำอธิบายประกอบใด ๆλ

การเพิ่มประเภทของสไตล์ Haskell ดูเหมือนจะรักษาความสามารถในการถอดรหัสได้ แต่การเพิ่มเติมเพิ่มเติมทำให้การอนุมานโดยไม่มีการเพิ่มความคิดเห็นไม่สามารถอธิบายได้ (ตระกูลตระกูล, GADTs, ชนิดพึ่งพา, ประเภท Rank, N, Systemเป็นต้น)ω

ฉันสงสัยว่า: อะไรคือระบบพิมพ์ที่แข็งแกร่งที่สุดที่มีการอนุมานได้อย่างสมบูรณ์? มันจะอยู่ที่ไหนสักแห่งระหว่าง Hindley-Milner (decidable อย่างสมบูรณ์) และ dependent-types (undecidable สมบูรณ์) มีแง่มุมของ DT ที่สามารถเพิ่มซึ่งรักษาความสามารถในการตัดสินใจอนุมานได้หรือไม่? มีงานวิจัยใดที่ทำเพื่อดูว่าสามารถผลักดันสิ่งนี้ได้ไกลแค่ไหน?

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

แก้ไข: เนื่องจากไม่มีระบบที่ "แข็งแกร่งที่สุด" ฉันจะยอมรับคำตอบที่แสดงถึงระบบที่น่าทึ่งซึ่งขยาย Hindley Milner ด้วยการอนุมานที่แน่นอน ตัวอย่างอาจเป็นประเภทสภาพคล่องอันดับ 2 เป็นต้น


4
@jmite ฉันเห็นด้วยกับคนอื่น ๆ ที่นี่ ไม่มีขอบเขตที่ชัดเจนของรอยตัดที่รู้จัก ฉันสงสัยอาจมี การอนุมานประเภทความสามารถในการตัดสินใจนั้นขึ้นอยู่กับคุณสมบัติของภาษาทั้งหมดเช่นคุณเคยพิมพ์ย่อยหรือไม่ หนึ่งขอบเขต clearcut สามารถพบได้ในส่วนขยายของ HM ที่มีอันดับสูงกว่าที่เราทราบ: สำหรับการจัดอันดับ k> 2 การอนุมานประเภทจะไม่สามารถตัดสินใจได้มิฉะนั้นจะสามารถตัดสินใจได้
Martin Berger

@ มาร์ตินเบอเกอร์ฉันยอมรับว่าไม่มีความแข็งแกร่งที่สุด แต่ฉันคิดว่ายังมีคำตอบที่ดีที่จะสรุปความโดดเด่นเช่นอันดับ 2 ที่คุณพูดถึง
jmite

1
@jmite มันคงจะดีถ้ามีบทสรุปของ decidablility สำหรับการอนุมานแบบ ไม่มีเรื่องแบบนี้มันแจกทั้งหมดประมาณ 100s ของเอกสารอนิจจา บางทีคุณสามารถเขียนหนึ่งมันจะเป็นบริการที่ดีให้กับชุมชน
Martin Berger

ฉันคิดว่าการเขียนคำตอบสำหรับคำถามอาจเป็นเรื่องยาก แต่แน่นอนว่างานอนุมานประเภทล่าสุดโดย Didier Rémy (รวมถึงการอ้างอิง) อาจเป็นที่สนใจของผู้ถาม
ejgallego

คำตอบ:


2

[แก้ไข: ปิดบางคำในแต่ละ]

มีหลายวิธีในการขยายการอนุมานประเภท HM คำตอบของฉันนั้นขึ้นอยู่กับความพยายามจำนวนมากไม่ว่าจะมากหรือน้อยก็ตาม คนแรกที่ผมเจอคือความแตกต่างพารา ระบบประเภทที่พยายามขยาย HM ในทิศทางนี้มีแนวโน้มไปสู่ ​​System F ดังนั้นจึงจำเป็นต้องมีคำอธิบายประกอบประเภท สองส่วนขยายที่โดดเด่นในทิศทางนี้ที่ฉันเจอคือ:

  • HMF ช่วยให้การอนุมานประเภทสำหรับประเภท System-F ทั้งหมดซึ่งหมายความว่าคุณสามารถมีปริมาณสากล "กลาง" ของประเภทลักษณะที่ปรากฏของพวกเขาไม่ได้ตั้งอยู่โดยปริยายที่ขอบเขตสูงสุดเช่น HM polymorphic ประเภท กระดาษระบุอย่างชัดเจนว่าไม่มีกฎที่ชัดเจนว่ามีจำนวนเท่าใดและอาจมีการเพิ่มความคิดเห็นประเภทใด นอกจากนี้ประเภทที่เป็นประเภทของ System F คำศัพท์มักจะไม่มีประเภทหลัก

  • MLF ไม่เพียง แต่เป็นส่วนขยายของ HM แต่ยังเป็นส่วนขยายของ System F ที่ได้รับคุณสมบัติประเภทหลักของ HM โดยการแนะนำปริมาณขอบเขตที่มีขอบเขตมากกว่าประเภท ผู้เขียนทำการเปรียบเทียบ MLF มีประสิทธิภาพมากกว่า HMF อย่างเข้มงวดและคำอธิบายประกอบจำเป็นสำหรับพารามิเตอร์ที่ใช้ polymorphically เท่านั้น

อีกวิธีในการขยาย HM คือผ่านการเปลี่ยนแปลงของโดเมนข้อ จำกัด

  • HM (X) คือ Hindley-Milner ที่กำหนดพารามิเตอร์ไว้เหนือโดเมนข้อ จำกัด X ในวิธีนี้ HM algorithm จะสร้างข้อ จำกัด ที่ถูกส่งไปยังตัวแก้โดเมนสำหรับ X สำหรับ HM ปกติตัวแก้โดเมนคือขั้นตอนการรวมและโดเมนประกอบด้วย ของชุดคำศัพท์ประกอบจากประเภทและตัวแปรประเภท
    อีกตัวอย่างสำหรับ X อาจเป็นข้อ จำกัด ที่แสดงในภาษาของ Presburger เลขคณิต (ซึ่งการอนุมานประเภท / การตรวจสอบกรณีเป็น decidable) หรือในภาษาของ Peano เลขคณิต (ไม่ decidable อีกต่อไป) X แตกต่างกันไปตามทฤษฎีของแต่ละคนมีความต้องการของตัวเองเกี่ยวกับจำนวนและการแปลคำอธิบายประกอบประเภทที่จำเป็นและหลากหลายตั้งแต่ไม่ไปจนถึงทั้งหมดของพวกเขา

  • คลาสชนิดของ Haskell ยังเป็นส่วนขยายชนิดหนึ่งของโดเมนข้อ จำกัด โดยการเพิ่มเพรดิเคตประเภทของฟอร์มMyClass(MyType)(หมายความว่ามีอินสแตนซ์ของ MyClass สำหรับประเภท MyType)
    เรียนประเภทรักษาอนุมานชนิดเพราะพวกเขามีพื้น (เกือบ) แนวคิดฉากที่พวกเขาดำเนินการหลายรูปแบบเฉพาะกิจ
    ตัวอย่างเช่นการใช้สัญลักษณ์valของชนิดval :: MyClass a => aที่คุณสามารถมีอินสแตนซ์MyClass A, MyClass Bฯลฯ เมื่อคุณอ้างถึงสัญลักษณ์ในรหัสของคุณว่ามันเป็นเรื่องจริงเพราะอนุมานชนิดจะดำเนินการอยู่แล้วว่าคอมไพเลอร์สามารถอนุมานซึ่งตัวอย่างของการเรียนที่จะใช้ ซึ่งหมายความว่าประเภทของการvalขึ้นอยู่กับบริบทที่มีการใช้ นั่นเป็นเหตุผลว่าทำไมการเรียกใช้valคำสั่งเดียวจึงนำไปสู่ambiguous type error : คอมไพเลอร์ไม่สามารถอนุมานประเภทใด ๆ ตามบริบท

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

เพื่อให้ตัวอย่างของความซับซ้อนที่แท้จริงลองพิจารณาชนิดของรายการที่ต้องพึ่งพา: NList a nซึ่งaเป็นประเภทของวัตถุในรายการและnมีความยาว
ฟังก์ชั่นผนวกจะมีประเภทและฟังก์ชั่นซิปจะเป็นappend :: NList a n -> NList a m -> NList a (n + m) ลองนึกภาพตอนนี้เรามีแลมบ์ดา นี่อาร์กิวเมนต์แรกของไปรษณีย์เป็นประเภทและครั้งที่สองจากประเภท เกือบจะเหมือนกัน แต่ถ้าไม่มีตัวตรวจสอบชนิดรู้ว่า "+" ส่งค่าตัวเลขธรรมชาติมันจะต้องปฏิเสธฟังก์ชั่นเพราะ (n + m) ไม่ใช่ตัวอักษร (m + n) มันไม่ได้เกี่ยวกับการอนุมานประเภท / การตรวจสอบประเภทอีกต่อไปมันเกี่ยวกับการพิสูจน์ทฤษฎีบทzip :: NList a n -> NList b n -> NList (a, b) n
\a: NList t n, b: NList t m -> zip (append a b) (append b a)NList t (n + m)NList t (m + n)

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

ฉันหวังว่านี่จะช่วยได้.

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