在 Ssreflect 中证明简单的不等式

Proving simple inequality in Ssreflect

我在 Coq 中使用 MathComp 库进行反射时遇到了一些非常简单的证明问题。

假设我想证明这个引理:

From mathcomp Require Import ssreflect ssrbool ssrnat.

Lemma example m n: n.+1 < m -> n < m.
Proof.
      have predn_ltn_k k: (0 < k.-1) -> (0 < k).
          by case: k.
      rewrite -subn_gt0 subnS => submn_pred_gt0.
      by rewrite -subn_gt0; apply predn_ltn_k.
Qed.

对于这样一个简单的任务,这种方法对我来说似乎有点 "unorthodox"。有 better/simpler 的方法吗?

我没有经常练习 ssreflect,所以我不能确定这是否可以解决,但基本上我的想法是 n < n.+1 < m:

Require Import mathcomp.ssreflect.ssrnat.
Require Import mathcomp.ssreflect.ssrbool.
Require Import mathcomp.ssreflect.ssreflect.

Lemma example m n: n.+1 < m -> n < m.
Proof.
move => ltSnm; apply: ltn_trans; by [apply ltnSn | apply ltSnm].
Qed.

是的,有更好的方法。你的引理是 ltnW : forall m n, m < n -> m <= n:

的特例
Lemma example n m : n.+1 < m -> n < m.
Proof. exact: ltnW. Qed.

之所以有效,是因为 n < m 实际上是 n.+1 <= m 的语法糖。