| ubi-io-initial(apebs) ⊦ ubi-io-inv(apebs) |
n < # apebs, ∀ n. n < # apebs → # apebs[n].data = LEB_SIZE ∧ ( ¬ apebs[n].bad → (apebs[n].echdr = empty → apebs[n].vidhdr = empty) ∧ (apebs[n].echdr ≠ garbage ∧ apebs[n].vidhdr = empty → apebs[n].fill = 0) ∧ apebs[n].fill ≤ LEB_SIZE ∧ is-aligned(apebs[n].fill, EB_PAGE_SIZE) ∧ subarray(apebs[n].data, apebs[n].fill, LEB_SIZE - apebs[n].fill) = mkempbuf(LEB_SIZE - apebs[n].fill)) ∧ (¬ apebs[n].bad → apebs[n].echdr.valid? ∧ apebs[n].vidhdr = empty) ⊦ # apebs[n].data = LEB_SIZE ∧ ( ¬ apebs[n].bad → (apebs[n].echdr = empty → apebs[n].vidhdr = empty) ∧ (apebs[n].echdr ≠ garbage ∧ apebs[n].vidhdr = empty → apebs[n].fill = 0) ∧ apebs[n].fill ≤ LEB_SIZE ∧ is-aligned(apebs[n].fill, EB_PAGE_SIZE) ∧ subarray(apebs[n].data, apebs[n].fill, LEB_SIZE - apebs[n].fill) = mkempbuf(LEB_SIZE - apebs[n].fill))
Used simplifier rules: initial: ⊦ ubi-io-initial(apebs) ↔ (∀ n. n < # apebs → ubi-io-peb-initial(apebs[n]));%peb-initial: ⊦ ubi-io-peb-initial(apeb) ↔ ubi-io-peb-inv(apeb) ∧ (¬ apeb.bad → apeb.echdr.valid? ∧ apeb.vidhdr = empty);%peb-inv: ⊦ ubi-io-peb-inv(apeb) ↔ # apeb.data = LEB_SIZE ∧ ( ¬ apeb.bad → (apeb.echdr = empty → apeb.vidhdr = empty) ∧ (apeb.echdr ≠ garbage ∧ apeb.vidhdr = empty → apeb.fill = 0) ∧ apeb.fill ≤ LEB_SIZE ∧ is-aligned(apeb.fill, EB_PAGE_SIZE) ∧ subarray(apeb.data, apeb.fill, LEB_SIZE - apeb.fill) = mkempbuf(LEB_SIZE - apeb.fill));%inv: ⊦ ubi-io-inv(apebs) ↔ (∀ n. n < # apebs → ubi-io-peb-inv(apebs[n]));% ⊦ m < n → n ≠ 0; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic