过去几周我一直在与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几乎相同?)?
答案 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
*)