如何在Coq中证明以下内容?
Require Import Coq.Reals.Reals.
Definition f (x:R) :R := pow x 2.
Lemma f_2: f 2 = 4%R.
Proof.
Admitted.
答案 0 :(得分:3)
方法1:使用强大的战术。
ring
策略足够强大,可以轻松地统一2^2
和4
。不过,您必须展开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 2
。 IPR_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。