我試圖定義一個向量的轉速功能,它的大小被嵌入它,我無法弄清楚如何定義它的轉速功能。勒柯克不能看到兩個類型相同
這是我喜歡的類型定義:
Inductive vect {X : Type} : nat -> Type -> Type
:= Nil : vect 0 X
| Cons : forall n, X -> vect n X -> vect (S n) X
.
我已經在上面定義了一些有用的功能:
Fixpoint app {X : Type} {n m : nat} (v1 : vect n X) (v2 : vect m X)
: vect (n + m) X :=
match v1 with
| Nil => v2
| Cons _ x xs => Cons _ x (app xs v2)
end.
Fixpoint fold_left {X Y : Type} {n : nat} (f : Y -> X -> Y) (acc : Y) (v : vect n X)
: Y :=
match v with
| Nil => acc
| Cons _ x xs => fold_left f (f acc x) xs
end.
而現在,我想定義轉。我的第一個嘗試是通過fold_left,但事實證明這是徹底的失敗。
Fixpoint rev {X : Type} {n : nat} (v : @vect X n X) : @vect X n X :=
fold_left (fun {X : Type} {k : nat} (acc : vect k X) (x : X) => x ::: acc) {{ }} v.
我不明白錯誤Error: The type of this term is a product while it is expected to be a sort.
。
我的第二暫定幾乎是好的,但勒柯克看不到「S N =(N + 1)」本身,我不知道怎麼告訴勒柯克左右。
Fixpoint rev {X : Type} {n : nat} (v : @vect X n X) : @vect X n X :=
match v in (vect n X) return (vect n X) with
| Nil => Nil
| Cons _ x xs => app (rev xs) {{ x }}
end.
的誤差爲The term "app (rev X n0 xs) {{x}}" has type "vect (n0 + 1) X" while it is expected to have type "vect (S n0) X"
如果您對COQ代碼的任何其他言論不要猶豫。
A型爲'fold_left'其工作原理是'的forall(X:類型)(Y:NAT - >型)(NK:NAT),(forall的米:NAT,Y米 - > X - >ÿ (S m))→Y k→Vect X n→Y(n + k)。 – jbapple