我如何证明' S x> 0'从头开始在Coq?

时间:2016-06-17 15:14:34

标签: coq coq-tactic

我如何证明这个简单的事实

forall x:nat, S x > 0.

我的逻辑是

  1. 对于任何自然,n> n> 0或n = 0。

  2. S x = 0导致矛盾。

  3. 我的主要问题是我无法记住关于nat的所有这些微不足道的定理/引理,而且我不太了解搜索命令。

    我试图破坏GT'或者'>'构造函数,或对'进行一些反转。但我无法弄清楚语法或这是否是正确的方向。

    任何帮助(除了像欧米茄这样的重物)都非常感谢。

3 个答案:

答案 0 :(得分:2)

这是另一种方法(基于您对自然数的观察)。

首先,我们需要导入一个包含许多关于自然数的事实的模块(没有这个导入Search将无法找到我们要查找的内容):

Require Import Coq.Arith.Arith. 

现在,让我们来看看引理,它指出任何nat都是0或大于0

Search ({_ = 0} + {_}).

此搜索结果

zerop: forall n : nat, {n = 0} + {0 < n},

这是Coq对先前观察到的事实的说法。

使用zerop引理,我们最终可以证明我们的目标:

Goal forall x:nat, S x > 0.
  intros x. 
  destruct (zerop (S x)).

(* subcase S x = 0 *)
  discriminate.             (* deals with the contradiction *)

(* subcase S x > 0 *)
  assumption.
Qed.

<小时/> 顺便说一下,标准库中有一个引理(从Coq v8.5开始),它与你的引理完全相同:

Search (S _ > 0).

这导致gt_Sn_O: forall n : nat, S n > 0,你可以在标准库中查看这个引理的实现(它反过来使用了几个引理)。

答案 1 :(得分:1)

这里有一些可以帮到你的命令:

  • Unset Printing Notations.,以便能够看到哪些符号对应

  • Print ID.查看标识符ID

  • unfold ID.按其定义

  • 替换ID
  • SearchAbout (ID (CON ?m) ?n)查找涉及ID的结果适用于子项的CON和任何其他子项(如果您重复使用相同的?m占位符,搜索只返回相应子符号匹配的结果)。

例如,在您的情况下,这可能会导致此交互式会话:

Unset Printing Notations.
Goal forall x:nat, S x > 0.
intro x.
Print gt.
unfold gt.
Print lt.
unfold lt.
Print le.
SearchAbout (le (S ?m) (S ?n)).
apply le_n_S.
SearchAbout (le 0 ?m).
apply le_0_n.
Qed.

答案 2 :(得分:1)

我提出了一种基于<运算符的计算编码的替代解决方案:

From mathcomp
Require Import ssreflect ssrbool ssrfun eqtype ssrnat.

Lemma test n : 0 < n.+1.
Proof. by []. Qed.

这是如何工作的?实际上,这是有效的,因为我们将<操作定义为函数:

(m < n) = (m.+1 <= n) = (m.+1 - n == 0)

当应用于你的引理时,它变为:

(0 < n.+1) = (0.+1 <= n.+1) = (1 - n.+1 == 0) = (0 - n == 0) = (0 == 0) = true