1

我在 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.

对于如此简单的任务,这种方法对我来说似乎有点“非正统”。有没有更好/更简单的方法来做到这一点?

4

2 回答 2

5

是的,有更好的方法。你的引理是一个特例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.

于 2017-04-11T00:04:27.810 回答
1

我没有经常练习 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.
于 2017-04-11T00:02:44.870 回答