Sự khác biệt giữa Agda và Idris


164

Tôi bắt đầu đi sâu vào lập trình phụ thuộc và nhận thấy rằng ngôn ngữ Agda và Idris là gần nhất với Haskell, vì vậy tôi bắt đầu từ đó.

Câu hỏi của tôi là: sự khác biệt chính giữa chúng là gì? Là các hệ thống loại tương đương nhau trong cả hai? Sẽ thật tuyệt khi 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 ra một số:

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

Chỉnh sửa : có thêm một số câu trả lời trong trang Reddit của câu hỏi này: http://www.reddit.com/r/deperee_types/comments/q8n2q/agda_vs_idris/


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

4
Đối với hồ sơ: Agda cũng có các ký hiệu đơn âm và ứng dụng ngày nay.
gallais

Câu trả lời:


189

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

Idris đã được thiết kế từ đầu để hỗ trợ lập trình mục đích chung trước khi chứng minh định lý, và như vậy có các tính năng cấp cao như lớp loại, ký hiệu, dấu ngoặc đơn, hiểu danh sách, quá tải, v.v. 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 trên một công cụ xây dựng dựa trên chiến thuật, có một giao diện cho một người ủng hộ định lý tương tác dựa trên chiến thuật (hơi giống Coq, nhưng chưa tiên tiến, ít nhất là chưa tiên tiến).

Một điều khác mà Idris nhắm đến để hỗ trợ tốt là triển khai DSL nhúng. Với Haskell, bạn có thể đi một chặng đường dài với ký hiệu và bạn cũng có thể với Idris, nhưng bạn cũng có thể khởi động lại các cấu trúc khác như ứng dụng và ràng buộc biến 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 viết này: http://eb.host.cs.st-andrews.ac.uk/dcraft/dsl-idris.pdf

Một sự khác biệt khác là trong việc biên soạn. Agda chủ yếu đi qua Haskell, Idris qua C. Có một mặt sau thử nghiệm cho Agda sử dụng cùng một mặt sau như Idris, qua C. Tôi không biết nó được duy trì tốt như thế nào. Mục tiêu chính của Idris sẽ luôn là tạo mã hiệu quả - chúng tôi 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 làm việc với nó.

Các hệ thống loại trong Agda và Idris khá giống nhau ở nhiều khía cạnh quan trọng. Tôi nghĩ rằng 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ó tính tích lũy (và bạn có thể có Set : Setcả hai nếu bạn thấy điều này quá hạn chế và đừng bận tâm rằng bằng chứng của bạn có thể không có căn cứ).


48
Ý 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 thân mậ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.
Alex R

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

13
Cuốn sách của Adam Chlipala có lẽ là nơi tốt nhất:
Edwin Brady

8
Chương đầu tiên của cuốn sách HoTT cũng mô tả nó khá rõ ràng, nếu chính xác.
David Christiansen

50

Một điểm khác biệt nữa giữa Idris và Agda là sự bình đẳng mệnh đề của Idris 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

Chữ l trong định nghĩa Agda có thể bị bỏ qua, vì nó liên quan đến tính đa hình vũ trụ mà Edwin đề cập 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 yếu tố của A làm đối số, trong khi ở Idris, nó có thể lấy hai giá trị với các loại có khả năng khác nhau.

Nói cách khác, trong Idris, người ta có thể tuyên bố rằng hai thứ 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ể chứng minh được), trong khi ở Agda, chính tuyên bố này là vô nghĩa.

Điều này có những hậu quả quan trọng và sâu rộng đố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ể nêu các định lý hữu ích với sự bình đẳng không đồng nhất mà không thể được nói thẳng với sự bình đẳng đồng nhất.

Có lẽ ví dụ đơn giản nhất là sự kết hợp của phép nối vector. Cho các danh sách chỉ mục độ dài được gọi là vectơ được xác định như vậy:

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

và nối với loại sau:

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

chúng tôi 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 theo bình đẳng đồng nhất, bởi vì bên trái của đẳng thức có loại Vect (n + (m + o)) avà 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.


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

6
Tôi không hiểu câu nói đó là vô nghĩa như thế nào dưới sự bình đẳng đồng nhất. Trừ khi tôi nhầm, (n + (m + o))((n + m) + o)bằng nhau về mặt phán đoán bởi tính kết hợp của +bật (xuất phát từ nguyên tắc cảm ứng). Theo đó mỗi bên của đẳng thức không có cùng loại. Sự khác biệt giữa các loại bình đẳng rất quan trọng, nhưng tôi không thấy đây là một ví dụ về điều đó.

5
@Abhishek không bình đẳng phán xét giống như bình đẳng xác định? Tôi nghĩ bạn muốn nói (n + (m + o)) và ((n + m) + o) là mệnh đề bằng nhau nhưng không định nghĩa / bằng nhau về mặt phán đoán.
Tom Crockett

3
đúng. Tôi có nghĩa là bình đẳng mệnh đề khi tôi nói bình đẳng phán xét. Lấy làm tiếc. Dưới đây là nhận xét đã sửa: (n + (m + o)) và ((n + m) + o) được đề xuất bằng nhau nhưng không bằng nhau về mặt định nghĩa. Nếu bạn có a: A, a: B chỉ giữ nếu A và B là các loại bằng nhau theo định nghĩa. Đối với tính quyết định của việc đánh máy, sự bình đẳng xác định phải có tính quyết định. Trong các lý thuyết kiểu mở rộng, đẳng thức xác định trùng khớp với đẳng thức mệnh đề và do đó việc đánh máy là không thể giải quyết được. Trong Coq, đẳng thức xác định chỉ bao gồm tính toán, đẳng thức alpha, mở ra xác định.
Abhishek Anand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.