2012-02-27 41 views
140

Tôi bắt đầu đi sâu vào lập trình được đánh máy phụ thuộc và thấy rằng các ngôn ngữ Agda và Idris là gần nhất với Haskell, vì vậy tôi bắt đầu ở đó.Sự khác biệt giữa Agda và Idris

Câu hỏi của tôi là: sự khác biệt chính giữa chúng là gì? Các hệ thống kiểu như nhau có nổi trội ở cả hai hệ thống này không? Nó sẽ là tuyệt vời để có một so sánh toàn diện và một cuộc thảo luận về lợi ích.

tôi đã có thể để phát hiện một số:

  • Idris có kiểu lớp à la Haskell, trong khi Agda đi với lý lẽ dụ
  • Idris bao gồm monadic và applicative ký hiệu
  • Cả hai dường như có một số loại cú pháp rebindable, mặc dù không thực sự chắc chắn nếu họ là như nhau.

Sửa: có một số câu trả lời ở những trang Reddit của câu hỏi này: http://www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/

+1

Bạn có thể muốn có một cái nhìn tại Coq aswel, cú pháp không phải là một triệu dặm từ Haskell và nó có dễ dàng để sử dụng các lớp học kiểu :) –

+2

Đối với hồ sơ: Agda cũng có ký hiệu monadic và applicative hiện nay. – gallais

Trả lời

149

tôi có thể không phải là người tốt nhất để trả lời câu này, như đã thực hiện Idris Tôi có thể một chút thiên vị! Câu hỏi thường gặp - http://docs.idris-lang.org/en/latest/faq/faq.html - có điều gì đó để nói về nó, nhưng để mở rộng trên đó một chút:

Idris được thiết kế từ đầu để hỗ trợ lập trình mục đích chung trước định lý, và như vậy có các tính năng cấp cao như vậy như các lớp kiểu, ký hiệu, các thành ngữ, danh sách hiểu, quá tải và vân vân. Idris đặt lập trình cấp cao trước bằng chứng tương tác, mặc dù vì Idris được xây dựng dựa trên một trình biên dịch dựa trên chiến thuật, có một giao diện cho một chiến thuật dựa trên định lý tương tác prover (một chút như Coq, nhưng không cao cấp, ít nhất là chưa).

Một điều khác mà Idris muốn hỗ trợ tốt là triển khai DSL nhúng. Với Haskell bạn có thể có được một chặng đường dài với ký hiệu, và bạn có thể với Idris nữa, nhưng bạn cũng có thể rebind các cấu trúc khác như ứng dụng và biến ràng buộc nếu bạn cần. Bạn có thể tìm thêm chi tiết về điều này trong hướng dẫn hoặc chi tiết đầy đủ trong bài báo này: http://www.cs.st-andrews.ac.uk/~eb/drafts/dsl-idris.pdf

Một điểm khác biệt là biên dịch. Agda đi chủ yếu thông qua Haskell, Idris qua C. Có một kết thúc thử nghiệm cho Agda sử dụng cùng một kết thúc trở lại như Idris, thông qua C. Tôi không biết làm thế nào nó được duy trì tốt. Mục tiêu chính của Idris sẽ luôn là tạo ra mã hiệu quả - chúng ta có thể làm tốt hơn rất nhiều so với hiện tại, nhưng chúng tôi đang nghiên cứu nó.

Các hệ thống kiểu trong Agda và Idris khá giống nhau về nhiều khía cạnh quan trọng. Tôi nghĩ sự khác biệt chính là trong việc xử lý vũ trụ. Agda có tính đa hình vũ trụ, Idris có cumulativity (và bạn có thể có Set : Set trong cả hai nếu bạn thấy điều này quá hạn chế và không nhớ rằng bằng chứng của bạn có thể không rõ ràng).

+33

Ý của bạn là gì, "... không phải là người tốt nhất để trả lời ..."? Bạn là một trong những người tốt nhất để trả lời, vì bạn biết Idris một cách mật thiết. Bây giờ chúng tôi chỉ cần NAD để trả lời là tốt, và chúng tôi có toàn bộ hình ảnh :) Cảm ơn bạn đã dành thời gian để trả lời. –

