是否可以使用' rewrite'重写SF书的Tactics章节中的silly2示例。而不是'申请'?

时间:2016-11-15 12:12:41

标签: coq

Theorem silly2 : forall(n m o p : nat),
     n = m ->
     (forall (q r : nat), q = r -> [q;o] = [r;p]) ->
     [n;o] = [m;p].
Proof.
  intros n m o p eq1 eq2.
  apply eq2.
  apply eq1.
Qed.

SF book意味着可以使用重写来完成上述操作,但我只是不知道如何。知道怎么可能这样做吗?

2 个答案:

答案 0 :(得分:2)

如果正确填写rewrite (eq2 ? ? ?),您应该能够使用?证明这一点。请务必了解正在发生的事情,以便提高您对Coq的理解。

[提示:尝试pose proof (eq2 o)并查看它的作用]

答案 1 :(得分:2)

以下是3个不同版本。在我意识到rewrite错误消息意味着什么之后,我在看到ejgallego在不同背景下的回复之前,我自己想出的第一个。

Theorem silly2 : forall(n m o p : nat),
     n = m ->
     (forall (q r : nat), q = r -> [q;o] = [r;p]) ->
     [n;o] = [m;p].
Proof.
  intros n m o p eq1 eq2.
  rewrite eq2 with (r := m).
  - reflexivity.
  - rewrite eq1. reflexivity.
Qed.

根据ejgallego的建议,第二个似乎是一个功能应用程序的重写。

Theorem silly2' : forall(n m o p : nat),
     n = m ->
     (forall (q r : nat), q = r -> [q;o] = [r;p]) ->
     [n;o] = [m;p].
Proof.
  intros n m o p eq1 eq2.
  rewrite (eq2 n m).
  - reflexivity.
  - rewrite eq1. reflexivity.
Qed.

第三个使用pose proof似乎在假设上进行功能应用而不重写上面的目标。

Theorem silly2'' : forall(n m o p : nat),
     n = m ->
     (forall (q r : nat), q = r -> [q;o] = [r;p]) ->
     [n;o] = [m;p].
Proof.
  intros n m o p eq1 eq2.
  pose proof (eq2 n m).
  apply H.
  apply eq1.
Qed.