| ⊦ allWritesOKInd(pending(t := true), persisted(l := false), h) → allWritesOKInd(pending(t := false), persisted(l := true), h) |
allWritesOKInd(pending(t := true), persisted(l := false), h), ¬ allWritesOKInd(pending(t := false), persisted(l := true), h) ⊦
| allWritesOKInd(pending(t := true), persisted(l := false), h), ¬ allWritesOKInd(pending(t := false), persisted(l := true), h) ⊦ |
allWritesOKInd(pending(t := true), persisted(l := false), vpe + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), vpe + h0), ∀ pending, t, persisted, l. ¬(allWritesOKInd(pending(t := true), persisted(l := false), h0) ∧ ¬ allWritesOKInd(pending(t := false), persisted(l := true), h0)) ⊦
Used simplifier rules: allWritesOKInd-base: ⊦ allWritesOKInd(pending, persisted, []); List('a) freely generated by [], +;;
| allWritesOKInd(pending(t := true), persisted(l := false), vpe + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), vpe + h0), ∀ pending, t, persisted, l. ¬(allWritesOKInd(pending(t := true), persisted(l := false), h0) ∧ ¬ allWritesOKInd(pending(t := false), persisted(l := true), h0)) ⊦ |
allWritesOKInd(pending(t := true), persisted(l := false), vpe ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), vpe ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s)
| allWritesOKInd(pending(t := true), persisted(l := false), vpe ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), vpe ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
vpe = (e, b), allWritesOKInd(pending(t := true), persisted(l := false), vpe ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), vpe ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
| vpe = (e, b), allWritesOKInd(pending(t := true), persisted(l := false), vpe ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), vpe ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
allWritesOKInd(pending(t := true), persisted(l := false), (e, b) ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), (e, b) ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
| allWritesOKInd(pending(t := true), persisted(l := false), (e, b) ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), (e, b) ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
e = R(t1, l1, v), allWritesOKInd(pending(t := true), persisted(l := false), (e, b) ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), (e, b) ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
e = W(t1, l1, v), allWritesOKInd(pending(t := true), persisted(l := false), (e, b) ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), (e, b) ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used simplifier rules: RWevent freely generated by R, W;;
| e = R(t1, l1, v), allWritesOKInd(pending(t := true), persisted(l := false), (e, b) ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), (e, b) ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used simplifier rules: allWritesOKInd-recR: ⊦ allWritesOKInd(pending, persisted, (R(t, l, v), b) ' + h) ↔ allWritesOKInd(pending, persisted, h); a: ⊦ (x + y) + z = x + y + z; from specification list
| allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
Used terms: pending, t, persisted, l
| e = W(t1, l1, v), allWritesOKInd(pending(t := true), persisted(l := false), (e, b) ' + h0), ¬ allWritesOKInd(pending(t := false), persisted(l := true), (e, b) ' + h0), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
t ≠ t1, allWritesOKInd(pending(t := true)(t1 := ¬ b), persisted(l := false)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ (b → l ≠ l1 → persisted(l1)) ∧ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0)
Used simplifier rules: allWritesOKInd-recW: ⊦ allWritesOKInd(pending, persisted, (W(t, l, v), b) ' + h) ↔ ¬ pending(t) ∧ (b → persisted(l)) ∧ allWritesOKInd(pending(t := ¬ b), persisted(l := b), h); a: ⊦ (x + y) + z = x + y + z; from specification list
| t ≠ t1, allWritesOKInd(pending(t := true)(t1 := ¬ b), persisted(l := false)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ (b → l ≠ l1 → persisted(l1)) ∧ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0) |
t ≠ t1, allWritesOKInd(pending(t := true)(t1 := ¬ b), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ (b → l ≠ l1 → persisted(l1)) ∧ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0)
Used formulas: allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0)
| t ≠ t1, allWritesOKInd(pending(t := true)(t1 := ¬ b), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ (b → l ≠ l1 → persisted(l1)) ∧ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0) |
t ≠ t1, allWritesOKInd(pending(t := true)(t1 := ¬ b), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
| t ≠ t1, allWritesOKInd(pending(t := true)(t1 := ¬ b), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0)
t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used terms: ¬ b, pending, true, t1, t
| ⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0) |
| t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ l0 ≠ l1 → persisted(l0 := b0)(l1 := b1) = persisted(l1 := b1)(l0 := b0)
l = l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used terms: persisted, b, l1, false, l
| ⊦ l0 ≠ l1 → persisted(l0 := b0)(l1 := b1) = persisted(l1 := b1)(l0 := b0) |
| l = l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l := false)(l1 := b), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
t ≠ t1, allWritesOKInd(pending(t1 := true)(t := true), persisted(l1 := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := true), persisted(l1 := false), h0), ¬ pending(t1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used simplifier rules: persisted-update-same: ⊦ persisted(l := b0)(l := b) = persisted(l := b);
| t ≠ t1, allWritesOKInd(pending(t1 := true)(t := true), persisted(l1 := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := true), persisted(l1 := false), h0), ¬ pending(t1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0)
t ≠ t1, allWritesOKInd(pending(t := true)(t1 := true), persisted(l1 := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := true), persisted(l1 := false), h0), ¬ pending(t1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used terms: true, pending, true, t, t1
| ⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0) |
| t ≠ t1, allWritesOKInd(pending(t := true)(t1 := true), persisted(l1 := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := true), persisted(l1 := false), h0), ¬ pending(t1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0)
t ≠ t1, allWritesOKInd(pending(t1 := true)(t := true), persisted(l1 := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := true), persisted(l1 := false), h0), ¬ pending(t1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used terms: true, pending, true, t1, t
| ⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0) |
| t ≠ t1, allWritesOKInd(pending(t1 := true)(t := true), persisted(l1 := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := true), persisted(l1 := false), h0), ¬ pending(t1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0)
Used simplifier rules: allwritesOK-ind-swap-to-non-pending: ⊦ allWritesOKInd(pending(t := true), persisted, h) → allWritesOKInd(pending(t := false), persisted, h); Used terms: true, pending, false, t1, t
| ⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0) |
| l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → l ≠ l1 ∧ persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
| l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t := false)(t1 := ¬ b), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0)
l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t1 := ¬ b)(t := false), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used terms: ¬ b, pending, false, t1, t
| ⊦ t0 ≠ t1 → pending(t0 := b0)(t1 := b1) = pending(t1 := b1)(t0 := b0) |
| l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t1 := ¬ b)(t := false), persisted(l := true)(l1 := b), h0), ¬ pending(t1), b → persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
⊦ l0 ≠ l1 → persisted(l0 := b0)(l1 := b1) = persisted(l1 := b1)(l0 := b0)
l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t1 := ¬ b)(t := false), persisted(l1 := b)(l := true), h0), ¬ pending(t1), b → persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦
Used terms: persisted, b, l1, true, l
| ⊦ l0 ≠ l1 → persisted(l0 := b0)(l1 := b1) = persisted(l1 := b1)(l0 := b0) |
| l ≠ l1, t ≠ t1, allWritesOKInd(pending(t1 := ¬ b)(t := true), persisted(l1 := b)(l := false), h0), ¬ allWritesOKInd(pending(t1 := ¬ b)(t := false), persisted(l1 := b)(l := true), h0), ¬ pending(t1), b → persisted(l1), ∀ pending0, t0, persisted0, l0. ¬ allWritesOKInd(pending0(t0 := true), persisted0(l0 := false), h0) ∨ allWritesOKInd(pending0(t0 := false), persisted0(l0 := true), h0) ⊦ |
Used terms: pending(t1 := ¬ b), t, persisted(l1 := b), l
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.