diff options
author | Michalis Pardalos <m.pardalos@gmail.com> | 2021-02-12 23:52:42 +0000 |
---|---|---|
committer | Michalis Pardalos <m.pardalos@gmail.com> | 2021-02-12 23:52:42 +0000 |
commit | 8b340f0120a074feffd736e288ffac673290152d (patch) | |
tree | 9999c5dddf4de4fa1ba060d9ef674d87ad44851f /src/common | |
parent | 99c29abb37a5584cceeca835c63d7536586103f9 (diff) | |
download | vericert-8b340f0120a074feffd736e288ffac673290152d.tar.gz vericert-8b340f0120a074feffd736e288ffac673290152d.zip |
Add an indexed filter function to PTree
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/Maps.v | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/common/Maps.v b/src/common/Maps.v index b5a2fb2..7a45259 100644 --- a/src/common/Maps.v +++ b/src/common/Maps.v @@ -40,4 +40,31 @@ Definition traverse (A B : Type) (f : positive -> A -> res B) m := xtraverse f m Definition traverse1 (A B : Type) (f : A -> res B) := traverse (fun _ => f). +Definition filter (A: Type) (pred: PTree.elt -> A -> bool) (m: t A) : t A := + PTree.map (fun _ a => snd a) (PTree.filter1 (fun a => pred (fst a) (snd a)) (PTree.map (fun i x => (i, x)) m)). + +Theorem filter_spec: forall (A: Type) (pred: PTree.elt -> A -> bool) (m: PTree.t A) (i: PTree.elt) (x : A), + (filter pred m) ! i = + match m ! i with + | None => None + | Some x => if pred i x then Some x else None + end. +Proof. + intros. + unfold filter. + + rewrite gmap. + unfold option_map. + + rewrite gfilter1. + + rewrite gmap. + unfold option_map. + + destruct (m ! i). + - simpl. + destruct (pred i a); simpl; reflexivity. + - reflexivity. +Qed. + End PTree. |