Coq无法看到两种类型是相同的

时间:2015-09-09 19:42:35

标签: types functional-programming coq

我正在尝试在向量上定义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代码有任何其他评论,请不要犹豫。

0 个答案:

没有答案