+7

Có nơi nào tôi có thể đọc thêm về tính tích lũy không? Tôi chưa bao giờ nghe về điều đó trước đây ... – serras

+11

[Sách của Adam Chlipala] (http://adam.chlipala.net/cpdt/html/Universes.html) có lẽ là nơi tốt nhất: –

39

Một khác biệt khác giữa Idris và Agda là bình đẳng mệnh đề của Idris là không đồng nhất, trong khi Agda là đồng nhất.

Nói cách khác, định nghĩa giả định về sự bình đẳng trong Idris sẽ là:

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

trong khi ở Agda, nó là

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

Các l trong defintion Agda thể bỏ qua, vì nó liên quan đến sự đa hình vũ trụ mà Edwin đề cập đến trong câu trả lời của ông.

Sự khác biệt quan trọng là loại bình đẳng trong Agda lấy hai phần tử A làm đối số, trong khi ở Idris, có thể lấy hai giá trị có khả năng là loại khác nhau.

Nói cách khác, trong Idris người ta có thể tuyên bố rằng hai điều với các loại khác nhau là bằng nhau (ngay cả khi nó kết thúc là một yêu cầu không thể giải quyết), trong khi ở Agda, tuyên bố rất vô nghĩa.

Điều này có những hậu quả quan trọng và rộng lớn đối với lý thuyết loại, đặc biệt là về tính khả thi khi làm việc với lý thuyết loại đồng luân. Đối với điều này, sự bình đẳng không đồng nhất sẽ không hoạt động vì nó đòi hỏi một tiên đề không phù hợp với HoTT. Mặt khác, có thể đưa ra các định lý hữu ích với sự bình đẳng không đồng nhất mà không thể nói thẳng với sự bình đẳng đồng nhất.

Có lẽ ví dụ đơn giản nhất là tính liên kết của vectơ nối. danh sách dài-lập chỉ mục cho gọi là vectơ định nghĩa thusly:

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

và nối với các loại sau đây:

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

chúng ta có thể muốn chứng minh rằng:

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

Tuyên bố này là vô nghĩa dưới sự bình đẳng đồng nhất, bởi vì phía bên trái của sự bình đẳng có loại Vect (n + (m + o)) a và phía bên phải có loại Vect ((n + m) + o) a. Đó là một tuyên bố hoàn toàn hợp lý với sự bình đẳng không đồng nhất.

+23

Bạn dường như đang bình luận nhiều hơn về thư viện chuẩn Agda hơn là lý thuyết cơ bản của Agda, nhưng ngay cả thư viện chuẩn cũng có cả sự bình đẳng đồng nhất và không đồng nhất (http://www.cse.chalmers.se/~nad/listings/lib/Relation. Binary.HeterogeneousEquality.html # 1). Mọi người chỉ có xu hướng sử dụng thường xuyên hơn khi có thể. Cái sau tương đương với một câu lệnh rằng các kiểu là bằng nhau, theo sau là một kiểu về các giá trị. Trong một thế giới mà loại bình đẳng là lạ (HoTT) thì heteq là một câu lệnh khác. –

+6

Tôi không hiểu làm thế nào tuyên bố đó là vô nghĩa theo sự bình đẳng đồng nhất. Trừ khi tôi bị nhầm lẫn, '(n + (m + o))' và '((n + m) + o)' là phán xét bình đẳng bởi sự kết hợp của '+' trên 'ℕ' (bắt nguồn từ nguyên tắc cảm ứng). Theo đó mỗi bên của sự bình đẳng không có cùng loại. Sự khác biệt giữa các loại bình đẳng là quan trọng, nhưng tôi không thấy đây là một ví dụ về điều đó. –

+4

@Abhishek không bình đẳng phán xét giống như bình đẳng xác định? Tôi nghĩ rằng bạn có nghĩa là để nói (n + (m + o)) và ((n + m) + o) được đề xuất bình đẳng nhưng không phải là một cách bình đẳng/phán xét bằng nhau. –

Các vấn đề liên quan