如何在假设中应用Z.divide_add_r?

时间:2017-12-01 18:16:17

标签: coq

我有以下代码:

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

3 个答案:

答案 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是真的。