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.