以下のコードで問題が発生しています。基本的にスライスタイプを作りたいと思っています。動機づけはPythonから来ており、スライスは[start:end:step]
であり、リストからサブリストをスライスするために使用されます。これは、概念的には、インデックスのシーケンスと同じである[start, start+step, start+2*step, ..., end]
です。再帰型のネストされたコンストラクタ内の証明
私がそれをキャプチャしようとした方法はSlice n
はVect (n+m) a
に適用できます。基本コンストラクタFwdS
は、非ゼロステップ(証明ステップNZ)のスライスを作成します。 SLen
コンストラクタは、既存のスライスのVect
サイズ要件をstep
(を使用して計算)だけインクリメントします。スライスが[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
ではないという証拠を持っていることを理解していません。しかし、私はそのアイデアをどのようにテストするのかは分かりません。