为什么可以';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这是一项战术工作。如果你
    Print university\u of_neutral.
    在使用它之后,你会看到引理的另一个证明——等式的传递性。你为什么选择使用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.
    
    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.