Vector 矢量加法在Coq中的实现

Vector 矢量加法在Coq中的实现,vector,coq,idris,convoy-pattern,Vector,Coq,Idris,Convoy Pattern,在一些依赖类型的语言(如Idris)中实现向量加法相当简单。根据: 导入数据.Vect %默认总数 pairAdd:numa=>vectnna->vectnna->vectnna pairAdd Nil Nil=Nil pairAdd(x::xs)(y::ys)=x+y::pairAdd xs-ys (请注意,Idris的总体检查程序如何自动推断出添加Nil和非Nil向量在逻辑上是不可能的。) 我尝试在Coq中实现等效功能,使用自定义向量实现,尽管与官方文件中提供的非常类似: 设置隐式参数。

在一些依赖类型的语言(如Idris)中实现向量加法相当简单。根据:

导入数据.Vect
%默认总数
pairAdd:numa=>vectnna->vectnna->vectnna
pairAdd Nil Nil=Nil
pairAdd(x::xs)(y::ys)=x+y::pairAdd xs-ys
(请注意,Idris的总体检查程序如何自动推断出添加
Nil
和非
Nil
向量在逻辑上是不可能的。)

我尝试在Coq中实现等效功能,使用自定义向量实现,尽管与官方文件中提供的非常类似:

设置隐式参数。
感应矢量(X:Type):nat->Type:=
|向量x0
|vcons{n:nat}(h:X)(v:vectorxn):vectorx(sn)。
参数vnul[X]。
不动点vpadd{n:nat}(v1 v2:vector nat n):vector nat n:=
将v1与
|vnul=>vnul
|vcons_ux1v1'=>
将v2与
|vnul=>False\u rect\u_
|vcons x2 v2'=>vcons(x1+x2)(vpadd v1'v2')
结束
结束。
当Coq尝试检查
vpadd
时,会产生以下错误:

Error:
In environment
vpadd : forall n : nat, vector nat n -> vector nat n -> vector nat n
[... other types]
n0 : nat
v1' : vector nat n0
n1 : nat
v2' : vector nat n1
The term "v2'" has type "vector nat n1" while it is expected to have type "vector nat n0".
注意,我使用
False\rect
指定不可能的情况,否则总体检查将无法通过。但是,由于某些原因,类型检查器无法将
n0
n1
统一起来


我做错了什么?

用简单的方式实现这个函数是不可能的,因为:你需要用护航模式重写你的函数。不久前有一篇关于这个的帖子。其思想是,您需要使
匹配
返回一个函数,以便传播索引之间的关系:

Set Implicit Arguments.

Inductive vector (X : Type) : nat -> Type :=
  | vnul : vector X 0
  | vcons {n : nat} (h : X) (v : vector X n) : vector X (S n).
   Arguments vnul [X].

Definition vhd (X : Type) n (v : vector X (S n)) : X :=
  match v with
  | vcons _ h _ => h
  end.

Definition vtl (X : Type) n (v : vector X (S n)) : vector X n :=
  match v with
  | vcons _ _ tl => tl
  end.

Fixpoint vpadd {n : nat} (v1 v2 : vector nat n) : vector nat n :=
  match v1 in vector _ n return vector nat n -> vector nat n with
  | vnul =>           fun _  => vnul
  | vcons _ x1 v1' => fun v2 => vcons (x1 + vhd v2) (vpadd v1' (vtl v2))
  end v2.

此开发包含一个完整的示例: