ความแตกต่างระหว่าง Agda และ Idris


165

ฉันเริ่มดำน้ำในการเขียนโปรแกรมที่พึ่งพาได้และพบว่าภาษา Agda และ Idris นั้นใกล้เคียงกับ Haskell มากที่สุดดังนั้นฉันจึงเริ่มต้นที่นั่น

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

ฉันได้เห็นบางอย่าง:

  • Idris มีคลาสประเภทà la Haskell ในขณะที่ Agda มีอาร์กิวเมนต์เป็นอินสแตนซ์
  • ไอดริสรวมถึงสัญลักษณ์ที่เป็นเอกสิทธิ์และการประยุกต์ใช้
  • ทั้งคู่ดูเหมือนว่าจะมีรูปแบบของไวยากรณ์ที่สามารถ rebindable ได้ แต่ไม่แน่ใจว่าเหมือนกันหรือไม่

แก้ไข : มีคำตอบเพิ่มเติมในหน้า Reddit ของคำถามนี้: http://www.reddit.com/r/dvertise_types/comments/q8n2q/agda_vs_idris/


1
คุณอาจต้องการดู coq aswel, ไวยากรณ์ไม่ได้เป็นล้านไมล์จาก haskell และมันมีคลาสชนิดที่ใช้งานง่าย :)

4
สำหรับบันทึก: Agda ยังมีสัญลักษณ์ที่เป็นเอกเทศและการประยุกต์ใช้ในปัจจุบัน
gallais

คำตอบ:


190

ฉันอาจไม่ใช่คนที่ดีที่สุดที่จะตอบคำถามนี้เนื่องจากการใช้งาน Idris ฉันอาจจะลำเอียงเล็กน้อย! คำถามที่พบบ่อย - http://docs.idris-lang.org/en/latest/faq/faq.html - มีบางอย่างที่จะพูดเกี่ยวกับเรื่องนี้ แต่จะขยายในบิตที่:

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

อีกสิ่งหนึ่งที่ Idris มุ่งหวังที่จะสนับสนุนก็คือการนำ DSL มาใช้ ด้วย Haskell คุณสามารถใช้สัญลักษณ์ที่มีความยาวและคุณสามารถใช้ Idris ได้เช่นกัน แต่คุณยังสามารถสร้างโครงสร้างอื่น ๆ เช่นแอปพลิเคชันและการเชื่อมตัวแปรได้หากคุณต้องการ คุณสามารถหารายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ในบทช่วยสอนหรือรายละเอียดทั้งหมดในเอกสารนี้: http://eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf

ความแตกต่างก็คือในการรวบรวม Agda ต้องผ่าน Haskell, Idris ผ่าน C เป็นหลักมีการทดลองย้อนกลับสำหรับ Agda ซึ่งใช้ back back แบบเดียวกับ Idris ผ่านทาง C ฉันไม่รู้ว่าการบำรุงรักษาเป็นอย่างไร เป้าหมายหลักของ Idris จะเป็นการสร้างรหัสที่มีประสิทธิภาพอยู่เสมอ - เราสามารถทำได้ดีกว่าที่เราทำอยู่ในขณะนี้ แต่เรากำลังดำเนินการอยู่

ระบบการพิมพ์ใน Agda และ Idris นั้นค่อนข้างคล้ายกันในหลายประเด็นที่สำคัญ ฉันคิดว่าความแตกต่างที่สำคัญคือในการจัดการกับจักรวาล Agda มี polymorphism จักรวาลไอดริสมีcumulativity (และคุณสามารถมีได้Set : Setทั้งในกรณีที่คุณพบว่ามีข้อ จำกัด เกินไปและไม่สนใจว่าหลักฐานของคุณอาจไม่ปลอดภัย)


49
คุณหมายถึงอะไร "... ไม่ใช่คนที่ดีที่สุดที่จะตอบ ... "? คุณเป็นหนึ่งในคนที่ดีที่สุดที่จะตอบเนื่องจากคุณรู้จักไอดริสอย่างใกล้ชิด ตอนนี้เราแค่ต้องการ NAD เพื่อตอบกลับและเรามีภาพรวมทั้งหมด :) ขอบคุณที่สละเวลาตอบ
Alex R

9
มีสถานที่ใดบ้างที่ฉันสามารถอ่านเพิ่มเติมเกี่ยวกับ Cumulativity ฉันไม่เคยได้ยินเรื่องนี้มาก่อน ...
serras

13
หนังสือของ Adam Chlipalaน่าจะเป็นสถานที่ที่ดีที่สุด:
Edwin Brady

8
บทแรกของหนังสือ HoTT ยังอธิบายอย่างชัดเจนพอสมควรหากสรุป
David Christiansen

50

อีกข้อแตกต่างระหว่าง Idris และ Agda ก็คือความเท่าเทียมกันเชิงประพจน์ของ Idris นั้นต่างกันขณะที่ Agda นั้นเหมือนกัน

กล่าวอีกนัยหนึ่งคำนิยามสมมุติฐานของความเท่าเทียมกันในไอดริสจะเป็น:

