| ⊦ ( ( ( alldisjointp(alltids, gs.ghostlspmxf) ∧ disjointp(U(alltids, gs.ghostlspmxf), gs.gspmx) ∧ gs.y + (U(alltids, gs.ghostlspmxf) ∪ gs.gspmx).toMatrix(gs.r, # gs.x) * gs.x = gs.spmx.toMatrix(gs.r, # gs.x) * gs.x ∧ U(alltids, gs.ghostlspmxf) ∪ gs.gspmx ⊆ gs.spmx ∧ # gs.y = gs.r ∧ okspmx(gs.spmx, gs.r, # gs.x)) ∧ gs.gspmx = ∅ ∧ gs.ghostlspmxf(ls.tid) = ∅) ∧ alldisjointp(alltids, gs0.ghostlspmxf) ∧ disjointp(U(alltids, gs0.ghostlspmxf), gs0.gspmx) ∧ gs0.y + (U(alltids, gs0.ghostlspmxf) ∪ gs0.gspmx).toMatrix(gs0.r, # gs0.x) * gs0.x = gs0.spmx.toMatrix(gs0.r, # gs0.x) * gs0.x ∧ U(alltids, gs0.ghostlspmxf) ∪ gs0.gspmx ⊆ gs0.spmx ∧ # gs0.y = gs0.r ∧ okspmx(gs0.spmx, gs0.r, # gs0.x)) ∧ gs.ghostlspmxf(ls.tid) = gs0.ghostlspmxf(ls.tid) ∧ gs0.gspmx ⊆ gs.gspmx → gs0.gspmx = ∅ ∧ gs0.ghostlspmxf(ls.tid) = ∅ |
# gs.y = gs.r, # gs0.y = gs0.r, gs.y + (U(alltids, gs.ghostlspmxf) ∪ gs.gspmx).toMatrix(gs.r, # gs.x) * gs.x = gs.spmx.toMatrix(gs.r, # gs.x) * gs.x, gs0.y + (U(alltids, gs0.ghostlspmxf) ∪ gs0.gspmx).toMatrix(gs0.r, # gs0.x) * gs0.x = gs0.spmx.toMatrix(gs0.r, # gs0.x) * gs0.x, gs.ghostlspmxf(ls.tid) = ∅, gs.ghostlspmxf(ls.tid) = gs0.ghostlspmxf(ls.tid), gs.gspmx = ∅, alldisjointp(alltids, gs.ghostlspmxf), alldisjointp(alltids, gs0.ghostlspmxf), disjointp(U(alltids, gs.ghostlspmxf), gs.gspmx), disjointp(U(alltids, gs0.ghostlspmxf), gs0.gspmx), okspmx(gs.spmx, gs.r, # gs.x), okspmx(gs0.spmx, gs0.r, # gs0.x), U(alltids, gs.ghostlspmxf) ∪ gs.gspmx ⊆ gs.spmx, U(alltids, gs0.ghostlspmxf) ∪ gs0.gspmx ⊆ gs0.spmx, gs0.gspmx ⊆ gs.gspmx ⊦ gs0.gspmx = ∅ ∧ gs0.ghostlspmxf(ls.tid) = ∅
| # gs.y = gs.r, # gs0.y = gs0.r, gs.y + (U(alltids, gs.ghostlspmxf) ∪ gs.gspmx).toMatrix(gs.r, # gs.x) * gs.x = gs.spmx.toMatrix(gs.r, # gs.x) * gs.x, gs0.y + (U(alltids, gs0.ghostlspmxf) ∪ gs0.gspmx).toMatrix(gs0.r, # gs0.x) * gs0.x = gs0.spmx.toMatrix(gs0.r, # gs0.x) * gs0.x, gs.ghostlspmxf(ls.tid) = ∅, gs.ghostlspmxf(ls.tid) = gs0.ghostlspmxf(ls.tid), gs.gspmx = ∅, alldisjointp(alltids, gs.ghostlspmxf), alldisjointp(alltids, gs0.ghostlspmxf), disjointp(U(alltids, gs.ghostlspmxf), gs.gspmx), disjointp(U(alltids, gs0.ghostlspmxf), gs0.gspmx), okspmx(gs.spmx, gs.r, # gs.x), okspmx(gs0.spmx, gs0.r, # gs0.x), U(alltids, gs.ghostlspmxf) ∪ gs.gspmx ⊆ gs.spmx, U(alltids, gs0.ghostlspmxf) ∪ gs0.gspmx ⊆ gs0.spmx, gs0.gspmx ⊆ gs.gspmx ⊦ gs0.gspmx = ∅ ∧ gs0.ghostlspmxf(ls.tid) = ∅ |
Used simplifier rules: ⊦ disjointp(spmx1, ∅); (s) ⊦ st ⊆ ∅ ↔ st = ∅; (s) ⊦ ∅ ⊆ st; (s) ⊦ spmx ∪ ∅ = spmx; (s) sub-trans: ⊦ st ⊆ st0 ∧ st0 ⊆ st1 → st ⊆ st1; (forward) from specification store[sparsearray] ⊦ disjointp(spmx1, spmx2) → (spmx1 ∪ spmx2 ⊆ spmx ↔ spmx1 ⊆ spmx ∧ spmx2 ⊆ spmx); (ws)
The following image shows the proof tree of sequent calculus. The proved goal is at the bottom. You can click on the nodes to view additional rules. See here for details on colors in a proof tree.