J'ai des problèmes de réécriture en utilisant la tactique setoid_rewrite
. Dans la déclaration de l'instance suivante, je m'attends à ce que setoid_rewrite fmapComp
réécrive fmap iso ∘ fmap inv
à fmap (iso ∘ inv)
. Cependant, Coq rapporte que « aucun progrès n'a été fait » au cours de réécriture:Comportement impair de setoid_rewrite dans 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)
Je ne comprends pas pourquoi setoid_rewrite
échoue. Pour référence, la même commande fonctionne dans d'autres contextes utilisant les termes mêmes. Par exemple, il récrit part et d'autre de l'objectif suivant à l'autre:
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)
On ne sait pas pourquoi setoid_rewrite
œuvres dans le second cas, mais pas la première. Pour référence, ≡
est equiv
et fmap
est Proper
. Autre que cela ≅
, Functor
et Cat
sont des classes, je ne vois pas d'autres faits pertinents. En outre, setoid_replace
fonctionne très bien.
Tourné dans l'obscurité: quelque chose de louche qui se passe dans des arguments implicites, tels que des termes convertibles lorsqu'une certaine tactique exige qu'ils soient égaux? Essayez de comparer les deux situations sous "Pas d'arguments implicites". – Gilles
En parcourant les termes et le contexte avec 'Set Printing All', vous ne voyez rien. Ce qui est étrange, c'est que l'utilisation de 'setoid_rewrite' et de * then * réécriture en utilisant l'égalité désirée fonctionne bien - mais les termes composant les expressions ne semblent pas avoir changé. – danportin
Je ne sais pas où le problème s'est produit. Commencer plus frais et contrôler les arguments implicites plus fortement avec seulement les définitions nécessaires pour l'instance résolu le problème. Donc, je suppose que quelque chose s'est passé enterré dans un module importé, quelque part. – danportin