Supposons que nous essayons de formaliser certains (semi) propriétés du groupe-théorétique, comme ceci:Pourquoi Coq ne peut-il pas comprendre la symétrie de l'égalité par lui-même?
Section Group.
Variable A: Type.
Variable op: A -> A -> A.
Definition is_left_neutral (e: A) := forall x: A, (op e x) = x.
Definition is_right_neutral (e: A) := forall x: A, x = (op x e).
Lemma uniqueness_of_neutral:
forall a b: A, (is_left_neutral a) -> (is_right_neutral b) -> (a = b).
Proof.
intro; intro.
intros lna rnb.
elim lna with b; elim rnb with a.
reflexivity.
Qed.
End Group.
Il fonctionne très bien, mais, si on inverse l'équation dans l'une des définitions ci-dessus, à savoir remplacer les définitions de
Definition is_left_neutral (e: A) := forall x: A, x = (op e x).
et
Definition is_right_neutral (e: A) := forall x: A, (op x e) = x.
respectivement, la preuve ne parvient pas à reflexivity
, car une ou les deux applications elim
ne font rien. Bien sûr, il existe une solution pour elle, basée sur assert
, mais qui est ... trop d'effort et tout simplement ennuyeux ...
Y at-il une raison pour laquelle la tactique impliqués Coq (
elim
,case
, etc.) sont tellement sensibles à la commande? Je suppose, il ne faut pas ralentir sensiblement la tactique (< < 2 fois).Y at-il un moyen de les faire appliquer automatiquement
symmetry
, le cas échéant, sans me déranger à ce sujet à chaque fois? Impossible de trouver une mention de ce problème dans le manuel.
Pourquoi avez-vous choisi d'utiliser élim ? C'est l'outil essentiel pour raisonner sur les notions inductives. Il a un comportement à nu, et il est préférable qu'il reste ainsi, à des fins didactiques. – Yves