Coq 如何连接定义为有限类型函数的向量

Coq 如何连接定义为有限类型函数的向量,coq,Coq,我使用函数fin n->a在类型a上定义了向量类型。我想不出一种方法来连接向量而不经过归纳向量 我使用的有限集的定义是 Fixpoint fin (k : nat) : Type := match k with | 0 => False | S k => option (fin k) end. 然后我将大小为k的向量定义为函数fink->A 如何连接这些向量 concat {A : Type} (n m : nat) (v1 : fin n -> A) (v2

我使用函数
fin n->a
在类型
a
上定义了向量类型。我想不出一种方法来连接向量而不经过归纳向量

我使用的有限集的定义是

Fixpoint fin (k : nat) : Type :=
  match k with
  | 0 => False
  | S k => option (fin k)
  end.
然后我将大小为
k
的向量定义为函数
fink->A

如何连接这些向量

concat {A : Type} (n m : nat) (v1 : fin n -> A) (v2 : fin m -> A) (i : fin (n + m)) : A
我在
n
上尝试了模式匹配,但它似乎没有确认
I
fin m
类型,然后是
0
情况


我想这是一个众所周知的定义,但我找不到向量的这个变体。也许从这种类型转移到Coq库中的向量,在那里连接,然后返回是一种选择,但我希望有一种更直接的方法。

关键是编写一个案例分析操作符,以确定连接函数的输入是在
n
侧还是
m
侧:

Fixpoint fin n :=
  match n with
  | 0 => Empty_set
  | S n => option (fin n)
  end.

Fixpoint case_fin n m : fin (n + m) -> fin n + fin m :=
  match n return fin (n + m) -> fin n + fin m with
  | 0 => fun i => inr i
  | S n => fun i =>
             match i with
             | None => inl None
             | Some j => match case_fin n m j with
                         | inl j => inl (Some j)
                         | inr j => inr j
                         end
             end
  end.

Fixpoint concat {A} n m (f : fin n -> A) (g : fin m -> A) (i : fin (n + m)) : A :=
  match case_fin n m i with
  | inl i => f i
  | inr i => g i
  end.