我有以下代码:
Require Import Znumtheory.
Require Import Zdiv.
Require Import ZArith.
Import Z.
Definition modulo (a b n : Z) : Prop := (n | (a - b)).
Notation "( a == b [ n ])" := (modulo a b n).
这是我试图证明的一个引理:
Lemma modulo_plus_eq : forall a b c m n : Z,
(a * m + b * n == c [ n ]) -> (a * m == c [ n ]).
这是我到目前为止所尝试的内容:
Proof.
intros a b c m n Hab.
red in Hab |- *.
unfold Zminus in Hab.
rewrite Zplus_comm in Hab.
rewrite Zplus_assoc in Hab.
cut (n | b * n).
intros Hbn.
我如何完成证明?
以下是一个后续问题:Chinese Remainder Theorem
答案 0 :(得分:1)
首先让我给你一些提示:如果你打开范围Z
有些事情会更容易,你也可以用你的_ == _ [ _ ]
符号去除括号(但这是主观的,课程)。
Open Scope Z.
Notation "a == b [ n ]" := (modulo a b n) (at level 50).
您拥有标准库中的所有引号,以使证明更简单:
Lemma modulo_plus_eq a b c m n :
a * m + b * n == c [ n ] -> a * m == c [ n ].
Proof.
intros H.
apply divide_add_cancel_r with (m := b * n).
- apply divide_factor_r.
- now rewrite add_sub_assoc, add_comm.
Qed.
我们还可以使modulo_plus_extension
的证明更简单:
Lemma modulo_plus_extension a b c m n :
a * m == c [ n ] -> a * m + b * n == c [ n ].
Proof.
intros Ham; red in Ham |- *.
rewrite add_sub_swap.
apply divide_add_r; [assumption | apply divide_factor_r].
Qed.
您可以使用Search
命令在标准库中查找可以通过一步或两步执行所需操作的引号。您只需要明确说明您想要的内容:
Search (?x + ?y - ?z = ?x - ?z + ?y).
有时可以展示符号,例如:unfold "_ == _ [ _ ]" in *.
,它比red in Ham |- *.
更明确。
答案 1 :(得分:1)
Psatz
模块中具有lia
策略的线性整数算法得到了很好的支持。 (对于线性实数算术,还有lra
策略。)
请参阅ref man。
有了它,你可以用一行来解决你的目标。
Require Import Psatz.
Lemma modulo_plus_extension :
forall a b c m n: Z, (a * m == c [ n ]) -> (a * m + b * n == c [ n ]).
Proof. unfold modulo, divide; destruct 1 as [z H]; exists (z+b); lia. Qed.
Lemma modulo_plus_eq :
forall a b c m n : Z, (a * m + b * n == c [ n ]) -> (a * m == c [ n ]).
Proof. unfold modulo, divide; destruct 1 as [z H]; exists (z-b); lia. Qed.
lia
必须解决的目标是
a, b, c, m, n, z : Z
H : a * m + b * n - c = z * n
============================
a * m - c = (z - b) * n
你可以通过很多对交换性,分配性等的吸引力来解决自己。能够手工完成它是好事,但过了一段时间它会变得单调乏味,然后有一种策略可以让您专注于证明的有趣部分。
答案 2 :(得分:0)
你要做的事实并非如此。 Z.divide_add_r
如果你已经知道(n | m)和(n | p),那么(n | m + p)。您有一个形式(n | m + p)和想要(n | m)和(n | p)的假设,它与Z.divide_add_r
相反,但事实并非如此:例如, 3 | 3但不是3 | 1也不3 | 2是真的。