我有一个简单的引理:
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.
我想我需要以某种方式为矢量类型定义反身性,但我不知道该怎么做。请指教。
答案 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.