如何证明(2 ^ 2)%R = 4%R

时间:2020-05-01 11:32:00

标签: coq

如何在Coq中证明以下内容?

Require Import Coq.Reals.Reals.

Definition f (x:R) :R := pow x 2.

Lemma f_2: f 2 = 4%R.
Proof.
Admitted.

2 个答案:

答案 0 :(得分:3)

方法1:使用强大的战术。

ring策略足够强大,可以轻松地统一2^24。不过,您必须展开f,因为它不是响铃操作。

Lemma f_2: f 2 = 4%R.
Proof.
  unfold f.
  ring.
Qed.

方法2:艰难的道路。要查看简单语句f 2 = 4中隐含的所有内容,将有助于暂时关闭表示法。我还打开了范围R_scope,这样就不需要在所有地方都使用%R后缀。

我们得到类似eq (f (IZR (Zpos (xO xH)))) (IZR (Zpos (xO (xO xH))))

IZR是将整数转换为实数的函数。让我们来展开它,以及f

现在,我们可以重新打开符号,并且将IPR 2 ^ 2 = IPR 4作为目标。因此,继续展开IPR。 ({IPR整数转换为实数)。

于是目标是IPR_2 1 ^ 2 = IPR_2 2IPR_2还将正整数转换为实数,但引入了2的因数。它基本上是IPR的便捷函数。还要展开。

最后,我们要介绍基本常数。目标是(R1 + R1) ^ 2 = (R1 + R1) * (R1 + R1)。让我们简化功能。像cbn这样的简化策略之一会起作用。目标变为(R1 + R1) * ((R1 + R1) * 1) = (R1 + R1) * (R1 + R1)。所以最后,我们可以使用该x * 1 = x。搜索"*"(更好的是Search (?x * 1 = ?x).),我发现Rmult_1_r是我们想要的。使用rewrite Rmulti_1_r,然后使用reflexivity

Lemma f_2: f 2 = 4.
Proof.
  unfold f, IZR.
  unfold IPR.
  unfold IPR_2.
  cbn.
  (* Search (?x * 1 = ?x). *)
  rewrite Rmult_1_r.
  reflexivity.
Qed.

当然,所有这些展开的步骤都是纯粹的计算,因此我们可以通过说诸如change 4 with (2 * 2).之类来跳到最后,但是将4定义为{{1} },除非您已经熟悉整数如何转换为实数。

2 * 2

答案 1 :(得分:1)

您首先需要通过“展开”功能来公开功能f的定义:

Require Import Coq.Reals.Reals.  (* "Require Import Reals." would be OK as well. *)
Definition f (x : R) : R := pow x 2.

Lemma f_2 : f 2 = 4%R.
Proof.
unfold f.

然后您得到:

1 subgoal

  ============================
  (2 ^ 2)%R = 4%R

达成这一目标的一种惯用方式是依靠ring策略:

ring.
Qed.

有关此策略的更多详细信息,请参见official Coq doc