我正在尝试为下面的引理写一个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)
部分。
答案 0 :(得分:1)
首先,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
在此问题中起着关键作用。
我宁愿不给你解决方案,因为它看起来像是推理表格的基本练习。