我在使用setoid_rewrite
策略进行重写时遇到问题。在以下实例声明中,我希望setoid_rewrite fmapComp
将fmap 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
在第二种情况下起作用而在第一种情况下不起作用。作为参考,≡
为equiv
,fmap
为Proper
。除了≅
,Functor
和Cat
是类之外,我没有看到任何其他相关事实。此外,setoid_replace
工作正常。
答案 0 :(得分:6)
这是在黑暗中拍摄而没有看到整个发展,但有时,当你看不出差异时,这意味着你看不到的部分存在差异。即隐式参数。
例如,您可能在工作证明尝试中的两个位置出现相同的隐式参数,并且在非工作证明尝试中以两个不同但可互换(或甚至仅仅相等)的形式出现。偶尔战术需要相同的术语才能启动,而可互换的术语就足以使用相同的证明树,而同等的术语就足以明智地引入eq_refl
。当你使用诸如setoid战术等高级策略时,可能很难理解幕后发生的事情。
尝试比较Set Printing Implicit
或Set Printing All
下的情况,或使用No Strict Implicit
或No Implicit Arguments
进行比较,以获得证据的一小部分。