带有问号的运算符假设是什么意思

时间:2017-12-11 15:59:04

标签: coq

过去几周我一直在与Coq证明助理合作,但今天我遇到了一些特别的问题。我正在通过Benjamin Pierce的“类型和编程语言”一书的练习。在其中一个练习中,我必须证明一些自制的编程语言(皮尔斯的练习中的Imp),特定的三重奏是有效的。我差不多完成了这个证明,但是我已经陷入了必须证明以下是有效st X <= st Y的地方,其中st是某种状态,而st X返回存储在状态Id X中的值

我的假设陈述如下:

st : state
H : (st X <=? st Y) = true

我现在的问题是什么?在(st X <=? st Y) = true中意味着我如何使用这个定理证明目标(看起来与H几乎相同?)?

1 个答案:

答案 0 :(得分:3)

您需要的只是apply Nat.leb_le,其中指出(n <=? m) = true <-> n <= m(取决于您的导入,它可能需要不同的前缀)。自然的问题是,你怎么想出来的?

首先,您通常可以使用Print ident.(显示正文)或Check ident.(仅显示类型 - 对定理有用)获取有关定义的信息。但是,<=?不是标识符,而是符号,因此您需要找到它的定义:

Locate "<=?".
(* Notation
   "x <=? y" := Nat.leb x y : nat_scope (default interpretation) *)

然后,我们可以找到相关的定理:

Search Nat.leb.
(* ... (9 other theorems *)
   Nat.leb_le: forall n m : nat, (n <=? m) = true <-> n <= m
   ...
 *)

我们也可以跳过中间步骤并进行更具体的搜索。请注意,您需要使用符号表示。

Search "<=?" true. (* ... (three other theorems) Nat.leb_le: forall n m : nat, (n <=? m) = true <-> n <= m *)