Library topsy_hmFree_old
Load seplog_header.
Require Import topsy_hm_old.
Open Local Scope Z_scope.
Definition hmFree (address: loc) (entry: var.v) (addressEntry: var.v) (tmp: var.v) (result: var.v) :=
entry <- (var_e hmStart);
addressEntry <- ((nat_e address) -e (int_e 2%Z));
while ((var_e entry =/= null) &&& (var_e entry =/= var_e addressEntry)) (
tmp <-* (entry -.> next);
entry <- (var_e tmp)
);
ifte (var_e entry =/= null) thendo (
tmp <-* (entry -.> next);
ifte (var_e tmp =/= null) thendo (
(entry -.> status) *<- Free;
result <- HM_FREEOK
) elsedo ( result <- HM_FREEFAILED)
) elsedo (
result <- HM_FREEFAILED
).
Close Local Scope Z_scope.
Definition hmFree_specif1 := forall adr sizex x y sizey statusy entry cptr nptr result,
(var.set (hmStart::entry::cptr::nptr::result::nil)) ->
adr > 0 -> sizex > 0 ->
{{fun s => fun h => exists l, (Heap_List l adr 0 ** Array (x+2) sizex) s h /\
In (x,sizex, Allocated) l /\
In (y,sizey, statusy) l /\
x <> y /\
eval (var_e hmStart) s = eval (nat_e adr) s }}
hmFree (x+2) entry cptr nptr result
{{ fun s => fun h => exists l, Heap_List l adr 0 s h /\ In (x,sizex,Free) l /\ In (y,sizey,statusy) l /\
eval (var_e result) s = eval HM_FREEOK s}}.
Definition hmFree_specif2 := forall adr y entry cptr nptr result l,
(forall x sizex statusx, In (x,sizex,statusx) l -> x<>y) ->
(var.set (hmStart::entry::cptr::nptr::result::nil)) ->
adr > 0 ->
{{fun s => fun h => Heap_List l adr 0 s h /\
eval (var_e hmStart) s = eval (nat_e adr) s }}
hmFree (y+2) entry cptr nptr result
{{ fun s => fun h => Heap_List l adr 0 s h /\
eval (var_e result) s = eval HM_FREEFAILED s}}.
Lemma hmFree_verif1 : hmFree_specif1.
Lemma hmFree_verif2 : hmFree_specif2.