Agda와 Idris의 차이점
나는 의존적으로 유형이 지정된 프로그래밍에 뛰어 들기 시작했고 Agda와 Idris 언어가 Haskell에 가장 가깝다는 것을 알았습니다.
내 질문은 : 그들 사이의 주요 차이점은 무엇입니까? 타입 시스템이 둘 다 똑같이 비싸습니까? 종합적인 비교와 혜택에 대한 토론을 갖는 것이 좋을 것입니다.
나는 몇 가지를 발견 할 수 있었다 :
- Idris의 유형 클래스는 La Haskell이며 Agda는 인스턴스 인수와 함께 사용됩니다.
- 이드리스에는 수도원 및 응용 표기법이 포함됩니다
- 둘 다 일종의 리 바인딩 가능한 구문을 가지고있는 것처럼 보이지만 실제로는 같은지 확실하지 않습니다.
편집 :이 질문의 Reddit 페이지에 더 많은 답변이 있습니다 : http://www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/
Idris를 구현했기 때문에 아마도 약간 편향되어 있으므로이 답변에 가장 적합한 사람이 아닐 수도 있습니다! FAQ ( http://docs.idris-lang.org/en/latest/faq/faq.html) 에는 이에 대한 언급이 있지만 그 내용을 조금 더 확장 할 수 있습니다.
Idris는 처음부터 정리 증명보다 범용 프로그래밍을 지원하도록 설계되었으며 유형 클래스, 표기법, 관용구 괄호, 목록 이해, 과부하 등과 같은 고급 기능을 갖추고 있습니다. Idris는 전술 기반의 이볼 레이터를 기반으로하기 때문에 전술 기반의 대화 형 정리 증명 자 (Coq와 비슷하지만 아직은 아니지만 고급은 아님)에 대한 인터페이스가 있지만 Idris는 대화 형 증명보다 높은 수준의 프로그래밍을 제공합니다.
Idris가 잘 지원하는 또 다른 목표는 임베디드 DSL 구현입니다. Haskell을 사용하면 do 표기법으로 먼 길을 갈 수 있고 Idris로도 할 수 있지만 필요한 경우 응용 프로그램 및 변수 바인딩과 같은 다른 구문을 리 바인드 할 수도 있습니다. 자세한 내용은 자습서에서 확인하거나이 백서에서 자세한 내용을 확인하십시오. http://www.cs.st-andrews.ac.uk/~eb/drafts/dsl-idris.pdf
또 다른 차이점은 컴파일입니다. Agda는 주로 Haskell, C를 통한 Idris를 통해 진행됩니다. C를 통해 Idris와 동일한 백엔드를 사용하는 Agda의 실험적인 백엔드가 있습니다. Idris의 주요 목표는 항상 효율적인 코드를 생성하는 것입니다. 현재 수행하는 것보다 훨씬 더 많은 작업을 수행 할 수 있지만 현재 작업 중입니다.
Agda와 Idris의 유형 시스템은 많은 중요한 측면에서 매우 유사합니다. 가장 큰 차이점은 우주를 다루는 것입니다. Agda에는 우주 다형성이 있고 Idris에는 누적 성Set : Set
이 있습니다 (이 제한이 너무 강하고 증거가 부적절하다고 생각하지 않으면 둘 다 가질 수 있습니다).
Idris와 Agda의 또 다른 차이점은 Idris의 명제 평등은 이질적이며 Agda는 동 질적이라는 것입니다.
다시 말해, Idris에서 평등에 대한 추정의 정의는 다음과 같습니다.
data (=) : {a, b : Type} -> a -> b -> Type where
refl : x = x
아그 다에있는 동안
data _≡_ {l} {A : Set l} (x : A) : A → Set a where
refl : x ≡ x
Edda가 대답에서 언급 한 우주 다형성과 관련이 있기 때문에 Agda 정의의 l은 무시할 수 있습니다.
중요한 차이점은 Agda의 항등 유형은 A의 두 가지 요소를 인수로 사용하지만 Idris에서는 잠재적으로 다른 유형으로 두 개의 값을 사용할 수 있다는 것 입니다.
다시 말해, Idris에서 다른 유형을 가진 두 가지가 동일하다고 주장 할 수 있지만 (아직 증명할 수없는 주장이더라도) Agda에서는 그 말이 의미가 없습니다.
이것은 유형 이론, 특히 호모 토피 유형 이론과의 협력 가능성과 관련하여 중요하고 광범위한 결과를 가져옵니다. 이를 위해 이기종 평등은 HoTT와 일치하지 않는 공리가 필요하기 때문에 작동하지 않습니다. 다른 한편으로, 동질적인 평등으로 간단하게 언급 될 수없는 이질적인 평등을 가진 유용한 정리를 진술하는 것이 가능하다.
아마도 가장 쉬운 예는 벡터 연결의 연관성입니다. 이렇게 정의 된 벡터라는 길이 인덱스 목록 :
data Vect : Nat -> Type -> Type where
Nil : Vect 0 a
(::) : a -> Vect n a -> Vect (S n) a
다음 유형으로 연결하십시오.
(++) : 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
평등의 왼쪽에는 type이 Vect (n + (m + o)) a
있고 오른쪽 에는 type이기 때문에이 명령문은 동종 평등에서 넌센스 Vect ((n + m) + o) a
입니다. 이질적인 평등을 가진 완벽하게 합리적인 진술입니다.
참고 URL : https://stackoverflow.com/questions/9472488/differences-between-agda-and-idris
'Programming' 카테고리의 다른 글
HAXM으로 OS X v10.9 (Mavericks)를 고정하는 Android 에뮬레이터 (0) | 2020.06.03 |
---|---|
C # .NET에서 App.config는 무엇입니까? (0) | 2020.06.03 |
웹 브라우저에서 GPS 위치 확인 (0) | 2020.06.03 |
Java 7 JVM에서 실행되도록 Java 8 코드를 컴파일 할 수 있습니까? (0) | 2020.06.03 |
C의 정규 표현식 : 예제? (0) | 2020.06.03 |