如何在Coq中证明以下引理?

时间:2017-09-22 15:35:50

标签: 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 (n: nat) (k:nat) (m: M.t nat), cc n m = true  -> cc n (M.add k k m) = true.

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

1 个答案:

答案 0 :(得分:1)

首先,cc中没有递归调用,所以你应该使这个定义成为一个简单的定义(使用关键字Definition而不是Fixpoint)。

其次,如果你想推理M.findM.add的行为,你应该这样做 看一下定理这些函数的定理:定理 M.find_2M.add_2M.E.eq_decM.add_1会很有用(我使用Search命令找到了这些引理)。首先展开cc,然后根据(M.find n m)的值进行推理,然后使用这些 关于语句中发生的函数的逻辑推进定理。请注意,函数M.MapsTo在此问题中起着关键作用。

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