互斥的自然数对

时间:2019-09-13 17:02:46

标签: coq

我有一个函数,可以给我一对自然数。
每对都由其序列号标识,例如sr1=(1,25) sr2=(26,50) sr3=(51,75)
平均数为25。然后,我还有另一个函数,可为我提供每对第一对和第二对之间存在的自然数的列表,例如l1=[1,2,......25] l2=[26,27...50]

我想证明,如果对的序列号不同,则列表中不会重复任何元素。因此,配对是互​​斥的。

Lemma lgroups: forall sn1 sn2 avg, 
S sn1 < S sn2 -> 
avg =? 0  = false ->
(S sn1 * avg <? S sn2 * avg - (avg - 1) = true)

Proof. intros. induction sn1 .  rewrite mult_1_l.
simpl. induction sn2. simpl. rewrite plus1_0_r.
destruct avg. inversion H0. inversion H . 



1 个答案:

答案 0 :(得分:2)

对我而言,上下文还不是很清楚,但是我可以回答证明给定引理的问题。

首先,此类引理通常不会使用布尔运算来陈述,而是使用它们的命题对应物来陈述。这样会得到这样的结果。

Lemma lgroups: forall sn1 sn2 avg,
  S sn1 < S sn2 -> 
  avg <> 0 ->
  S sn1 * avg < S sn2 * avg - (avg - 1).

第二,在处理自然数时,我一般也倾向于使用+代替-,因为由于没有负数,自然数的行为有点不自然。我认为,在您的情况下,这也更有意义,因为它正确表达了直观的陈述“当前序列的最后一个元素小于随后出现的第一个元素”,而我对此的含义还不清楚您的原始声明。

Lemma lgroups: forall sn1 sn2 avg,
  S sn1 < S sn2 -> 
  avg <> 0 ->
  S sn1 * avg + avg - 1 < S sn2 * avg.

第三,我也将S放到任何地方,因为结果在这种情况下也成立并且严格。

Lemma lgroups: forall sn1 sn2 avg,
  sn1 < sn2 -> 
  avg <> 0 ->
  sn1 * avg + avg - 1 < sn2 * avg.

对于证明,这种简单的算术证明实际上可以通过某些策略自动证明,特别是Micromega中的策略nia

这最终给出:

Require Import Lia.

Lemma lgroups: forall sn1 sn2 avg,
  sn1 < sn2 -> 
  avg <> 0 ->
  sn1 * avg + avg - 1 < sn2 * avg.
Proof.
  intros. nia.
Qed.