ประเภทที่ขึ้นต่อกันทำให้คุณพิมพ์ย่อยทุกอย่างหรือไม่?


24

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

คำตอบ:


22

ชนิดย่อยและชนิดพึ่งพาเป็นแนวคิดแนวตั้งฉาก

โดยทั่วไปแล้วการพิมพ์ย่อยจะมีความคิดเกี่ยวกับการรวมย่อยโดยที่การแสดงออกของประเภทหนึ่งสามารถปรากฏในสถานที่ที่คาดว่าจะมี supertype

ประเภทย่อยมีแนวโน้มที่จะตัดสินใจได้ง่ายกว่าและง่ายต่อการจัดการในการนำไปใช้

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

หากคุณทำ google อย่างรวดเร็วของ "subtyping dependent type" คุณจะพบว่ามีงานมากมายที่เพิ่ม subtyping ให้กับประเภทพึ่งพาซึ่งส่วนใหญ่มาจากรอบปี 2000 ฉันคิดว่า meta-theory นั้นท้าทายมากจริงๆ ผู้ช่วยพิสูจน์


3
ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา ฉันได้ถามคำถาม noob สองสามข้อที่ดูเหมือนว่าจะได้รับการตอบรับค่อนข้างดีแม้ว่า cstheory.SE ไม่ใช่สถานที่ที่เหมาะสมสำหรับคำถามดังกล่าว ในระดับ -5 ถึง +5 คุณจะสนับสนุนหรือกีดกันคำถามที่คล้ายกันในอนาคตหรือไม่ ในฐานะที่เป็นบันทึกด้านข้างตามที่ฉันเข้าใจ (จากการอ่าน Robert Harper) คลาสของคลาสเป็นหมวดหมู่ย่อยของโมดูลใช่ไหม?
John Salvatier

3
คำถามนี้อยู่ทางด้านขวาของเส้นขอบของสิ่งที่เหมาะสำหรับ cstheory.SE คลาสประเภทไม่ได้เป็นประเภทย่อยของโมดูล มันเป็นเหมือนคลาสประเภทอื่น ๆ คือโมดูล + การอนุมานประเภท + free_plumbing
Dave Clarke

2
ฉันคิดว่าคุณสามารถจำลอง / จำลองย่อยด้วยประเภทที่อ้างอิงได้อย่างง่ายดาย ใน Haskell, HList (ซึ่งเพิ่งสร้างจากความเท่าเทียมกันแบบ decidable) ให้คุณพิมพ์ subtyping เช่น (cf "Haskell's Overlooked Object System") ส่วนที่ยากเพียงอย่างเดียวเกี่ยวกับการแบ่งย่อยคือการอนุมานประเภทและเมื่อคุณทำงานกับประเภทที่ขึ้นต่อกันคุณได้โยน 90% ของส่วนนั้นออกไปแล้ว
sclv

(เปลี่ยนจากความคิดเห็นเป็นคำตอบ)
Neel Krishnaswami

ทฤษฎีเซตย่อยของทฤษฎีประเภทของมาร์ติน - โลฟนั้นเป็นสิ่งที่คุณต้องใช้ในการสร้างแบบจำลองลืมโครงสร้างและย้อนกลับไปในช่วงปี 1980 ฉันคิดว่านี่เป็นสิ่งที่ @Neel ตอบสนองได้
Charles Stewart

22

อย่างไรก็ตามฉันสนใจทฤษฎีประเภทเป็นพื้นฐานสำหรับคณิตศาสตร์มากกว่าพื้นฐานของภาษาโปรแกรมฉันควรให้ความสนใจกับการพิมพ์ย่อยหรือไม่?

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

{xS|;P(x)} vs. Σx:S.P(x)

อย่างไรก็ตามทราบว่า cardinality ของเซตจะมีขนาดเล็กกว่าในขณะที่บันทึกขึ้นสามารถมี cardinality ขนาดใหญ่ (เนื่องจากอาจมีการพิสูจน์ที่เป็นไปได้หลายสำหรับแต่ละ )P ( x ) x :SP(x)x:

ในการเป็นตัวแทน subtyping อย่างซื่อสัตย์ (ซึ่งบอกว่าถ้าและจากนั้น ) คุณต้องเพื่อพิสูจน์ว่าไม่เกี่ยวข้อง - นั่นคือเพราะจะต้องมีผู้อาศัยอยู่ใน พิมพ์(x)x : X x : Y P ( x ) P ( x )X<:Yx:Xx:YP(x)P(x)

เมื่อคุณมีสิ่งนั้นแล้วคุณสามารถทำ subtyping อย่างละเอียดให้เป็นทฤษฎีแบบพึ่งพาได้ ดูวิทยานิพนธ์ของWilliam Lovasสำหรับตัวอย่างของการเพิ่ม subtyping ให้กับทฤษฎีแบบพึ่งพา (ในกรณีนี้คือ Twelf)

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