Вы не можете применить эту теорему, потому что нотация mod
относится к функции натуральных чисел Nat.modulo
в контексте, где вы используете натуральные числа, а нотация mod
относится к Z.modulo
, когда вы ссылаетесь на целые числа типа Z
.
Используя команду Search
, вы можете искать теоремы о Nat.modulo
и (_ + _)%nat
, и вы увидите, что некоторые существующие теоремы действительно близки вашим потребностям (Nat.add_mod_idemp_l
и Nat.add_mod_idemp_r
).
Вы также можете найти теорему, связывающую Z.modulo
и Nat.modulo
. Это дает mod_Zmod
. Но это заставляет работать с целыми числами:
Require Import Arith ZArith.
Search Z.modulo Nat.modulo.
(* The answer is :
mod_Zmod: forall n m, m <> 0 -> Z.of_nat (n mod m) =
(Z.of_nat n mod Z.of_nat m)%Z *)
Один из выходов - найти теорему, которая говорит вам, что функция Z.of_nat
инъективна. Я нашел его, набрав следующую команду.
Search Z.of_nat "inj".
В составленном длинном списке соответствующей теоремой является Nat2Z.inj
, затем вам нужно показать, как Z.of_nat
взаимодействует со всеми задействованными операторами. Большинство этих теорем требуют, чтобы n
было ненулевым, поэтому я добавляю это как условие. Вот пример.
Lemma example (a b n : nat) :
n <> 0 -> (a + b) mod n = (a mod n + b mod n) mod n.
Proof.
intro nn0.
apply Nat2Z.inj.
rewrite !mod_Zmod; auto.
rewrite !Nat2Z.inj_add.
rewrite !mod_Zmod; auto.
rewrite Zplus_mod.
easy.
Qed.
Это отвечает на ваш вопрос, но, честно говоря, я считаю, что вам лучше использовать леммы Nat.add_mod_idemp_l
и Nat.add_mod_idemp_r
.
person
Yves
schedule
15.06.2020