0
所以我對coq仍然陌生,MSets給我一些問題。這裏有兩個函數來計算一個元素是否在列表或集合中,如果你認爲set_contains定義是正確的或者有更好的方法去做,請告訴我們。謝謝你的幫助。使用MSet的coq證明
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評估爲真,在破壞後的基本情況下,我不知道爲什麼。在證明的這個階段,這個集合是不是會變成空白的?
我也不知道如何使用mset。在這個證明的基礎案例中遇到了麻煩,顯然我有同樣的問題。我想最終狀態:
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.