아래 코드를 사용하는 데 문제가 있습니다. 본질적으로 슬라이스 유형을 만들고 싶습니다. 동기 부여는 Python에서 이루어지며 슬라이스는 [start:end:step]
이며 목록에서 하위 목록을 분할하는 데 사용됩니다. 이것은 개념적으로 일련의 인덱스 인 [start, start+step, start+2*step, ..., end]
과 같습니다.재귀 유형의 중첩 생성자 내부에있는 증명
캡처하려고 시도한 방식은 Slice n
이며 Vect (n+m) a
에 적용 할 수 있습니다. 기본 생성자 FwdS
은 0이 아닌 단계 (증명 단계 NZ)로 슬라이스를 만듭니다. SLen
생성자는 기존 슬라이스의 Vect
크기 요구 사항을 step
(stepOf
을 사용하여 계산)만큼 증가시킵니다. 슬라이스가 [start:stop:step]
경우
start := # of SStart in slice
stop := start + (# of SLen) * step
step := constructor argument in FwdS
: 마찬가지로 SStart
1.
에 의해 조각의 Vect
크기 요구 사항은 다음 최종 값이 개념에 해당 증가시킨다.
mutual
data Slice : Nat -> Type where
FwdS : (step : Nat) -> {stepNZ : Not (step = Z)} -> Slice Z
SLen : (x : Slice len) -> Slice (len + (stepOf x))
SStart : Slice len -> Slice (S len)
stepOf : Slice n -> Nat
stepOf (FwdS step) = step
stepOf (SLen slice) = stepOf slice
stepOf (SStart slice) = stepOf slice
length : Slice n -> Nat
length (FwdS step) = Z
length (SLen slice) = let step = stepOf slice
len = length slice
in len + step
length (SStart slice) = length slice
select : (slice: Slice n) -> Vect (n+m) a -> Vect (length slice) a
select (FwdS step) xs = []
select (SStart slice) (x :: xs) = select slice xs
select (SLen slice) (xs) = ?trouble
마지막 패턴에 문제가 있습니다. 문제가 무엇인지 잘 모르겠습니다. xs
에 분할을 시도하면 []
과 (_::_)
이 모두 불가능합니다.
select (SLen slice) (x :: xs) = let rec = drop (stepOf slice) (x::xs)
in x :: (select slice rec)
와 이드리스는 첫 번째 인수는 SLen
생성자 인 경우, 2 번째의 인수가 []
을 할 수 없다는 인식이 : 이상적으로는이 경우 이런 식으로 뭔가를 읽도록하고 싶습니다. 내 직관은 SLen
레벨에서 Idris는 이미 stepOf slice
이 Z
이 아니라는 증거가 있다는 것을 이해하지 못합니다. 하지만 그 아이디어를 테스트하는 방법을 모르겠습니다.