Coq中setoid_rewrite的奇怪行为

时间:2011-11-14 10:51:25

标签: rewrite typeclass coq

我在使用setoid_rewrite策略进行重写时遇到问题。在以下实例声明中,我希望setoid_rewrite fmapCompfmap iso ∘ fmap inv重写为fmap (iso ∘ inv)。然而,Coq报告称在重写过程中“没有取得任何进展”:

Instance functorsPreserveIsomorphisms
 `{C : Cat o η} `{D : Cat u ρ}
   {a b : o} {φ : o → u} (F : Functor C D φ) (I : a ≅ b) : φ a ≅ φ b.
Proof.
  apply (Build_Isomorphism _ _ _ (φ a) (φ b) (fmap iso) (fmap inv)).

 o : Type
 η : o → o → Type
 C : Cat o η
 u : Type
 ρ : u → u → Type
 D : Cat u ρ
 a : o
 b : o
 φ : o → u
 F : Functor C D φ
 I : a ≅ b
 ============================
  fmap iso ∘ fmap inv ≡ id (φ a)

我不明白为什么setoid_rewrite失败了。作为参考,相同的命令在其他上下文中使用相同的术语。例如,它将以下目标的任一方重写为另一方:

Lemma worksotherwise
 `{C : Cat o η} `{D : Cat u ρ}
   {a b : o} {φ : o → u} (F : Functor C D φ) (I : a ≅ b) :
     fmap iso ∘ fmap inv ≡ fmap (iso ∘ inv)

 o : Type
 η : o → o → Type
 C : Cat o η
 u : Type
 ρ : u → u → Type
 D : Cat u ρ
 a : o
 b : o
 φ : o → u
 F : Functor C D φ
 I : a ≅ b
 ============================
  fmap iso ∘ fmap inv ≡ fmap (iso ∘ inv)

目前还不清楚为什么setoid_rewrite在第二种情况下起作用而在第一种情况下不起作用。作为参考,equivfmapProper。除了FunctorCat是类之外,我没有看到任何其他相关事实。此外,setoid_replace工作正常。

1 个答案:

答案 0 :(得分:6)

这是在黑暗中拍摄而没有看到整个发展,但有时,当你看不出差异时,这意味着你看不到的部分存在差异。即隐式参数。

例如,您可能在工作证明尝试中的两个位置出现相同的隐式参数,并且在非工作证明尝试中以两个不同但可互换(或甚至仅仅相等)的形式出现。偶尔战术需要相同的术语才能启动,而可互换的术语就足以使用相同的证明树,而同等的术语就足以明智地引入eq_refl。当你使用诸如setoid战术等高级策略时,可能很难理解幕后发生的事情。

尝试比较Set Printing ImplicitSet Printing All下的情况,或使用No Strict ImplicitNo Implicit Arguments进行比较,以获得证据的一小部分。