ประเภทที่อ้างถึงเทียบกับประเภทการปรับแต่ง


57

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

ถ้ามันช่วยได้ฉันเจอประเภทการกลั่นผ่านโครงการ Liquid Haskell และประเภทที่ต้องพึ่งพาผ่าน Coq และ Agda ที่กล่าวว่าฉันกำลังมองหาคำอธิบายว่าทฤษฎีแตกต่างกันอย่างไร

คำตอบ:


33

ความแตกต่างที่สำคัญนั้นมีอยู่ในสองมิติในทางทฤษฎีและในการใช้งาน ให้เพียงมุ่งเน้นไปที่หลัง

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

http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists

เทียบกับใน Idris

https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr

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

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


มีวิธีใดบ้างที่จะทำการแมปเชิงกลไกจากข้อมูลจำเพาะประเภทการปรับแต่งตามประเภทข้อมูลจำเพาะแบบอิงหรือไม่? หรือ "มอร์ฟิซึ่ม" ดังกล่าวยังไม่ได้รับการศึกษาอย่างเพียงพอหรือ
Erik Allik

1
AFAIK เช่น "isomorphism" ยังไม่ได้รับการศึกษามากนัก มีบางงานที่ผ่านมาดู: "เป็นทางการประเภทการปรับแต่งง่าย ๆ ใน Coq" โดย Lehmann และ Tanter (ซึ่งจะปรากฏในไม่ช้า ... นี่คือ repo GH: github.com/pleiad/Refinements )
Ranjit Jhala

ชนิดของการพึ่งพาพา ธ ใน Scala เป็นอย่างไร?
Yang Bo

1
@RanjitJhala ฉันคิดว่าคุณได้รับเป้าหมายของคุณในวรรคสุดท้ายโดยบังเอิญ
Noldorin

1
@ โนลโดรินฉันว่า Ranjit ได้ย่อหน้าสุดท้ายของเขาถูกต้องแล้ว "ประเภทการปรับแต่ง ... จำกัด เฉพาะชิ้นส่วนที่เปลี่ยนได้เพื่อให้การตรวจสอบ (และการอนุมาน) เป็นไปโดยอัตโนมัติอย่างสมบูรณ์" vs "ข้อกำหนดการพิสูจน์ ... จำเป็นใน ... ขึ้นอยู่กับ [ประเภท]" ดังนั้นการทำงานของชาวบ้านในประเภทการกลั่นกรองจึงพยายามที่จะขยายจำนวนที่สามารถระบุได้ในประเภทการปรับแต่งในขณะที่ยังคงสามารถอนุมาน / ตรวจสอบได้โดยอัตโนมัติในขณะที่คนที่ทำงานในประเภทที่พึ่งพานั้น
raiph

22

ประเภทการปรับแต่งเป็นเพียงประเภทปกติพร้อมภาคแสดง นั่นคือเนื่องจากเป็นชนิดปกติและเป็นเพรดิเคตบนTPT

{v:TP(v)}
เป็นประเภทการปรับแต่ง ในกรณีนี้เรียกว่าพิมพ์ฐานT

AFAIK ใน Liquid Haskell พวกเขายังอนุญาตประเภทฟังก์ชันที่ขึ้นต่อกันซึ่งก็คือประเภท [1] ขอให้สังเกตว่าไม่อนุญาตประเภทที่ขึ้นอยู่อย่างสมบูรณ์ (เช่น sigma-type){x:T1T2P}

ระบบประเภทของเหลวตามที่อธิบายไว้ใน [1] นั้นสามารถ decidable ได้และ Liquid Haskell จะใช้ตัวแก้ปัญหา SMT อย่างไรก็ตาม Liquid Haskell ยังต้องการเงื่อนไขการพิสูจน์ (หรือค่าซึ่งถูกเรียกในภาษาที่ไม่พึ่งพา): ถ้าคุณนั่งลงเพื่อเขียนโปรแกรม Liquid Haskell คุณจะเขียนฟังก์ชั่นของคุณเองไม่ใช่เฉพาะประเภท

[1] http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf


1
sigma สามารถเข้ารหัสด้วย pi ได้โดยใช้การเข้ารหัสเหมือนคริสตจักร แต่ประเภทฟังก์ชั่นการปรับแต่งของเหลวของ AFAIK นั้นไม่ใช่ประเภท pi (ฟังก์ชันที่พึ่งพา)
fread2281

15

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


3
เป็นหนึ่งส่วนย่อยของอื่น ๆ ? ดูเหมือนว่าประเภทการปรับแต่งจะสามารถแก้ไขได้โดยใช้ SMT แต่ประเภทที่ขึ้นต่อกันนั้นจำเป็นต้องมีข้อกำหนดการพิสูจน์ของคุณเอง ...
jmite

4
"คนหนึ่งเป็นอีกกลุ่มหนึ่งหรือไม่?" ไม่นั่นคือเหตุผลที่ฉันให้ตัวอย่างประเภทการปรับแต่งที่ไม่ขึ้นอยู่กับและประเภทที่ขึ้นต่อกันซึ่งไม่ใช่การปรับแต่ง
Alexey Romanov

8
ประเภทการปรับแต่งไม่สามารถเข้ารหัสด้วย sigma ได้หรือไม่
fread2281

3
ตัวอย่างของคุณดูเหมือนจะไม่แสดงให้เห็นถึงจุดของคุณ ตัวเลขบวกหมายถึงตัวเลขเหล่านั้นมากกว่า 0 นี่ไม่ได้หมายความว่า "ประเภทของตัวเลขบวก" คือ "ประเภทของตัวเลขทั้งหมดที่มากกว่า0" ใช่หรือไม่?
akdom

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