종속 유형에 익숙하지 않고 하스켈 환경에서 천천히 Idris를 배우고 있습니다. 운동을 위해 허프만 인코딩을 작성하려고합니다. 현재 코드 트리의 "병합 (flattening)"이 접두어 코드를 생성하지만 한정 기호에 얽매이지는 않았다는 증거를 작성하려고합니다.Idris의 한정어 및 복합 부울 제안을
using (xs : List a, ys : List a)
data Prefix : List a -> List a -> Type where
pEmpty : Prefix Nil ys
pNext : (x : a) -> Prefix xs ys -> Prefix (x :: xs) (x :: ys)
이 유효한 방법입니다 :
나는 하나 개의 목록은 다른 접두사임을 간단한 유도 제안이? 또는 같은 것보다 "XS가있는 경우 YS의 접두사 ZS 같은 XS ++ ZS = YS가있다"?"forall"한정 기호를 소개하는 올바른 방법 이었습니까? (내가 이해할 수있는 한 Agda에서는
pNext : ∀ {x xs ys} → Prefix xs ys → Prefix (x :: xs) (y :: ys)
과 같을 것입니다)? pNext 첫 번째 인수가 암시 적이어야합니까? 두 변종 사이의 의미 차이는 무엇입니까?pvEmpty : PrefVect Nil
과 주어진 :
data PrefVect : Vect n (List a) -> Type where
빈 벡터에는 접두사가 없습니다 : 요소 중 어느 것도 또 다른 접두사가없는 경우
그런 다음 나는 벡터를 구축하고자 요소 x, 벡터 xs, 그리고 xs의 아무 요소도 x의 접두어가 아니며 (그 반대의 경우도) x : xs는 해당 속성을 보유합니다.
pvNext : (x : [a]) -> (xs : Vect n [a]) ->
All (\y => Not (Prefix x y)) xs ->
All (\y => Not (Prefix y x)) xs ->
PrefVect (x :: xs)
이것은 첫 번째 문제를 해결 한 후에 해결할 수있는 유효하지 않은 유형이지만 pvNext의 한정 기호에 대해 비슷한 질문이 있습니다.이 변형이 허용 가능하거나 "관계에 부정"을 형성하는 더 좋은 방법이 있습니다. ?
감사합니다.