문제

나는 종속적으로 입력 된 프로그래밍으로 다이빙을 시작하고 AGDA와 IDRIS 언어가 Haskell에 가장 가까운 것으로 나타 났으므로 나는 거기에서 시작했습니다.

내 질문은 다음과 같습니다. 그 사이의 주요 차이점은 무엇입니까?유형 시스템이 모두 둘 다 똑같이 익숙합니까?혜택에 대한 포괄적 인 비교 및 토론을 갖는 것이 좋을 것입니다.

나는 몇 가지를 발견 할 수있었습니다.

도움이 되었습니까?

해결책

iDris를 구현하는 것처럼이 문제에 대답 할 수있는 가장 좋은 사람이 아닐 수도 있습니다! FAQ - http://docs.idris-lang.org/ko. /latest/faq/faq.html - 그 위에 말할 것이 있지만 조금만 확장하는 것 :

IDRIS는 정리 증명보다 앞서있는 범용 프로그래밍을 지원하기 위해지면에서 설계되었으며, 유형 수업, 기술 표기법, 관용구 괄호, 목록 포괄, 과부하 등과 같은 높은 수준의 기능을 갖추고 있습니다. IDRIS는 대화 형 증거보다 높은 수준의 프로그래밍을 착용하지만, IDRIS는 전술 기반 정교한 전술 기반 상호 작용하는 전술 기반 인터랙티브 정리 프로젝트 (CoQ와 같은 비트와 비슷하지만 아직 아직 없음)에 대한 인터페이스가 있습니다.

다른 일은 IDRI가 잘 지원하는 것을 목표로하고 DSL 구현을 포함합니다. Haskell을 사용하면 기술 표기법을 사용하여 먼 길을 볼 수 있으며 IDRIS를 사용할 수 있지만 응용 프로그램 및 변수 바인딩과 같은 다른 구조물과 같은 다른 구조물을 리 바인드 할 수도 있습니다. 자습서에서 더 자세한 내용이나 본 문서의 전체 세부 정보 : http://eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf

또 다른 차이는 편집 중입니다. AGDA는 주로 Haskell을 통해 IDRIS를 통해 C를 통해이어서 C. C.를 통해 IDRIS와 동일한 백 엔드를 사용하는 AGDA의 실험 백 엔드가 있습니다. 나는 그것이 얼마나 잘 유지되었는지 모르겠습니다. IDRI의 주요 목표는 항상 효율적인 코드를 생성하는 것입니다. 현재 우리가 현재 수행하는 것보다 훨씬 잘 수행 할 수는 있지만 우리는 그것에 대해 연구하고 있습니다.

AGDA 및 IDRI의 유형 시스템은 많은 중요한 측면에서 꽤 유사합니다. 나는 주요 차이가 유니버스 취급에 있다고 생각합니다. Agda는 우주 다형성을 가지고 있습니다. Idris는 cumpulativity 를 가지고 있습니다. 이것을 너무 제한적으로 찾아서 증거가 거의 없을 수도 있음을 꺼리지 마십시오.

다른 팁

IDRIS와 AGDA 간의 다른 차이는 IDRIS의 명제 평등이 이질적이며 AGDA는 균질합니다.

다른 말로하면, iDRI의 평등의 추정 정의는 다음과 같습니다 :

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
.

edwin이 그의 답변에서 언급하는 우주 다형성과 관련이 있으므로 AGDA eRIMINTION의 L은 무시 될 수 있습니다.

AGDA의 평등 유형은 AS 인수의 두 가지 요소를 취하는 동안 iDRI는 잠재적으로 다른 유형으로 두 값을 취할 수 있다는 것입니다.

다른 말로하면, IDRI에서는 다른 유형의 두 가지가 동일하다고 주장 할 수 있습니다.

이것은 특히 동부 토포 타입 이론을 사용하는 타당성에 관한 유형 이론에 중요하고 광범위한 결과를 가져 왔습니다. 이를 위해, 이기종 평등은 뜨거운 것과 일치하지 않는 공리가 필요하기 때문에 작동하지 않습니다. 반면에 균일 한 평등으로 간단하게 언급 할 수없는 이질적인 평등을 가진 유용한 이론을 주도 할 수 있습니다.

아마도 가장 쉬운 예제는 벡터 연결의 연관성입니다. 이렇게 정의 된 Vectors라는 길이가 주어진 목록으로 표시됩니다.

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
.

이 진술은 평등의 왼쪽이 Vect (n + (m + o)) a 유형이고 오른쪽에는 Vect ((n + m) + o) a가 유형이기 때문에 균질 한 평등하에 익숙하지 않습니다. 이질적 인 평등을 가진 완벽하게 현명한 진술입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top