2014-12-03 1 views
5

AGDA에 해당이는 다음 연산자의 사용은 세트 사이에 역수를 표시 할 수 있습니다 : 이드리스에 해당하는합니까 이드리스는 AGDA의 ↔

_↔_ : ∀ {f t} → Set f → Set t → Set _ 

있습니까? 나는 l1l2 임의의 순서로 같은 요소가있을 때 우리가 l1 ~~ l2을 구성 할 수

data Elem : a -> List a -> Type where 
    Here : {xs : List a} -> Elem x (x :: xs) 
    There : {xs : List a} -> Elem x xs -> Elem x (y :: xs) 

(~~) : List a -> List a -> Type 
xs ~~ ys {a} = Elem a xs <-> Elem a ys 

그래서 목록에 가방 평등을 정의하기 위해 노력하고있어.

Agda definition of 은 매우 복잡해 보이며 Idris 표준 라이브러리에 상응하는 것이 있는지 확실하지 않습니다.

infix 7 ~~ 
data (~~) : Type -> Type -> Type where 
    MkIso : {A : Type} -> {B : Type} -> 
      (to : A -> B) -> (from : B -> A) -> 
      (fromTo : (x : A) -> from (to x) = x) -> 
      (toFrom : (y : B) -> to (from y) = y) -> 
      A ~~ B 

당신은 다음과 같이 사용할 수 있습니다

+0

setoid를 사용할 계획이 없다면 [훨씬 간단한 정의] (https://gist.github.com/vituscze/74a9a440471f4627c6af)를 실제로 사용할 수 있습니다. – Vitus

답변

4

AGDA의 의 기본 개념뿐만 아니라 이드리스에서 할 수있을만큼 쉽게 올리기 두 가지 증거로 두 가지 기능을 패키징하는 것입니다 최소한의 예 : 그것뿐만 아니라 평등의 선택을 통해 매개 변수가 있기 때문에

notNot : Bool ~~ Bool 
notNot = MkIso not not prf prf 
    where 
    prf : (x : Bool) -> not (not x) = x 
    prf True = Refl 
    prf False = Refl 

AGDA 버전이 더 복잡 이유는, 그래서 그것은 명제를 할 필요가 없습니다 하나 (어느 것이 가장 엄격한/최고입니다). 위의 ~~의 Idris 정의를 =에서 임의의 PA : A -> A -> TypePB : B -> B -> Type으로 매개 변수화하는 것은 독자의 연습 과제로 남겨 둡니다.

+0

저보다 더 많은 Idris 경험을 가진 사람이'~~'의 정의에서'fromTo'와'toFrom'가 부적절하게 만들 수 있는지에 대한 의견을 덧붙일 수 있기를 바랍니다. – Cactus