Coq 如何在特定子表达式中应用重写?

Coq 如何在特定子表达式中应用重写?,coq,logical-foundations,Coq,Logical Foundations,我正在使用在线书籍“软件基础”来了解Coq 在第二章中,要求证明“plus_assoc”定理: 我使用了两个先前证明的定理: Theorem plus_comm : forall n m : nat, n + m = m + n. Theorem plus_n_Sm : forall n m : nat, S (n + m) = n + (S m). 我用n上的归纳法证明了plus_assoc定理: Proof. intros n m p. induction n as [ | n'

我正在使用在线书籍“软件基础”来了解Coq

在第二章中,要求证明“plus_assoc”定理:

我使用了两个先前证明的定理:

Theorem plus_comm : forall n m : nat, n + m = m + n.
Theorem plus_n_Sm : forall n m : nat, S (n + m) = n + (S m).
我用n上的归纳法证明了plus_assoc定理:

Proof.
  intros n m p.
  induction n as [ | n' ].
    reflexivity.

    rewrite plus_comm.
    rewrite <- plus_n_Sm.
    rewrite plus_comm.
    rewrite IHn'.
    symmetry.
    rewrite plus_comm.
我想使用plus_comm获取

p + (m + S n') = S (n' + m + p)
然后再加上

p + S (m + n') = S (n' + m + p)
S (p + (m + n')) = S (n' + m + p)
然后再加上

p + S (m + n') = S (n' + m + p)
S (p + (m + n')) = S (n' + m + p)
然后使用plus_comm完成两次证明,然后使用自反性

S (p + (n' + m)) = S (n' + m + p)
S (n' + m + p) = S (n' + m + p)
小问题是我不知道如何将plus_comm应用于(sn'+m)

最大的问题是:为什么要发行

apply plus_comm.
立即完成证明(在给定上下文(*)中)

提前感谢您的任何澄清


Fabian Pijcke

您可以通过使用(sn')和m对(sn'+m)进行实例化,将plus_comm应用于(sn'+m)


这么快,这么中肯,这么完整!这充分回答了我的问题,非常感谢!此f_equal重写确实非常有用。关于2处的重写加上通信,请参见以下内容:。
    Check plus_comm.
    Check plus_comm (S n').
    Check plus_comm (S n') m.
    rewrite (plus_comm (S n') m).
    rewrite <- plus_n_Sm.
    rewrite <- plus_n_Sm.
    rewrite (plus_comm m n').
    rewrite plus_comm.
    reflexivity.
Qed.
Theorem plus_assoc : forall n m p : nat, n + (m + p) = (n + m) + p.
Proof.
induction n.
  reflexivity.

  intros.
  simpl.
  apply f_equal.
  apply IHn.
Qed.