| # avol0 = # lpt0 + m11, avol0[m2] = mapped(buf1), avol0[m3] = mapped(buf0), avol0[0] = mapped(buf), err = ESUCCESS, disk-layout(mksb(adr0, m0, m2, m3, m9, m10, m11), # lpt0), ebm-vol-inv(subarray(avol0, m11, # lpt0)), ebm-vol-inv(avol0), is-encoded(log0, buf1), is-encoded(lpt0, lebs(avol0, m10, lptlebs(# lpt0, LEB_SIZE))), is-encoded(mksb(adr0, m0, m2, m3, m9, m10, m11), buf), is-encoded-pad(ns0, m9, buf0), mapped-full?(avol0, m10, lptlebs(# lpt0, LEB_SIZE)), m11 ≤ # avol0, avol0 ⊆ avol1, err = ESUCCESS → disk-layout(mksb(adr1, m4, m13, m14, m15, m16, m17), # lpt1) ∧ m17 + # lpt1 = # avol ∧ avol[0].mapped? ∧ is-encoded(mksb(adr1, m4, m13, m14, m15, m16, m17), avol[0].data) ∧ avol[m14].mapped? ∧ is-encoded-pad(orphans, m15, avol[m14].data) ∧ avol[m13].mapped? ∧ (logoff ≠ LEB_SIZE → # avol[m13].data = logoff) ∧ is-encoded(log1, avol[m13].data) ∧ mapped-full?(avol, m16, lptlebs(# lpt1, LEB_SIZE)) ∧ is-encoded(lpt1, lebs(avol, m16, lptlebs(# lpt1, LEB_SIZE))) ∧ m7 = EB_PAGE_SIZE ∧ m6 = LEB_SIZE ∧ ebm-vol-inv(avol), m1 ≠ LEB_SIZE → # buf1 = m1, err = ESUCCESS → mksb(adr1, m4, m13, m14, m15, m16, m17) = mksb(adr0, m0, m2, m3, m9, m10, m11) ∧ # avol = # avol0 ∧ adr4 = adr0 ∧ m12 = m0 ∧ # lpt = # avol - m11 ∧ is-encoded(lpt, lebs(avol, m10, lptlebs(# avol - m11, LEB_SIZE))) ∧ lebs(avol, m10, lptlebs(# avol - m11, LEB_SIZE)) = lebs(avol0, m10, lptlebs(# avol - m11, LEB_SIZE)) ∧ is-encoded(log, avol[m2].data) ∧ is-encoded-pad(orphans0, m9, avol[m3].data) ∧ avol[m3] = mapped(buf0) ∧ avol[m2] = mapped(buf1), err = ESUCCESS → avol1 = avol, err = ESUCCESS ∨ ⌊err⌋ ⊦ ∃ avol2. subarray(avol0, m11, # lpt0) ⊆ avol2 ∧ ⟨adr := adr0, m := m0; apersistence_io_recover#(; adr2, m5, ns1, log2, lpt2, adr, m, log0, lpt0, ns0, avol2; err0)⟩ ( m = m4 ∧ adr = adr1 ∧ # avol = m17 + (# avol - m17) ∧ avol2 = subarray(avol, m17, # avol - m17) ∧ is-encoded(log0, avol[m13].data) ∧ is-encoded(lpt0, lebs(avol, m16, lptlebs(# avol - m17, LEB_SIZE))) ∧ is-encoded-pad(ns0, m15, avol[m14].data) ∧ adr4 = adr2 ∧ m12 = m5 ∧ orphans0 = ns1 ∧ log = log2 ∧ lpt = lpt2 ∧ ESUCCESS = err0) |
# lpt = # avol0 - m11, # avol0 = # lpt1 + m11, avol0[0] = mapped(buf2), avol0[m3] = mapped(buf3), avol0[m2] = mapped(buf4), lebs(avol, m10, lptlebs(# lpt, LEB_SIZE)) = lebs(avol0, m10, lptlebs(# lpt, LEB_SIZE)), log0 = log1, ns0 = orphans0, disk-layout(mksb(adr0, m0, m2, m3, m9, m10, m11), # lpt1), ebm-vol-inv(avol0), ebm-vol-inv(subarray(avol0, m11, # lpt1)), is-encoded(lpt1, lebs(avol0, m10, lptlebs(# lpt1, LEB_SIZE))), is-encoded(log1, buf4), is-encoded(lpt, lebs(avol0, m10, lptlebs(# lpt, LEB_SIZE))), is-encoded(mksb(adr0, m0, m2, m3, m9, m10, m11), buf2), is-encoded-pad(orphans0, m9, buf3), mapped-full?(avol0, m10, lptlebs(# lpt1, LEB_SIZE)), m11 ≤ # avol0, avol0 ⊆ avol, logoff ≠ LEB_SIZE → # buf4 = logoff, m1 ≠ LEB_SIZE → # buf4 = m1 ⊦ ∃ avol1. subarray(avol0, m11, # lpt1) ⊆ avol1 ∧ ⟨adr := adr0, m := m0; apersistence_io_recover#(; adr2, m5, ns1, log2, lpt2, adr, m, log0, lpt1, ns0, avol1; err0)⟩ ( m = m5 ∧ adr = adr2 ∧ avol1 = subarray(avol, m11, # avol0 - m11) ∧ log2 = log0 ∧ is-encoded(lpt1, lebs(avol, m10, lptlebs(# avol0 - m11, LEB_SIZE))) ∧ ns1 = ns0 ∧ adr0 = adr2 ∧ m0 = m5 ∧ orphans0 = ns0 ∧ log1 = log0 ∧ lpt = lpt2 ∧ ESUCCESS = err0)
Used simplifier rules: ⊦ is-encoded(lpt0, buf) ∧ # lpt0 = # lpt1 → (is-encoded(lpt1, buf) ↔ lpt0 = lpt1); (s)%n + m ≤ # avol0 ⊦ mapped-full?(avol0, n, m) ∧ avol0 ⊆ avol1 → lebs(avol1, n, m) = lebs(avol0, n, m); (s)%⊦ disk-layout(mksb(adr, m0, m1, m2, m, m3, m4), mainareasize) → ¬ m4 + n < m3 + lptlebs(mainareasize, LEB_SIZE); (s)% ⊦ m < n → n ≠ 0; (s)%lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat%⊦ avol0 ⊆ avol1 ∧ mapped-full?(avol0, n, m) → mapped-full?(avol1, n, m); (s)%m = n ⊦ disk-layout(sb, m) → disk-layout(sb, n); (s)%# avol = sb.main + mainareasize ⊦ disk-layout(sb, mainareasize) → # avol ≠ 0; (s)% ⊦ mksb(adr, m, m0, m1, m2, m3, m4).main = m4; (s)% ⊦ 0 < m ↔ m ≠ 0; (s)%⊦ m6 + # lpt = # avol ∧ disk-layout(mksb(adr0, m1, m2, m3, m4, m5, m6), # lpt) → ¬ # avol ≤ m3; (s)% ⊦ mapped(buf) = mapped(buf0) ↔ buf = buf0; (s)%n < # avol0 ⊦ avol0 ⊆ avol1 ∧ avol0[n] = mapped(buf) ∧ ebm-vol-inv(avol0) → avol1[n] = mapped(buf); (s)%n ≤ n1 ⊦ ¬ disk-layout(mksb(adr, n0, n1, n2, m, n3, n), mainareasize); (s)%let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat%eqs: ⊦ m = n + n0 ∧ m = n + n1 → n0 = n1; (forward) from specification nat-basic% ⊦ avol1 ⊆ avol0 ∧ ebm-vol-inv(avol1) → ebm-vol-inv(avol0); (s)% ⊦ mapped(buf).data = buf; (s)% ⊦ m = # avol0 ∧ avol0 ⊆ avol1 → (n = # avol1 ↔ n = m); (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)%⊦ is-encoded-pad(ns0, n, buf) → (is-encoded-pad(ns1, n, buf) ↔ ns0 = ns1); (s)% ⊦ is-encoded(nx0, buf) → (is-encoded(nx1, buf) ↔ nx0 = nx1); (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic%n ≤ m ⊦ (m - n) + n0 = n1 ↔ m + n0 = n + n1; (s)% ⊦ m ≤ n → (n < m ↔ false); (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ aleb.mapped? ↔ (∃ buf. aleb = mapped(buf)); (as)%⊦ mksb(adr, m, m0, m1, m2, m3, m4) = mksb(adr0, m5, m6, m7, m8, m9, m10) ↔ adr = adr0 ∧ m = m5 ∧ m0 = m6 ∧ m1 = m7 ∧ m2 = m8 ∧ m3 = m9 ∧ m4 = m10; (ws)