data (=) : {a, b : Type} -> a -> b -> Type where
  refl : x = x

ในขณะที่อยู่ใน Agda มันคือ

data _≡_ {l} {A : Set l} (x : A) : A → Set a where
    refl : x ≡ x

l ในการย่อตัวของ Agda นั้นสามารถเพิกเฉยได้เช่นเดียวกับที่มันเกี่ยวข้องกับความหลากหลายของเอกภพที่เอ็ดวินกล่าวถึงในคำตอบของเขา

ความแตกต่างที่สำคัญคือประเภทความเสมอภาคใน Agda ใช้สององค์ประกอบของ A เป็นอาร์กิวเมนต์ในขณะที่ Idris สามารถรับสองค่าด้วยประเภทที่แตกต่างกัน

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

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

บางทีตัวอย่างที่ง่ายที่สุดคือความสัมพันธ์ของการต่อเวกเตอร์ กำหนดรายการที่มีการจัดทำดัชนีความยาวเรียกว่าเวกเตอร์ที่นิยามดังนี้:

data Vect : Nat -> Type -> Type where
  Nil : Vect 0 a
  (::) : a -> Vect n a -> Vect (S n) a 

และ concatenation ด้วยประเภทต่อไปนี้:

(++) : Vect n a -> Vect m a -> Vect (n + m) a

เราอาจต้องการพิสูจน์ว่า:

concatAssoc : (xs : Vect n a) -> (ys : Vect m a) -> (zs : Vect o a) ->
              xs ++ (ys ++ zs) = (xs ++ ys) ++ zs

คำสั่งนี้เป็นเรื่องไร้สาระภายใต้ความเสมอภาคเหมือนกันเพราะด้านซ้ายของความเสมอภาคมีประเภทและด้านขวามีประเภทVect (n + (m + o)) a Vect ((n + m) + o) aมันเป็นคำพูดที่สมเหตุสมผลอย่างสมบูรณ์แบบด้วยความเท่าเทียมต่างกัน


26
ดูเหมือนว่าคุณจะแสดงความคิดเห็นเพิ่มเติมเกี่ยวกับห้องสมุดมาตรฐานของ Agda มากกว่าทฤษฎีพื้นฐานของ Agda แต่ถึงแม้ห้องสมุดมาตรฐานจะมีความเท่าเทียมกันและเป็นเนื้อเดียวกัน ( cse.chalmers.se/~nad/listings/lib/ ...... ) ผู้คนมักจะใช้อดีตบ่อยขึ้นเท่าที่จะทำได้ หลังเทียบเท่ากับคำสั่งที่ประเภทเท่ากันตามด้วยหนึ่งเกี่ยวกับค่า ในโลกที่ความเท่าเทียมกันของประเภทนั้นแปลก (HoTT) heteq นั้นเป็นคำสั่งที่แปลก
แดนลึกลับ

6
ฉันไม่เข้าใจว่าคำพูดนั้นไร้สาระภายใต้ความเท่าเทียมกันที่เป็นเนื้อเดียวกัน นอกจากว่าฉันเข้าใจผิด(n + (m + o))และ((n + m) + o)มีความเท่าเทียมกันโดยดุลยพินิจของ+เปิด(มาจากหลักการอุปนัย) ดังนั้นความเท่าเทียมกันในแต่ละด้านจึงมีประเภทเดียวกัน ความแตกต่างระหว่างประเภทของความเท่าเทียมมีความสำคัญ แต่ฉันไม่เห็นว่านี่เป็นตัวอย่างของสิ่งนั้นได้อย่างไร

5
@Abhishek ไม่ได้เป็นความเท่าเทียมกันในการตัดสินเช่นเดียวกับความเท่าเทียมกันที่กำหนด? ฉันคิดว่าคุณหมายถึงพูดว่า (n + (m + o)) และ ((n + m) + o) มีความเสมอภาคเท่ากัน แต่ไม่ได้นิยามตามความหมาย / เท่ากัน
Tom Crockett

3
ขวา. ฉันหมายถึงความเท่าเทียมกันเชิงประพจน์เมื่อฉันพูดถึงความเท่าเทียมกันในการตัดสิน ขอโทษ นี่คือความคิดเห็นที่ถูกต้อง: (n + (m + o)) และ ((n + m) + o) มีความเสมอภาคเท่ากัน แต่ไม่มีความหมายเชิงนิยาม หากคุณมี: A, a: B จะถือก็ต่อเมื่อ A และ B เป็นประเภทที่มีความหมายเท่ากัน สำหรับความสามารถในการตัดสินใจได้ของการพิมพ์ประเภทนั้น ในทฤษฎีประเภท extensional สมการความเท่าเทียมกันเกิดขึ้นพร้อมกับความเท่าเทียมกันเชิงประพจน์และการพิมพ์แบบนี้ไม่สามารถระบุได้ใน Coq ความเท่าเทียมเชิงนิยามมีเพียงการคำนวณความเท่าเทียมกันของอัลฟ่า
Abhishek Anand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.