使用CoRN MathClasses在setoid平等下的向量反射性

时间:2014-11-13 00:24:08

标签: equality typeclass coq

我有一个简单的引理:

Lemma map2_comm: forall A (f:A->A->B) n (a b:t A n), 
                   (forall x y, (f x y) = (f y x)) -> map2 f a b = map2 f b a.

我能够使用标准相等(≡)证明。现在我需要使用setoid相等来证明类似的引理(使用CoRN MathClasses)。我是这个库的新手并且通常输入类并且很难这样做。我的第一次尝试是:

Lemma map2_setoid_comm  `{Equiv B} `{Equiv (t B n)} `{Commutative B A}:
  forall (a b: t A n),
    map2 f a b = map2 f b a.
Proof.
  intros.
  induction n.
  dep_destruct a.
  dep_destruct b.
  simpl.

(这里' ='是' equiv')。简化之后'目标是"(零B)=(零B)"或" [] = []"使用VectorNotations。通常情况下,我会使用'反身性'战术,但它给了我:

Tactic failure: The relation equiv is not a declared reflexive relation. Maybe you need to require the Setoid library.

我想我需要以某种方式为矢量类型定义反身性,但我不知道该怎么做。请指教。

1 个答案:

答案 0 :(得分:0)

首先,需要将引理定义调整为:

Lemma map2_setoid_comm : forall `{CO:Commutative B A f} `{SB: !Setoid B}  ,
                  forall n:nat, Commutative (map2 f (n:=n)).

能够使用反身性

Definition vec_equiv `{Equiv A} {n}: relation (vector A n) := Vforall2 (n:=n) equiv.
Instance vec_Equiv `{Equiv A} {n}: Equiv (vector A n) := vec_equiv.