为什么可以';Coq能自己算出等式的对称性吗?
假设我们试图将一些(半)群论性质形式化,如下所示:为什么可以';Coq能自己算出等式的对称性吗?,coq,formal-languages,formal-verification,coq-tactic,formal-methods,Coq,Formal Languages,Formal Verification,Coq Tactic,Formal Methods,假设我们试图将一些(半)群论性质形式化,如下所示: 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_neutra
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).
及
由于一个或两个elim
应用程序什么都不做,因此证明在自反性
上分别失败。
当然,基于assert
,它有一个解决方法,但那就是。。。太多的努力和烦人
- 涉及的Coq策略(
,elim
等)对订单如此敏感,有什么原因吗?我想,它不应该明显减慢战术的速度(首先,使用案例
操纵平等是很麻烦的。下面是我将如何编写您的证明,使用elim
,并更改重写
的定义是左中性的
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, op x e = x. Lemma uniqueness_of_neutral: forall a b: A, is_left_neutral a -> is_right_neutral b -> a = b. Proof. intros a b lna rnb. now rewrite <- (lna b), rnb. Qed. End Group.
是的,rewrite@AndrewMiloradovsky这是一项战术工作。如果你
在使用它之后,你会看到引理的另一个证明——等式的传递性。你为什么选择使用elim?这是推理归纳概念的基本工具。它有一个基本的行为,而且更适合于为了说教的目的,它应该保持这种状态。Print university\u of_neutral.
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, op x e = x. Lemma uniqueness_of_neutral: forall a b: A, is_left_neutral a -> is_right_neutral b -> a = b. Proof. intros a b lna rnb. now rewrite <- (lna b), rnb. Qed. End Group.
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, op x e = x. Ltac my_rewrite t := first [ rewrite t | rewrite <- t ]. Lemma uniqueness_of_neutral: forall a b: A, is_left_neutral a -> is_right_neutral b -> a = b. Proof. intros a b lna rnb. now my_rewrite (lna b); my_rewrite rnb. Qed. End Group.