vericert.hls.HashTree
#[local] Open Scope positive.
#[local] Hint Resolve in_eq : core.
#[local] Hint Resolve in_cons : core.
Definition max_key {A} (t: PTree.t A) :=
fold_right Pos.max 1%positive (map fst (PTree.elements t)).
Lemma max_key_correct' :
forall l hi, In hi l -> hi <= fold_right Pos.max 1 l.
Lemma max_key_correct :
forall A h_tree hi (c: A),
h_tree ! hi = Some c ->
hi <= max_key h_tree.
Lemma max_not_present :
forall A k (h: PTree.t A), k > max_key h -> h ! k = None.
Lemma filter_none :
forall A f l (x: A), filter f l = nil -> In x l -> f x = false.
Lemma filter_set :
forall A l l' f (x: A),
(In x l -> In x l') ->
In x (filter f l) ->
In x (filter f l').
Lemma filter_cons_true :
forall A f l (a: A) l',
filter f l = a :: l' -> f a = true.
Lemma PTree_set_elements :
forall A t x x' (c: A),
In x (PTree.elements t) ->
x' <> (fst x) ->
In x (PTree.elements (PTree.set x' c t)).
Lemma filter_set2 :
forall A x y z (h: PTree.t A),
In z (PTree.elements (PTree.set x y h)) ->
In z (PTree.elements h) \/ fst z = x.
Lemma in_filter : forall A f l (x: A), In x (filter f l) -> In x l.
Lemma filter_norepet:
forall A f (l: list A),
list_norepet l ->
list_norepet (filter f l).
Lemma filter_norepet2:
forall A B g (l: list (A * B)),
list_norepet (map fst l) ->
list_norepet (map fst (filter g l)).
Module Type Hashable.
Parameter t: Type.
Parameter eq_dec: forall (t1 t2: t), {t1 = t2} + {t1 <> t2}.
End Hashable.
Module HashTree(H: Hashable).
Definition hash := positive.
Definition hash_tree := PTree.t t.
Definition find_tree (el: t) (h: hash_tree) : option hash :=
match filter (fun x => if eq_dec el (snd x) then true else false) (PTree.elements h) with
| (p, _) :: nil => Some p
| _ => None
end.
Definition hash_value (max: hash) (e: t) (h: hash_tree): hash * hash_tree :=
match find_tree e h with
| Some p => (p, h)
| None =>
let nkey := Pos.max max (max_key h) + 1 in
(nkey, PTree.set nkey e h)
end.
Definition wf_hash_table h_tree :=
forall x c, h_tree ! x = Some c -> find_tree c h_tree = Some x.
Lemma find_tree_correct :
forall c h_tree p,
find_tree c h_tree = Some p ->
h_tree ! p = Some c.
Lemma find_tree_unique :
forall c h_tree p p',
find_tree c h_tree = Some p ->
h_tree ! p' = Some c ->
p = p'.
Lemma hash_no_element' :
forall c h_tree,
find_tree c h_tree = None ->
wf_hash_table h_tree ->
~ forall x, h_tree ! x = Some c.
Lemma hash_no_element :
forall c h_tree,
find_tree c h_tree = None ->
wf_hash_table h_tree ->
~ exists x, h_tree ! x = Some c.
Lemma wf_hash_table_set_gso' :
forall h x p0 c',
filter
(fun x : hash * t =>
if eq_dec c' (snd x) then true else false) (PTree.elements h) =
(x, p0) :: nil ->
h ! x = Some p0 /\ p0 = c'.
Lemma wf_hash_table_set_gso :
forall x x' c' c h,
x <> x' ->
wf_hash_table h ->
find_tree c' h = Some x ->
find_tree c h = None ->
find_tree c' (PTree.set x' c h) = Some x.
Lemma wf_hash_table_set :
forall h_tree c v (GT: v > max_key h_tree),
find_tree c h_tree = None ->
wf_hash_table h_tree ->
wf_hash_table (PTree.set v c h_tree).
Lemma wf_hash_table_distr :
forall m p h_tree h h_tree',
hash_value m p h_tree = (h, h_tree') ->
wf_hash_table h_tree ->
wf_hash_table h_tree'.
Lemma wf_hash_table_eq :
forall h_tree a b c,
wf_hash_table h_tree ->
h_tree ! a = Some c ->
h_tree ! b = Some c ->
a = b.
Lemma hash_constant :
forall p h h_tree hi c h_tree' m,
h_tree ! hi = Some c ->
hash_value m p h_tree = (h, h_tree') ->
h_tree' ! hi = Some c.
Lemma find_tree_Some :
forall el h v,
find_tree el h = Some v ->
h ! v = Some el.
Lemma hash_present_eq :
forall m e1 e2 p1 h h',
hash_value m e2 h = (p1, h') ->
h ! p1 = Some e1 -> e1 = e2.
End HashTree.