Coq lt_索引去了哪里?

Coq lt_索引去了哪里?,coq,Coq,我在coq中使用了一个名为lt\u index的引理,我记得它说 n < 2 * m + 1 -> (n - 1) / 2 < m 我的进口产品如下 Require Import Coq.Numbers.Natural.Peano.NPeano. Require Import Arith. 我错过什么了吗 编辑:显然,我梦见了这个lt\u索引引理,但从未存在过。无论如何,我提出了一个相同结果的证明,我添加了1(n-1)/2

我在coq中使用了一个名为
lt\u index
的引理,我记得它说

n < 2 * m + 1 -> (n - 1) / 2 < m
我的进口产品如下

Require Import Coq.Numbers.Natural.Peano.NPeano.
Require Import Arith.
我错过什么了吗

编辑:显然,我梦见了这个
lt\u索引
引理,但从未存在过。无论如何,我提出了一个相同结果的证明,我添加了
1(n-1)/2断言(n虽然尝试手工解决这类问题是一种很好的练习,但从长远来看,如果你真的想做其他事情,它可能会变得单调乏味

有一些策略可以帮助你解决不等式方程组。例如,你可以使用
Psatz
中的
lia
策略,或者
omega
中的
omega
策略。证明条件不是很好,但如果这不重要,为什么不呢

不幸的是,他们不处理除法,所以他们无法解决这个系统,但是库中有一个引理,你可以用它来摆脱
/
。我通过
搜索(\u/\ u<\ uu)找到它。

需要导入Coq.number.Natural.Peano.NPeano。
需要导入Psatz。(*这提供了用于求解线性整数算法的“lia”)
引理lt_solve:forall(n m:nat),
1n<2*m+1->(n-1)/2
虽然尝试手工解决这类问题是一种很好的练习,但从长远来看,如果你真的想做其他事情,它可能会变得单调乏味

有一些策略可以帮助你解决不等式方程组。例如,你可以使用
Psatz
中的
lia
策略,或者
omega
中的
omega
策略。证明条件不是很好,但如果这不重要,为什么不呢

不幸的是,他们不处理除法,所以他们无法解决这个系统,但是库中有一个引理,你可以用它来摆脱
/
。我通过
搜索(\u/\ u<\ uu)找到它。

需要导入Coq.number.Natural.Peano.NPeano。
需要导入Psatz。(*这提供了用于求解线性整数算法的“lia”)
引理lt_solve:forall(n m:nat),
1n<2*m+1->(n-1)/2
如果出于某种原因,您希望使用标准库获得“手动”解决方案,那么就在这里

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.
需要导入Coq.Arith.Arith。
引理lt_solve:forall(n m:nat),
1n<2*m+1->(n-1)/2
如果出于某种原因,您希望使用标准库获得“手动”解决方案,那么就在这里

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.
需要导入Coq.Arith.Arith。
引理lt_solve:forall(n m:nat),
1n<2*m+1->(n-1)/2
我不确定我是否遵循了引理和它的名称之间的联系,你确定这曾经是Coq的std库的一部分吗?是的,这一点也不奇怪,rgrep也没有返回任何有趣的结果。没关系,似乎我在代码中的某个地方承认了这个引理,并将其删除。我编辑了我的帖子并给出了解决方案。谢谢你的帮助,我是not确定我遵循引理和它的名字之间的联系,你确定这曾经是Coq的std库的一部分吗?是的,这一点也不奇怪,rgrep也没有返回任何有趣的结果。没关系,似乎我在代码中的某个地方承认了这个引理,并将其删除。我编辑了我的帖子并给出了解决方案。谢谢你的帮助谢谢@Anton,在e问题:为什么在校对的一开始就添加了带自动的
校对?带自动的
校对的作用是什么?这只是一条捷径。带
校对的结构如下所示。当你看到省略号(
)结束一个战术
t1
,相当于把它变成
t1;
。因此
重写Nat。添加\u 1\u r…
表现为
重写Nat。添加\u 1\u r;auto
。谢谢@Anton,有一个问题:为什么你在证明的一开始就添加了
用auto
证明?用auto
证明
的作用是什么?这只是一个缺点使用
进行证明的结构如下。当您看到省略号(
)时结束一个战术
t1
,相当于把它变成
t1;
。所以
重写Nat.add\u r…
的行为就像
重写Nat.add\u r;auto
。谢谢@larsr。它工作得很好!两个观察结果。一个,在
应用Nat.div\u lt\u上限之后
我必须证明20。我是凭
直觉做的>策略。第二,这个证明的执行产生了一个文件
lia.cache
,我想知道为什么会创建这个文件。谢谢@larsr。它工作得很好!两个观察结果。第一,在
apply Nat.div\u lt\u上限
之后,我必须证明20。我是用
直觉
策略创建的。第二,这个证明的执行产生了一个文件
lia.cache
,我想知道为什么要创建这个文件。
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.
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.