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.