| ⊦ rely(me, hO1, h1[r, o1], hO2, h2) → (((!(me, hO2, r => o0 * hP) * hP0))(h1) ↔ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1) |
¬(((!(me, hO2, r => o0 * hP) * hP0))(h1) ↔ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1), rely(me, hO1, h1[r, o1], hO2, h2) ⊦
| ¬(((!(me, hO2, r => o0 * hP) * hP0))(h1) ↔ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1), rely(me, hO1, h1[r, o1], hO2, h2) ⊦ |
¬(((!(me, hO2, r => o0 * hP) * hP0))(h1) ↔ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1), rely(me, hO1, h1[r, o1], hO2, h2) ⊦
| ¬(((!(me, hO2, r => o0 * hP) * hP0))(h1) ↔ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1), rely(me, hO1, h1[r, o1], hO2, h2) ⊦ |
((!(me, hO2, r => o0 * hP) * hP0))(h1), rely(me, hO1, h1[r, o1], hO2, h2) ⊦ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1
h1[r] = o0, ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, ¬ ((!(me, hO2, r => o0 * hP) * hP0))(h1) ⊦
| ((!(me, hO2, r => o0 * hP) * hP0))(h1), rely(me, hO1, h1[r, o1], hO2, h2) ⊦ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1 |
⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
rely(me, hO1, h1[r, o1], hO2, h2), ∃ h0, h2. h0 ⊥ h2 ∧ h1 = h0 ∪ h2 ∧ !(me, hO2, r => o0 * hP)(h0) ∧ hP0(h2) ⊦ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1
Used terms: h1, hP0, !(me, hO2, r => o0 * hP)
| ⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| rely(me, hO1, h1[r, o1], hO2, h2), ∃ h0, h2. h0 ⊥ h2 ∧ h1 = h0 ∪ h2 ∧ !(me, hO2, r => o0 * hP)(h0) ∧ hP0(h2) ⊦ ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]) ∧ h1[r] = o0 ∧ r ∈ h1 |
!(me, hO2, r => o0 * hP)(h0), hP0(h), rely(me, hO1, (h0 ∪ h)[r, o1], hO2, h2), h0 ⊥ h ⊦ ((!(me, hO2, r => o1 * hP) * hP0))((h0 ∪ h)[r, o1]) ∧ (r ∈ h0 ⊃ h0[r];h[r]) = o0 ∧ (r ∈ h0 ∨ r ∈ h)
Used simplifier rules: r ∈ h0 ∪ h1 ⊦ h0 ⊥ h1 → (h0 ∪ h1)[r] = (r ∈ h0 ⊃ h0[r];h1[r]); (s) ⊦ h0 ⊥ h1 → (r ∈ h0 ∪ h1 ↔ r ∈ h0 ∨ r ∈ h1); (s)
| !(me, hO2, r => o0 * hP)(h0), hP0(h), rely(me, hO1, (h0 ∪ h)[r, o1], hO2, h2), h0 ⊥ h ⊦ ((!(me, hO2, r => o1 * hP) * hP0))((h0 ∪ h)[r, o1]) ∧ (r ∈ h0 ⊃ h0[r];h[r]) = o0 ∧ (r ∈ h0 ∨ r ∈ h) |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, (h0 ∪ h)[r, o1], hO2, h2), h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ ((!(me, hO2, r => o1 * hP) * hP0))((h0 ∪ h)[r, o1]) ∧ (r ∈ h0 ⊃ h0[r];h[r]) = o0 ∧ (r ∈ h0 ∨ r ∈ h)
Used terms: h0, r => o0 * hP, hO2, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, (h0 ∪ h)[r, o1], hO2, h2), h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ ((!(me, hO2, r => o1 * hP) * hP0))((h0 ∪ h)[r, o1]) ∧ (r ∈ h0 ⊃ h0[r];h[r]) = o0 ∧ (r ∈ h0 ∨ r ∈ h) |
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, (h0 ∪ h)[r, o1], hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))((h0 ∪ h)[r, o1]), ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: ⊦ ((r => o * hP))(h) → r ∈ h; (s) ⊦ ((r => o0 * hP))(h) → (h[r] = o1 ↔ o0 = o1); (s) sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, (h0 ∪ h)[r, o1], hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))((h0 ∪ h)[r, o1]), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
⊦ r ∈ h0 ∧ h0 ⊥ h1 → (h0 ∪ h1)[r, o] = h0[r, o] ∪ h1
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), r ∈ h0, h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ ((r => o * hP))(h) → r ∈ h; (s) Used terms: o1, r, h, h0
| ⊦ r ∈ h0 ∧ h0 ⊥ h1 → (h0 ∪ h1)[r, o] = h0[r, o] ∪ h1 |
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), r ∈ h0, h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: ⊦ ((r => o * hP))(h) → r ∈ h; (s) sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → ((hP0 * hP1))(h0 ∪ h1)
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ !(me, hO2, r => o1 * hP)(h0[r, o1]) ∧ hP0(h) ∧ h0[r, o1] ⊥ h
Used terms: h, h0[r, o1], hP0, !(me, hO2, r => o1 * hP)
| ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → ((hP0 * hP1))(h0 ∪ h1) |
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ !(me, hO2, r => o1 * hP)(h0[r, o1]) ∧ hP0(h) ∧ h0[r, o1] ⊥ h |
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ !(me, hO2, r => o1 * hP)(h0[r, o1]) ∧ h0[r, o1] ⊥ h
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ !(me, hO2, r => o1 * hP)(h0[r, o1]) ∧ h0[r, o1] ⊥ h |
⊦ h0 ⊥ h1 ↔ (∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h1)
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ !(me, hO2, r => o1 * hP)(h0[r, o1]) ∧ (∀ r0. ¬ r0 ∈ h0[r, o1] ∨ ¬ r0 ∈ h)
Used terms: h, h0[r, o1]
| ⊦ h0 ⊥ h1 ↔ (∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h1) |
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ !(me, hO2, r => o1 * hP)(h0[r, o1]) ∧ (∀ r0. ¬ r0 ∈ h0[r, o1] ∨ ¬ r0 ∈ h) |
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ !(me, hO2, r => o1 * hP)(h0[r, o1]), ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: ⊦ r ∈ h1 ∧ h0 ⊥ h1 → (r ∈ h0 ↔ false); (s) ⊦ r ∈ h[r0, o] ↔ r ∈ h; (s)
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ !(me, hO2, r => o1 * hP)(h0[r, o1]), ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => o1 * hP))(h0[r, o1]) ∨ (∃ r0. ¬(r0 ∈ h0[r, o1] → hO2(r0) = me)) ⊦
Used terms: h0[r, o1], r => o1 * hP, hO2, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => o1 * hP))(h0[r, o1]) ∨ (∃ r0. ¬(r0 ∈ h0[r, o1] → hO2(r0) = me)) ⊦ |
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => o1 * hP))(h0[r, o1]) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦
Used simplifier rules: ⊦ r ∈ h[r0, o] ↔ r ∈ h; (s)
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => o1 * hP))(h0[r, o1]) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦ |
r ∈ h ⊦ ((r => o0 * hP))(h[r, o1]) ↔ o0 = o1 ∧ ((r =>_ * hP))(h)
((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), r ∈ h0, h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me, ¬(o1 = o1 ∧ ((r =>_ * hP))(h0)) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ ((r => o * hP))(h) → r ∈ h; (s) Used terms: r, h0, hP, o1, o1
| r ∈ h ⊦ ((r => o0 * hP))(h[r, o1]) ↔ o0 = o1 ∧ ((r =>_ * hP))(h) |
| ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), r ∈ h0, h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me, ¬(o1 = o1 ∧ ((r =>_ * hP))(h0)) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦ |
hO2(r0) ≠ me, ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), r0 ∈ h0, h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ ((r => o * hP))(h) → ((r =>_ * hP))(h); (s) ⊦ ((r => o * hP))(h) → r ∈ h; (s)
| hO2(r0) ≠ me, ((r => o0 * hP))(h0), hP0(h), rely(me, hO1, h0[r, o1] ∪ h, hO2, h2), r0 ∈ h0, h0 ⊥ h, ¬ ((!(me, hO2, r => o1 * hP) * hP0))(h0[r, o1] ∪ h), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
Used terms: r0
| h1[r] = o0, ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, ¬ ((!(me, hO2, r => o0 * hP) * hP0))(h1) ⊦ |
((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1) ⊦
| ((!(me, hO2, r => o1 * hP) * hP0))(h1[r, o1]), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1) ⊦ |
⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1), ∃ h0, h2. h0 ⊥ h2 ∧ h1[r, o1] = h0 ∪ h2 ∧ !(me, hO2, r => o1 * hP)(h0) ∧ hP0(h2) ⊦
Used terms: h1[r, o1], hP0, !(me, hO2, r => o1 * hP)
| ⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1), ∃ h0, h2. h0 ⊥ h2 ∧ h1[r, o1] = h0 ∪ h2 ∧ !(me, hO2, r => o1 * hP)(h0) ∧ hP0(h2) ⊦ |
h1[r, o1] = h0 ∪ h, !(me, hO2, r => o1 * hP)(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1) ⊦
| h1[r, o1] = h0 ∪ h, !(me, hO2, r => o1 * hP)(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1) ⊦ |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1), ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used terms: h0, r => o1 * hP, hO2, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1), ∀ r. r ∈ h0 → hO2(r) = me ⊦
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ ((!(me, hO2, r => h1[r] * hP) * hP0))(h1), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ∀ h0, h2. ¬(h0 ⊥ h2 ∧ h1 = h0 ∪ h2 ∧ !(me, hO2, r => h1[r] * hP)(h0) ∧ hP0(h2)) ⊦
Used terms: h1, hP0, !(me, hO2, r => h1[r] * hP)
| ⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ∀ h0, h2. ¬(h0 ⊥ h2 ∧ h1 = h0 ∪ h2 ∧ !(me, hO2, r => h1[r] * hP)(h0) ∧ hP0(h2)) ⊦ |
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ∀ h3, h4. ¬ h3 ⊥ h4 ∨ h1 ≠ h3 ∪ h4 ∨ ¬ !(me, hO2, r => (h3 ∪ h4)[r] * hP)(h3) ∨ ¬ hP0(h4) ⊦
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ∀ h3, h4. ¬ h3 ⊥ h4 ∨ h1 ≠ h3 ∪ h4 ∨ ¬ !(me, hO2, r => (h3 ∪ h4)[r] * hP)(h3) ∨ ¬ hP0(h4) ⊦ |
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ h0[r, h1[r]] ⊥ h ∨ h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => (h0[r, h1[r]] ∪ h)[r] * hP)(h0[r, h1[r]]) ∨ ¬ hP0(h) ⊦
Used terms: h0[r, h1[r]], h
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ h0[r, h1[r]] ⊥ h ∨ h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => (h0[r, h1[r]] ∪ h)[r] * hP)(h0[r, h1[r]]) ∨ ¬ hP0(h) ⊦ |
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ h0[r, h1[r]] ⊥ h ∨ h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]) ⊦
Used simplifier rules: ⊦ ((r => o * hP))(h) → r ∈ h; (s) ⊦ h[r0, o][r] = (r = r0 ∧ r0 ∈ h ⊃ o;h[r]); (s) sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ r ∈ h[r0, o] ↔ r ∈ h; (s) r ∈ h0 ∪ h1 ⊦ h0 ⊥ h1 → (h0 ∪ h1)[r] = (r ∈ h0 ⊃ h0[r];h1[r]); (s)
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ h0[r, h1[r]] ⊥ h ∨ h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]) ⊦ |
⊦ h0 ⊥ h1 ↔ (∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h1)
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬(∀ r0. ¬ r0 ∈ h0[r, h1[r]] ∨ ¬ r0 ∈ h) ∨ h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]) ⊦
Used terms: h, h0[r, h1[r]]
| ⊦ h0 ⊥ h1 ↔ (∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h1) |
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬(∀ r0. ¬ r0 ∈ h0[r, h1[r]] ∨ ¬ r0 ∈ h) ∨ h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]) ⊦ |
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]) ⊦
Used simplifier rules: ⊦ r ∈ h1 ∧ h0 ⊥ h1 → (r ∈ h0 ↔ false); (s) ⊦ r ∈ h[r0, o] ↔ r ∈ h; (s)
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, h1 ≠ h0[r, h1[r]] ∪ h ∨ ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]) ⊦ |
h1[r, o1] = h0 ∪ h, h1 ≠ h0[r, h1[r]] ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]), ∀ r. r ∈ h0 → hO2(r) = me ⊦
| h1[r, o1] = h0 ∪ h, h1 ≠ h0[r, h1[r]] ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
⊦ r ∈ h0 ∧ h0 ⊥ h1 → (h0 ∪ h1)[r, o] = h0[r, o] ∪ h1
h1[r, o1] = h0 ∪ h, h1 ≠ (h0 ∪ h)[r, h1[r]], ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, r ∈ h0, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ ((r => o * hP))(h) → r ∈ h; (s) Used terms: h, h1[r], r, h0
| ⊦ r ∈ h0 ∧ h0 ⊥ h1 → (h0 ∪ h1)[r, o] = h0[r, o] ∪ h1 |
| h1[r, o1] = h0 ∪ h, h1 ≠ (h0 ∪ h)[r, h1[r]], ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, r ∈ h0, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
h1[r, o1] = h0 ∪ h, h1 ≠ h1[r, o1][r, h1[r]], ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h0, r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦
| h1[r, o1] = h0 ∪ h, h1 ≠ h1[r, o1][r, h1[r]], ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h0, r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
h1[r, o1] = h0 ∪ h, h1 ≠ h1[r, h1[r]], ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: ⊦ ((r => o * hP))(h) → r ∈ h; (s) sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ h[r, o0][r, o1] = h[r, o1]; (s)
| h1[r, o1] = h0 ∪ h, h1 ≠ h1[r, h1[r]], ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
r ∈ h ⊦ h[r] = o → h[r, o] = h
Used terms: h1[r], r, h1
| r ∈ h ⊦ h[r] = o → h[r, o] = h |
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ¬ !(me, hO2, r => h1[r] * hP)(h0[r, h1[r]]), ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => h1[r] * hP))(h0[r, h1[r]]) ∨ (∃ r0. ¬(r0 ∈ h0[r, h1[r]] → hO2(r0) = me)) ⊦
Used terms: h0[r, h1[r]], r => h1[r] * hP, hO2, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => h1[r] * hP))(h0[r, h1[r]]) ∨ (∃ r0. ¬(r0 ∈ h0[r, h1[r]] → hO2(r0) = me)) ⊦ |
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => h1[r] * hP))(h0[r, h1[r]]) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦
Used simplifier rules: ⊦ r ∈ h[r0, o] ↔ r ∈ h; (s)
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬ ((r => h1[r] * hP))(h0[r, h1[r]]) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦ |
r ∈ h ⊦ ((r => o0 * hP))(h[r, o1]) ↔ o0 = o1 ∧ ((r =>_ * hP))(h)
h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, r ∈ h0, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬(h1[r] = h1[r] ∧ ((r =>_ * hP))(h0)) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ ((r => o * hP))(h) → r ∈ h; (s) Used terms: r, h0, hP, h1[r], h1[r]
| r ∈ h ⊦ ((r => o0 * hP))(h[r, o1]) ↔ o0 = o1 ∧ ((r =>_ * hP))(h) |
| h1[r, o1] = h0 ∪ h, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, r ∈ h0, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me, ¬(h1[r] = h1[r] ∧ ((r =>_ * hP))(h0)) ∨ ¬(r0 ∈ h0 → hO2(r0) = me) ⊦ |
h1[r, o1] = h0 ∪ h, hO2(r0) ≠ me, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, r0 ∈ h0, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ ((r => o * hP))(h) → ((r =>_ * hP))(h); (s) ⊦ ((r => o * hP))(h) → r ∈ h; (s)
| h1[r, o1] = h0 ∪ h, hO2(r0) ≠ me, ((r => o1 * hP))(h0), hP0(h), rely(me, hO1, h1[r, o1], hO2, h2), r ∈ h1, r0 ∈ h0, h0 ⊥ h, ∀ r. r ∈ h0 → hO2(r) = me ⊦ |
Used terms: r0
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.