如何证明Coq中的引理?

如何证明Coq中的引理?,coq,Coq,我试图为以下引理编写一个Coq-poof: Require Export Coq.Structures.OrderedTypeEx. Require Import FMapAVL. Module M := FMapAVL.Make(Nat_as_OT). Fixpoint cc (n: nat) (c: M.t nat):bool := match M.find n c with | None => false | _ => true end. Lemma l: forall (

我试图为以下引理编写一个Coq-poof:

Require Export Coq.Structures.OrderedTypeEx.
Require Import FMapAVL.
Module M := FMapAVL.Make(Nat_as_OT).

Fixpoint cc (n: nat) (c: M.t nat):bool :=
match M.find n c with
| None => false
| _ => true
end.

Lemma l: forall (n: nat) (k:nat) (m: M.t nat), cc n m = true  -> cc n (M.add k k m) = true.

我无法简化
(m.add k m)
部分

首先,
cc
中没有递归调用,因此您应该将此定义设置为普通定义(使用关键字
definition
而不是
Fixpoint

其次,如果您想对
M.find
M.add
的行为进行推理,您应该 看看关于这些函数的定理:定理
M.find_2
M.add_2
M.E.eq_dec
,和
M.add_1
将非常有用(我使用
Search
命令找到了这些引理)。因此,首先展开
cc
,然后根据(
M.find n M
)的值按案例推理,然后使用这些 对语句中出现的函数进行逻辑处理的定理。请注意,函数
M.MapsTo
在这个问题中起着关键作用


我宁愿不给你答案,因为它看起来像是关于表格推理的基本练习。

什么是
M
?你能添加必要的导入吗?另外,您尝试过做什么?在什么情况下您无法简化
(M.add k M)
。如果你能列出所有使用到你陷入困境的策略,这将是很有帮助的。你不应该能够查看模块中的内容,你应该只使用模块中定义的引理来推理抽象数据类型M。在这种情况下,使用引理
M.add_1
M.add_2
,就足够了,
M.find_1
M.find_2
。有关证明引理的一种方法,请参见i.e.。Search命令没有显示
Search M.add
Search M.find
的任何输出。基于在线文档,我认为应该这样使用它。我做错了吗?我使用了所有必要的导入,它编译了,但没有显示任何内容。我使用的是一般证明和类型M.find,它给了我M.find_1 M.find_2和第三个定理及其声明。我还尝试键入命令“Search M.find”,它返回了正确的定理。我使用的Coq版本是8.6。当我有时间时,我将尝试使用coqide并在此处报告结果。使用coqide(8.6.1),我可以打开查询窗格(使用查看菜单中的选项)并键入M.find。我还得到了三个定理。