| encode_vtbl#(; VTBL, BUF; ERR) {ERR := ESUCCESS; let INDEX = 0, SIZE = ? in {encode_nat#(# VTBL, INDEX; BUF, SIZE; ERR); INDEX := INDEX + SIZE; while ERR = ESUCCESS ∧ VTBL ≠ ∅ do {/* (encode : invariant (ERR = ESUCCESS ∨ ⌊ERR⌋ ) ∧ # BUF = # BUF` ∧ ( ERR = ESUCCESS → (∃ buf0, buf1, buf2, vtbl0. BUF = buf0 + buf1 + buf2 ∧ VTBL` = VTBL ∪ vtbl0 ∧ VTBL ⊥ vtbl0 ∧ # buf0 + # buf1 = INDEX ∧ # buf2 ≥ # VTBL * (ENCODED_NAT_SIZE + ENCODED_VOLID_SIZE) ∧ is-encoded(# VTBL`, buf0) ∧ is-encoded-rec(vtbl0, buf1))) wfbound # VTBL) */; choose VOLID with VOLID ∈ VTBL in {encode_volid#(VOLID, INDEX; BUF, SIZE; ERR); if ERR = ESUCCESS then {INDEX := INDEX + SIZE; encode_nat#(VTBL[VOLID], INDEX; BUF, SIZE; ERR); INDEX := INDEX + SIZE}; VTBL := VTBL -- VOLID}}} } |