等于在 Coq 中表示小于或等于

Equal implies Less-Than-Or-Equal in Coq

我正在尝试证明 Coq 中最简单的事情:

Require Import Coq.Structures.OrdersFacts.
Require Import Coq.Structures.Orders.
Lemma easy: forall a b : nat, (a = b) -> (a <= b).
Proof.
  intros.
  apply le_lteq.          (* doesn't work *)
  apply LeIsLtEq.le_lteq. (* doesn't work *)

但是我收到以下错误:

The reference le_lteq
was not found in the current
environment.

这有点奇怪,因为我 Coq.Structures.Orders

中看到了它

正如您在提供的 link 中看到的那样, le_lteq 的定义不在顶层,而是隐藏在其他模块之后。遇到这个问题的一般解决方案是使用 Locate.

Locate le_lteq.

将告诉您哪些定义(在范围内,在 Require 之后可用)具有该名称以及如何调用它们。

请注意,它也适用于符号。

Locate "=".

在这种特殊情况下,它确实不起作用,因为 le_lteq 不仅隐藏在模块后面,而且隐藏在函子后面。 例如它出现在

Module OT_to_Full (O:OrderedType') <: OrderedTypeFull.
 Include O.
 Definition le x y := x<y \/ x==y.
 Lemma le_lteq : forall x y, le x y <-> x<y \/ x==y.
End OT_to_Full.

意味着您必须使用 OrderedType'.

类型的模块实例化 OT_to_Full

如果没有特别的理由使用Coq.Structures.Orders那么我宁愿直接在自然数上寻找引理。

Search "=" "<=".

没有得到你想要的结果。相反,我们将在目标中使用 subst bb 替换为 a。 这很好,因为我们使用

找到了 a <= a 的证明
Search (?x <= ?x).

打印

le_n: forall n : nat, n <= n

那么证明就是:

Lemma easy :
  forall (a b : nat),
    a = b ->
    a <= b.
Proof.
  intros a b e.
  subst b.
  apply le_n.
Qed.