 
  
  
  
  
We say that a link is OK if it is not linking a black node to a white node. The predicate lt_n x y says that x is less than y, and y is not bigger than n.
To propagate the colouring the memory is scanned according to a
bounded version lt_pair of the usual lexicographic order on
pairs.
The predicate OK_upto expresses the fact that the pairs
already scanned are OK.
At every stage during the scanning of the memory either a black to white link was found and the flag changed was set to true or all links were OK.
The idea of the marking phase is that the collector keeps scanning the memory until every link is OK, in other words, while changed is true the collector keeps propagating the colouring.
The invariant of such while loop says that every link is OK or there
has been a change. From the definition of lt_pair it follows
that every pair (i,j) is less than (n,0). Then we can express our
invariant as CHOK n 0.
 ** Module verify Imports lib_hoare lib_nat_rels mark 
  Ok = ... : (nat->nat->bool)->(nat->bool)->nat->nat->Prop
  lt_n = ... : nat->nat->Prop
  lt_pair = ... : (nat#nat)->(nat#nat)->Prop
  OK_upto = ... : (nat->nat->bool)->(nat->bool)->nat->nat->Prop
  CHOK = ... : (nat->nat->bool)->(nat->bool)->bool->nat->nat->Prop
  iSigma : E
  mark_phase = ... :
    HD ([_:E]trueProp) mark
       ([sigma:E]CHOK is_linked (sigma a) (sigma changed) n zero)