所以我仍然是coq的新手,而且MSets给了我一些问题。以下是计算元素是否在列表或集合中的两个函数,如果您认为set_contains定义正确或者有更好的方法,请告诉我。谢谢你的帮助。
Require Import MSets ZArith.
Module mset := MSetAVL.Make Positive_as_OT.
Notation pos_set := mset.t.
Definition set_contains (x : positive) (s : pos_set) :=
mset.mem x s.
Fixpoint list_contains (x : positive) (l : list positive) : bool :=
match l with
| nil => false
| y :: l' =>
if Pos.eqb x y then true
else nodelist_contains x l'
end.
Lemma nodelist_nodeset_contains :
forall x (s : pos_set),
(nodelist_contains x (mset.elements s)) = (nodeset_contains x s).
Proof.
induction s.
destruct list_contains.
destruct set_contains.
auto.
似乎set_contains在析构后的基本情况下求值为true,我不知道为什么。在证明的那个阶段,集合不是mset.empty吗?
我也不知道如何使用mset.In,我在这个证明的基本情况下遇到了麻烦,显然我遇到了同样的问题。我想最终说明:
Lemma nodelist_containsP :
forall x (l : pos_set),
reflect (mset.In x l) (nodeset_contains x l).
如果有人对此感兴趣,我就是这样做的。
intros.
apply iff_reflect.
unfold nodeset_contains.
symmetry.
apply mset.mem_spec.
Qed.
答案 0 :(得分:1)
list_contains
和set_contains
是函数,因此尝试destruct
它们没有意义。 Coq试图推断你的意思并猜测你想要分别以list_contains
和set_contains
开头的表达式的值。
这不是你想要的。你想要的是观察同一输入上两个函数的行为。你可以通过检查它来做到这一点。
这应该会向您发送正确的方向:
destruct s as [mset mset_isok].
induction mset.
+ unfold set_contains, mset.mem.
simpl.
reflexivity.
+ unfold list_contains, set_contains, mset.mem.
simpl.