| (gs.vm = ∅ ∧ gs.pm = ∅ ∧ pcf = (λ t. idle) ∧ gs.h = []) ∧ (∀ t. t = lsf(t).t) ⊦ PLIBInv(gs, lsf, pcf) |
gs.h = [], gs.pm = ∅, gs.vm = ∅, pcf = (λ t. idle), ¬ PLIBInv(gs, lsf, pcf), ∀ t. t = lsf(t).t ⊦
| gs.h = [], gs.pm = ∅, gs.vm = ∅, pcf = (λ t. idle), ¬ PLIBInv(gs, lsf, pcf), ∀ t. t = lsf(t).t ⊦ |
gs.h = [], gs.pm = ∅, gs.vm = ∅, ¬ PLIBInv(gs, lsf, λ t. idle), ∀ t. t = lsf(t).t ⊦
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ¬ PLIBInv(gs, lsf, λ t. idle), ∀ t. t = lsf(t).t ⊦ |
⊦ PLIBInv(gs, lsf, pcf) ↔ PLIBGInv(gs) ∧ (∀ t. lsf(t).t = t ∧ PLIBLInv(gs, lsf(t), pcf(t)))
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ PLIBGInv(gs) ∨ (∃ t. ¬(lsf(t).t = t ∧ PLIBLInv(gs, lsf(t), idle))) ⊦
Used terms: gs, lsf, λ t. idle
| ⊦ PLIBInv(gs, lsf, pcf) ↔ PLIBGInv(gs) ∧ (∀ t. lsf(t).t = t ∧ PLIBLInv(gs, lsf(t), pcf(t))) |
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ PLIBGInv(gs) ∨ (∃ t. ¬(lsf(t).t = t ∧ PLIBLInv(gs, lsf(t), idle))) ⊦ |
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ PLIBGInv(gs) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ PLIBGInv(gs) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦ |
⊦ PLIBGInv(gs) ↔ allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬(allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦
Used terms: gs
| ⊦ PLIBGInv(gs) ↔ allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) |
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬(allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦ |
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allReadsOK([]) ∨ ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦
Used simplifier rules: ⊦ mem ⊕ [] = mem; (s) ⊦ [] | b = []; (s)
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allReadsOK([]) ∨ ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦ |
⊦ allReadsOK(h) ↔ allReadsOKInd(∅, λ l. true, h)
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allReadsOKInd(∅, λ l. true, []) ∨ ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦
Used terms: []
| ⊦ allReadsOK(h) ↔ allReadsOKInd(∅, λ l. true, h) |
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allReadsOKInd(∅, λ l. true, []) ∨ ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦ |
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦
Used simplifier rules: ⊦ allReadsOKInd(mem, persisted, []); (s)
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬ PLIBLInv(gs, lsf(t), idle) ⊦ |
⊦ PLIBLInv(gs, ls, pc) ↔ pc = resWrite → (gs.h | ls.t) | false = [] ∨ (gs.h | ls.t) | false = (W(ls.t, ls.il, ls.iv), false) '
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬(idle = resWrite → (gs.h | lsf(t).t) | false = [] ∨ (gs.h | lsf(t).t) | false = (W(lsf(t).t, lsf(t).il, lsf(t).iv), false) ') ⊦
Used terms: gs, lsf(t), idle
| ⊦ PLIBLInv(gs, ls, pc) ↔ pc = resWrite → (gs.h | ls.t) | false = [] ∨ (gs.h | ls.t) | false = (W(ls.t, ls.il, ls.iv), false) ' |
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ∨ ¬(idle = resWrite → (gs.h | lsf(t).t) | false = [] ∨ (gs.h | lsf(t).t) | false = (W(lsf(t).t, lsf(t).il, lsf(t).iv), false) ') ⊦ |
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ⊦
Used simplifier rules: ⊦ idle ≠ resWrite; (s)
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOK([]) ∨ lsf(t).t ≠ t ⊦ |
⊦ allWritesOK(h) ↔ allWritesOKInd(λ t. false, λ l. true, h)
gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOKInd(λ t. false, λ l. true, []) ∨ lsf(t).t ≠ t ⊦
Used terms: []
| ⊦ allWritesOK(h) ↔ allWritesOKInd(λ t. false, λ l. true, h) |
| gs.h = [], gs.pm = ∅, gs.vm = ∅, ∀ t. t = lsf(t).t, ¬ allWritesOKInd(λ t. false, λ l. true, []) ∨ lsf(t).t ≠ t ⊦ |
gs.h = [], gs.pm = ∅, gs.vm = ∅, lsf(t).t ≠ t, ∀ t. t = lsf(t).t ⊦
Used simplifier rules: ⊦ allWritesOKInd(pending, persisted, []); (s)
| gs.h = [], gs.pm = ∅, gs.vm = ∅, lsf(t).t ≠ t, ∀ t. t = lsf(t).t ⊦ |
Used terms: t
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.