假设我们试图形式化一些(半)群论性质,如下所示:
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.
它工作得很好,但是,如果我们颠倒上述任何一个定义中的方程,即用
Definition is_left_neutral (e: A) := forall x: A, x = (op e x).
和
Definition is_right_neutral (e: A) := forall x: A, (op x e) = x.
分别地,证明在 处失败reflexivity
,因为其中一个或两个elim
应用程序什么都不做。当然有一个解决方法,基于assert
,但那是......太多的努力,只是烦人......
所涉及的 Coq 策略( , 等)对顺序如此敏感,有什么原因
elim
吗case
?我想,它不应该显着减慢战术(<< 2 次)。有没有办法让它们
symmetry
在需要的地方自动应用,而不用每次都打扰我?在手册中找不到任何提及此问题的内容。