| # pebs = # apebs, apeb = mkpeb(aehdr, avhdr, buf, m, boolvar), n < # apebs, ubi-io-inv(apebs), ∀ n0. n0 < # apebs → (pebs[n, peb][n0].bad ↔ apebs[n0].bad) ∧ ( ¬ pebs[n, peb][n0].bad → pebs[n, peb][n0].fill = (apebs[n0].echdr = empty ⊃ 0;(apebs[n0].vidhdr = empty ⊃ EB_PAGE_SIZE;apebs[n0].fill + 2 * EB_PAGE_SIZE)) ∧ (apebs[n0].echdr = empty → subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE) = emptypage) ∧ (apebs[n0].echdr.valid? → is-encoded(echdr(apebs[n0].echdr.ec), subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE))) ∧ ( apebs[n0].echdr = garbage → is-garbage-ec(subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE)) ∧ subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (apebs[n0].vidhdr = empty → subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n0].vidhdr.valid? → is-encoded (vidhdr(apebs[n0].vidhdr.vol, apebs[n0].vidhdr.leb, apebs[n0].vidhdr.sqn, apebs[n0].vidhdr.size, apebs[n0].vidhdr.checksum), subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( apebs[n0].vidhdr = garbage → is-garbage-vid(subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(pebs[n, peb][n0].data, 2 * EB_PAGE_SIZE, LEB_SIZE) = apebs[n0].data) ⊦ (∀ n0. n0 < # apebs → (pebs[n0].bad ↔ apebs[n, apeb][n0].bad) ∧ ( ¬ pebs[n0].bad → pebs[n0].fill = (apebs[n, apeb][n0].echdr = empty ⊃ 0;(apebs[n, apeb][n0].vidhdr = empty ⊃ EB_PAGE_SIZE;apebs[n, apeb][n0].fill + 2 * EB_PAGE_SIZE)) ∧ (apebs[n, apeb][n0].echdr = empty → subarray(pebs[n0].data, 0, EB_PAGE_SIZE) = emptypage) ∧ (apebs[n, apeb][n0].echdr.valid? → is-encoded(echdr(apebs[n, apeb][n0].echdr.ec), subarray(pebs[n0].data, 0, EB_PAGE_SIZE))) ∧ ( apebs[n, apeb][n0].echdr = garbage → is-garbage-ec(subarray(pebs[n0].data, 0, EB_PAGE_SIZE)) ∧ subarray(pebs[n0].data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (apebs[n, apeb][n0].vidhdr = empty → subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n, apeb][n0].vidhdr.valid? → is-encoded (vidhdr (apebs[n, apeb][n0].vidhdr.vol, apebs[n, apeb][n0].vidhdr.leb, apebs[n, apeb][n0].vidhdr.sqn, apebs[n, apeb][n0].vidhdr.size, apebs[n, apeb][n0].vidhdr.checksum), subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( apebs[n, apeb][n0].vidhdr = garbage → is-garbage-vid(subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(pebs[n0].data, 2 * EB_PAGE_SIZE, LEB_SIZE) = apebs[n, apeb][n0].data)) ↔ (peb.bad ↔ apebs[n].bad) ∧ ( ¬ peb.bad → peb.fill = (apebs[n].echdr = empty ⊃ 0;(apebs[n].vidhdr = empty ⊃ EB_PAGE_SIZE;apebs[n].fill + 2 * EB_PAGE_SIZE)) ∧ (apebs[n].echdr = empty → subarray(peb.data, 0, EB_PAGE_SIZE) = emptypage) ∧ (apebs[n].echdr.valid? → is-encoded(echdr(apebs[n].echdr.ec), subarray(peb.data, 0, EB_PAGE_SIZE))) ∧ (apebs[n].echdr = garbage → is-garbage-ec(subarray(peb.data, 0, EB_PAGE_SIZE)) ∧ subarray(peb.data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (apebs[n].vidhdr = empty → subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n].vidhdr.valid? → is-encoded (vidhdr(apebs[n].vidhdr.vol, apebs[n].vidhdr.leb, apebs[n].vidhdr.sqn, apebs[n].vidhdr.size, apebs[n].vidhdr.checksum), subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( apebs[n].vidhdr = garbage → is-garbage-vid(subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(peb.data, 2 * EB_PAGE_SIZE, LEB_SIZE) = apebs[n].data) → (pebs[n].bad ↔ boolvar) ∧ ( ¬ pebs[n].bad → pebs[n].fill = (aehdr = empty ⊃ 0;(avhdr = empty ⊃ EB_PAGE_SIZE;m + 2 * EB_PAGE_SIZE)) ∧ (aehdr = empty → subarray(pebs[n].data, 0, EB_PAGE_SIZE) = emptypage) ∧ (aehdr.valid? → is-encoded(echdr(aehdr.ec), subarray(pebs[n].data, 0, EB_PAGE_SIZE))) ∧ (aehdr = garbage → is-garbage-ec(subarray(pebs[n].data, 0, EB_PAGE_SIZE)) ∧ subarray(pebs[n].data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (avhdr = empty → subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( avhdr.valid? → is-encoded(vidhdr(avhdr.vol, avhdr.leb, avhdr.sqn, avhdr.size, avhdr.checksum), subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( avhdr = garbage → is-garbage-vid(subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(pebs[n].data, 2 * EB_PAGE_SIZE, LEB_SIZE) = buf) |
# pebs = # apebs, n < # apebs, ubi-io-inv(apebs), ∀ n0. n0 < # apebs → (pebs[n, peb][n0].bad ↔ apebs[n0].bad) ∧ ( ¬ pebs[n, peb][n0].bad → pebs[n, peb][n0].fill = (apebs[n0].echdr = empty ⊃ 0;(apebs[n0].vidhdr = empty ⊃ EB_PAGE_SIZE;apebs[n0].fill + 2 * EB_PAGE_SIZE)) ∧ (apebs[n0].echdr = empty → subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE) = emptypage) ∧ (apebs[n0].echdr.valid? → is-encoded(echdr(apebs[n0].echdr.ec), subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE))) ∧ ( apebs[n0].echdr = garbage → is-garbage-ec(subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE)) ∧ subarray(pebs[n, peb][n0].data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (apebs[n0].vidhdr = empty → subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n0].vidhdr.valid? → is-encoded (vidhdr(apebs[n0].vidhdr.vol, apebs[n0].vidhdr.leb, apebs[n0].vidhdr.sqn, apebs[n0].vidhdr.size, apebs[n0].vidhdr.checksum), subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( apebs[n0].vidhdr = garbage → is-garbage-vid(subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(pebs[n, peb][n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(pebs[n, peb][n0].data, 2 * EB_PAGE_SIZE, LEB_SIZE) = apebs[n0].data) ⊦ (∀ n0. n0 < # apebs → (pebs[n0].bad ↔ apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].bad) ∧ ( ¬ pebs[n0].bad → pebs[n0].fill = (apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].echdr = empty ⊃ 0 ;(apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr = empty ⊃ EB_PAGE_SIZE ;apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].fill + 2 * EB_PAGE_SIZE ) ) ∧ (apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].echdr = empty → subarray(pebs[n0].data, 0, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].echdr.valid? → is-encoded(echdr(apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].echdr.ec), subarray(pebs[n0].data, 0, EB_PAGE_SIZE))) ∧ ( apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].echdr = garbage → is-garbage-ec(subarray(pebs[n0].data, 0, EB_PAGE_SIZE)) ∧ subarray(pebs[n0].data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr = empty → subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr.valid? → is-encoded (vidhdr (apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr.vol, apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr.leb, apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr.sqn, apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr.size, apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr.checksum), subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].vidhdr = garbage → is-garbage-vid(subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(pebs[n0].data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(pebs[n0].data, 2 * EB_PAGE_SIZE, LEB_SIZE) = apebs[n, mkpeb(aehdr, avhdr, buf, m, boolvar)][n0].data)) ↔ (peb.bad ↔ apebs[n].bad) ∧ ( ¬ peb.bad → peb.fill = (apebs[n].echdr = empty ⊃ 0;(apebs[n].vidhdr = empty ⊃ EB_PAGE_SIZE;apebs[n].fill + 2 * EB_PAGE_SIZE)) ∧ (apebs[n].echdr = empty → subarray(peb.data, 0, EB_PAGE_SIZE) = emptypage) ∧ (apebs[n].echdr.valid? → is-encoded(echdr(apebs[n].echdr.ec), subarray(peb.data, 0, EB_PAGE_SIZE))) ∧ (apebs[n].echdr = garbage → is-garbage-ec(subarray(peb.data, 0, EB_PAGE_SIZE)) ∧ subarray(peb.data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (apebs[n].vidhdr = empty → subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( apebs[n].vidhdr.valid? → is-encoded (vidhdr(apebs[n].vidhdr.vol, apebs[n].vidhdr.leb, apebs[n].vidhdr.sqn, apebs[n].vidhdr.size, apebs[n].vidhdr.checksum), subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( apebs[n].vidhdr = garbage → is-garbage-vid(subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(peb.data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(peb.data, 2 * EB_PAGE_SIZE, LEB_SIZE) = apebs[n].data) → (pebs[n].bad ↔ boolvar) ∧ ( ¬ pebs[n].bad → pebs[n].fill = (aehdr = empty ⊃ 0;(avhdr = empty ⊃ EB_PAGE_SIZE;m + 2 * EB_PAGE_SIZE)) ∧ (aehdr = empty → subarray(pebs[n].data, 0, EB_PAGE_SIZE) = emptypage) ∧ (aehdr.valid? → is-encoded(echdr(aehdr.ec), subarray(pebs[n].data, 0, EB_PAGE_SIZE))) ∧ (aehdr = garbage → is-garbage-ec(subarray(pebs[n].data, 0, EB_PAGE_SIZE)) ∧ subarray(pebs[n].data, 0, EB_PAGE_SIZE) ≠ emptypage) ∧ (avhdr = empty → subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage) ∧ ( avhdr.valid? → is-encoded(vidhdr(avhdr.vol, avhdr.leb, avhdr.sqn, avhdr.size, avhdr.checksum), subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE))) ∧ ( avhdr = garbage → is-garbage-vid(subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE)) ∧ subarray(pebs[n].data, EB_PAGE_SIZE, EB_PAGE_SIZE) ≠ emptypage) ∧ subarray(pebs[n].data, 2 * EB_PAGE_SIZE, LEB_SIZE) = buf)