Подход 1: используйте мощные такти c.
ring
такти c достаточно мощный, чтобы легко объединить 2^2
и 4
. Вам придется развернуть f
, поскольку это не кольцевая операция.
Lemma f_2: f 2 = 4%R.
Proof.
unfold f.
ring.
Qed.
Подход 2: трудный путь. Чтобы увидеть все, что подразумевается в простом утверждении f 2 = 4
, поможет временно отключить нотацию. Я также открыл область действия R_scope
, чтобы везде мне не требовался суффикс * 1013.
Получается что-то вроде 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
. Разверните его тоже.
Наконец-то мы подошли к базовым c константам. Цель - (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
определено как 2 * 2
, если вы уже не знакомы с тем, как целые числа переводятся в действительные числа.
Lemma f_2: f 2 = 4.
Proof.
unfold f; cbn.
change 4 with (2 * 2).
rewrite Rmult_1_r.
reflexivity.
Qed.