我已经通过使用函数A
在类型fin n -> A
上定义了向量类型。在不经历归纳向量的情况下,我无法提出一种将向量串联的方法。
我正在使用的有限集的定义是
Fixpoint fin (k : nat) : Type :=
match k with
| 0 => False
| S k => option (fin k)
end.
然后我将大小为k
的向量定义为函数fin k -> 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
。 / p>
我猜这是一个众所周知的定义,但是我找不到向量的这种变体。也许从这种类型移到Coq库中的向量,然后在那儿连接起来,然后再返回,是一种选择,但我想有一种更直接的方法。
答案 0 :(得分:1)
关键是编写一个案例分析运算符,以决定级联函数的输入是在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.