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