我正在尝试在向量上定义rev函数,它的大小嵌入其中,我无法弄清楚如何在其上定义rev函数。
这是我的类型定义:
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.
。
我的第二个尝试几乎是好的,但Coq无法看到" S n =(n + 1)"本地而且我不知道如何告诉Coq。
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代码有任何其他评论,请不要犹豫。