我在coq中使用了一个名为lt_index
的引理,我记得它说明了
n < 2 * m + 1 -> (n - 1) / 2 < m
现在,我不能再使用这个引理了,当我SearchAbout lt_index
时,coq回答
Error: The reference lt_index was not found in the current environment.
我的导入如下
Require Import Coq.Numbers.Natural.Peano.NPeano.
Require Import Arith.
我错过了什么吗?
编辑:显然,我梦见这个lt_index
引理并且从未存在过。无论如何,我想出了相同结果的证明,我添加了1 <= n
作为前提条件。这是
Lemma lt_solve:forall (n m:nat), 1 <= n -> n < 2 * m + 1 -> (n - 1) / 2 < m.
Proof.
intros.
assert (n <= n - 1 + 1).
apply Nat.sub_add_le.
inversion H1.
rewrite <-H2.
rewrite H2 in H0.
rewrite plus_comm in H0.
assert (2*m+1=1+2*m).
apply plus_comm.
rewrite H3 in H0.
apply plus_lt_reg_l in H0.
apply Nat.div_lt_upper_bound in H0.
trivial.
discriminate.
rewrite plus_comm in H2.
rewrite (le_plus_minus_r 1 n) in H2.
eapply (le_lt_trans n m0 (S m0)) in H3.
rewrite H2 in H3.
contradict H3.
apply lt_irrefl.
apply lt_n_Sn.
trivial.
Qed.
如果你意识到这个证据有所改进,我很高兴听到它。
答案 0 :(得分:2)
尽管尝试用手工解决这些问题是好的,但从长远来看,如果你真的想在其他方面工作,它会变得单调乏味。
有一些策略可以帮助你解决具有不等式的方程组。例如,您可以使用lia
中的Psatz
或omega
中的Omega
中的策略。证明条款不是很好看,但如果这不重要,那么为什么不呢。
不幸的是他们没有处理分裂,所以他们无法解决这个系统,但是库中有一个可以用来摆脱/
的引理。我通过Search ( _ / _ < _ ).
Require Import Coq.Numbers.Natural.Peano.NPeano.
Require Import Psatz. (* this provides 'lia' for solving linear integer arithmetic *)
Lemma lt_solve:forall (n m:nat),
1 <= n -> n < 2 * m + 1 -> (n - 1) / 2 < m.
Proof.
intros; apply Nat.div_lt_upper_bound; lia.
Qed.
答案 1 :(得分:0)
如果您出于某种原因希望获得&#34;手册&#34;解决方案,使用标准库,然后在这里。
Require Import Coq.Arith.Arith.
Lemma lt_solve : forall (n m:nat),
1 <= n -> n < 2 * m + 1 -> (n - 1) / 2 < m.
Proof with auto.
intros.
apply Nat.div_lt_upper_bound...
destruct n.
- inversion H.
- rewrite Nat.sub_succ.
rewrite Nat.sub_0_r.
rewrite (Nat.add_lt_mono_r _ _ 1).
rewrite Nat.add_1_r...
Qed.