| # lpt0 = # lpt, # avol0 = # lpt, (lpf2 = LP_FREE ∨ n ∈ nx ⊃ mklp(m12, m13, lpf2, m14) ;(lpf2 = LP_INDEX_NODES ∧ m12 ≠ 0 ⊃ mklp(m12, LEB_SIZE, LP_INDEX_NODES, m14);(m12 = 0 ⊃ mklp(0, 0, LP_FREE, m14);mklp(m12, m13, lpf2, m14))) ) = mklp(m0, m1, lpf, m2), (n ∈ nx ⊃ mklp(m9, LEB_SIZE, LP_GROUP_NODES, m11);mklp(m9, m10, lpf1, m11)) = mklp(m12, m13, lpf2, m14), n ∈ gstore0 ↔ lpf1 = LP_GROUP_NODES ∧ m9 ≠ 0, n ∈ istore0 ↔ lpf1 = LP_INDEX_NODES ∧ m9 ≠ 0, lpf0 = LP_INDEX_NODES ↔ n ∈ istore, lpt0[n] = mklp(m9, m10, lpf1, m11), gstore0[n] = groupblock(gndx, lax1, m7), lpt[n] = mklp(m4, m5, lpf0, m6), remove-refsize0(crash(istore, istore0))[n] = indexblock(indx, lax, m), istore[n] = indexblock(indx0, lax0, m3), istore0[n] = indexblock(indx1, lax2, m8), indexblock(istore[n].indlist, istore[n].ladrlist, istore0[n].ref-size) = indexblock(indx2, lax3, m15), dom istore ∩ elems nx = ∅, n < # lpt, synced(avol0), avol1 ↓ avol0, n ∈ istore0, istore0 ⊑ istore, lpf1 = LP_FREE → m9 = 0, n ∈ gstore0 → m9 = m7, n ∈ istore0 → m9 = m8, n ∈ istore → abs-leb(avol0[n], indexblock(indx0, lax0, m3), mklp(m3, m5, lpf0, m6)) ∧ m4 = m3, ∀ n. n < # lpt ∧ lpt0[n].flags = LP_FREE → lpt0[n].ref-size = 0 ⊦ (lpf = LP_INDEX_NODES ↔ n ∈ istore0 ∧ m15 ≠ 0) ∧ (n ∈ istore0 ∧ m15 ≠ 0 → abs-leb(avol1[n], indexblock(indx, lax, m), mklp(m, m1, lpf, m2)) ∧ m0 = m) |
# avol0 = # lpt, # lpt0 = # lpt, istore0[n] = indexblock(indx1, lax2, m0), istore[n] = indexblock(indx0, lax0, m3), remove-refsize0(crash(istore, istore0))[n] = indexblock(indx, lax, m), lpt[n] = mklp(m3, m5, LP_INDEX_NODES, m6), (∅)[n] = groupblock(gndx, lax1, m7), lpt0[n] = mklp(m0, m10, LP_INDEX_NODES, m2), dom istore ∩ elems nx = ∅, n < # lpt, abs-leb(avol0[n], indexblock(indx0, lax0, m3), mklp(m3, m5, LP_INDEX_NODES, m6)), synced(avol0), avol1 ↓ avol0, n ∈ istore0, n ∈ istore, istore0 ⊑ istore, ∀ n. n < # lpt ∧ lpt0[n].flags = LP_FREE → lpt0[n].ref-size = 0 ⊦ m0 = 0, n ∈ gstore0, abs-leb(avol1[n], indexblock(indx, lax, m), mklp(m, LEB_SIZE, LP_INDEX_NODES, m2)) ∧ m0 = m
Used simplifier rules: ⊦ indexblock(indx, lax, m).ref-size = m; (s)% ⊦ ¬ n ∈ istore → istore[n] = (∅)[n]; (s)% ⊦ n ∈ dom istore ↔ n ∈ istore; (s)%elems-in-notin-ginval: ⊦ n ∈ nx ∧ elems nx ∩ ns = ∅ → ¬ n ∈ ns; (forward) from specification apersistence-base%int-c: ⊦ ns ∩ ns0 = ns0 ∩ ns; from specification set-union[nat-set]%int-a: ⊦ (ns ∩ ns0) ∩ ns1 = ns ∩ ns0 ∩ ns1; from specification set-union[nat-set]% ⊦ LP_FREE ≠ LP_INDEX_NODES; (s)%⊦ mklp(m, m0, lpf, m1) = mklp(m2, m3, lpf0, m4) ↔ m = m2 ∧ m0 = m3 ∧ lpf = lpf0 ∧ m1 = m4; (ws)% ⊦ ¬ n ∈ gstore → gstore[n] = (∅)[n]; (s)% ⊦ LP_GROUP_NODES ≠ LP_INDEX_NODES; (s)%prefix-fwd-in: ⊦ istore ⊑ istore0 ∧ n ∈ istore → n ∈ istore0; (forward) from specification ablock-store-inv[index-store]%⊦ indexblock(indx, lax, m) = indexblock(indx0, lax0, m0) ↔ indx = indx0 ∧ lax = lax0 ∧ m = m0; (ws)