| # lpt = # avol, # lpt0 = # avol, ax = ax0, gndx0 = gndx1, log = log0, m = LEB_SIZE, avol[m0].mapped?, m0 < # avol, awbuf-inv(avol, bleb), buf-ro-rw-mode(isbuf, bleb, lpt0, avol), bufs-log-only(bleb, log, lpt0), lpt-free-unref(lpt), lpt-leb-size(lpt), lpt-ram-flash(lpt0, lpt, log), ∃ gndx, lax. abs-nodes(avol[m0].data, gndx, lax, true) ⊦ ⟪persistence_read_gblock_nodes#(m0, m, adr, m1, log0, avol, lpt, ns, bleb, isbuf; ax0, gndx1; err)⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → (∃ lax, gndx. ax0 = ax + lax.to-adr(m0) ∧ gndx1 = gndx0 + gndx ∧ abs-nodes(avol[m0].data, gndx, lax, true)))) |
# gndx = # lax, # lpt = # avol, # lpt0 = # avol, avol[m0] = mapped(buf), ax = ax0, gndx0 = gndx1, m0 < # avol, abs-nodes(buf, gndx, lax, true), awbuf-inv(avol, bleb), buf-ro-rw-mode(isbuf, bleb, lpt0, avol), bufs-log-only(bleb, log0, lpt0), lpt-free-unref(lpt), lpt-leb-size(lpt), lpt-ram-flash(lpt0, lpt, log0) ⊦ ⟪persistence_read_gblock_nodes#(m0, LEB_SIZE, adr, m1, log0, avol, lpt, ns, bleb, isbuf; ax0, gndx1; err)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ax0 = ax + lax.to-adr(m0) ∧ gndx1 = gndx0 + gndx))
Used simplifier rules: elim-mapped: ⊦ avol[n].mapped? ↔ (∃ buf. avol[n] = mapped(buf));% ⊦ mapped(buf).data = buf; (s)% ⊦ m < n → n ≠ 0; (s)%abs-nodes-elems-adr-length: ⊦ abs-nodes(buf, gndx, lax, weak) → # gndx = # lax; (forward) from specification abs-list[encoding-group-node]%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%⊦ abs-nodes(buf, gndx, lax0, true) → (abs-nodes(buf, gndx0, lax1, true) ↔ gndx = gndx0 ∧ lax0 = lax1); (s)