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

时间:2019-11-01 19:18:40

标签: coq

我已经通过使用函数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库中的向量,然后在那儿连接起来,然后再返回,是一种选择,但我想有一种更直接的方法。

1 个答案:

答案 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.
相关问题