私はIdrisに機能キューのようなものを実装しようとしていますが、Queue ty n m (n+m)
のような要素の数を持っています。n
は1の要素の数ですVect n ty
、m
第2の要素Vect m ty
であり、(n+m)
が要素です。Idris - ベクトルキューと書き換えルール
問題は、私は暗黙の引数としてこれらのサイズを操作する際に書き換えルールを適用することの問題に実行している、次のとおりです。
module Queue
import Data.Vect as V
data Queue : Type -> Nat -> Nat -> Nat -> Type where
mkQueue : (front : V.Vect n ty)
-> (back : V.Vect m ty)
-> Queue ty n m (n + m)
%name Queue queue
top : Queue ty n m (S k) -> ty
top {n = S j} {m} {k = j + m} (mkQueue front back) =
V.head front
top {n = Z} {m = S j} {k = j} (mkQueue front back) =
V.head $ V.reverse back
bottom : Queue ty n m (S k) -> ty
bottom {m = S j} {n} {k = n + j} (mkQueue front back) =
?some_rewrite_1 (V.head back)
bottom {m = Z} {n = S j} {k = j} (mkQueue front back) =
?some_rewrite_2 (V.head $ V.reverse front)
top
作品が、bottom
ません。私は何とかplusZeroRightNeutral
とplusRightSuccRight
の書き換えを提供する必要があるようですが、どこに書き換えるか、別のオプションがあるかどうかはわかりません。ここではエラーメッセージは以下のとおりです。bottom
の最初の行に
エラー:bottom
の2行目に
Type mismatch between
Queue ty n (S j) (n + S j) (Type of mkQueue front back)
and
Queue ty n (S j) (S (n + j)) (Expected type)
Specifically:
Type mismatch between
plus n (S j)
and
S (n + j)
エラー:私は2を回転させる必要がある場合
Type mismatch between
Queue ty (S j) 0 (S j + 0) (Type of mkQueue front back)
and
Queue ty (S j) 0 (S j) (Expected type)
Specifically:
Type mismatch between
plus (S j) 0
and
S j
個々のサイズを教えてくださいVect
sであり、空の場合と空でない場合は全体のサイズがわかりますQueue
ですので、可能であればすべての情報を追跡したいと考えています。
私は、 'front' /' back'サイズを型に追加することはしません。私は前者が実装/表現の詳細をクライアントコードから隠すべきだと思う。 – Cactus
@Cactus:私は自分のコードをそのフォーマットに移動しているので、 'Queue ty k'だけあります。' MkQueue'の 'k'は'(n + m) 'のままです。 'Vect'はそれ以来、私は保証したい不変量です。 しかし、ここで問題となるのは、 '{n}'と '{m} 'を' top'と 'bottom'の適切な場所に含めることができないということです。その問題をまだ解決しています.... – nomicflux
関連する:[総リアルタイムの永続的なキュー](http://stackoverflow.com/questions/36611533/total-real-time-persistent-queues)。 – user3237465