| ⊦ r ≠ null ∧ ¬ r ∈ h1 ∧ rely(me, hO1(r := me), h1 ++ r, hO2, h2) → ((!(me, hO1, hP) * hP0)(h1) ↔ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r)) |
¬((!(me, hO1, hP) * hP0)(h1) ↔ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r)), r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ r ∈ h1 ⊦
| ¬((!(me, hO1, hP) * hP0)(h1) ↔ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r)), r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ r ∈ h1 ⊦ |
¬((!(me, hO1, hP) * hP0)(h1) ↔ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r)), r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ r ∈ h1 ⊦
| ¬((!(me, hO1, hP) * hP0)(h1) ↔ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r)), r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ r ∈ h1 ⊦ |
r ≠ null, (!(me, hO1, hP) * hP0)(h1), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
r ≠ null, (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦
| r ≠ null, (!(me, hO1, hP) * hP0)(h1), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
¬ r ∈ h, r ≠ null ⊦ (r.=>_ * hP)(h ++ r) ↔ hP(h)
(r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r) ↔ (!(me, hO1, hP) * hP0)(h1), r ≠ null, (!(me, hO1, hP) * hP0)(h1), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
Used terms: r, h1, !(me, hO1, hP) * hP0
| ¬ r ∈ h, r ≠ null ⊦ (r.=>_ * hP)(h ++ r) ↔ hP(h) |
| (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r) ↔ (!(me, hO1, hP) * hP0)(h1), r ≠ null, (!(me, hO1, hP) * hP0)(h1), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
r ≠ null, (!(me, hO1, hP) * hP0)(h1), (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
| r ≠ null, (!(me, hO1, hP) * hP0)(h1), (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
⊦ r.=>_ = !(me, hO(r := me), r.=>_)
r.=>_ = !(me, hO1(r := me), r.=>_), r ≠ null, (!(me, hO1, hP) * hP0)(h1), (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
Used terms: r, me, hO1
| ⊦ r.=>_ = !(me, hO(r := me), r.=>_) |
| r.=>_ = !(me, hO1(r := me), r.=>_), r ≠ null, (!(me, hO1, hP) * hP0)(h1), (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
r.=>_ = !(me, hO2, r.=>_), r ≠ null, (!(me, hO1, hP) * hP0)(h1), (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
Used simplifier rules: switch-ownership: ⊦ rely(me, hO1, h1, hO2, h2) → !(me, hO1, hP) = !(me, hO2, hP);
| r.=>_ = !(me, hO2, r.=>_), r ≠ null, (!(me, hO1, hP) * hP0)(h1), (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
r.=>_ = !(me, hO2, r.=>_), r ≠ null, (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
| r.=>_ = !(me, hO2, r.=>_), r ≠ null, (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
r.=>_ = !(me, hO2, r.=>_), r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∃ h0, h2. h0 ⊥ h2 ∧ h1 ++ r = h0 ∪ h2 ∧ r.=>_(h0) ∧ (!(me, hO1, hP) * hP0)(h2) ⊦
Used terms: h1 ++ r, !(me, hO1, hP) * hP0, r.=>_
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| r.=>_ = !(me, hO2, r.=>_), r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∃ h0, h2. h0 ⊥ h2 ∧ h1 ++ r = h0 ∪ h2 ∧ r.=>_(h0) ∧ (!(me, hO1, hP) * hP0)(h2) ⊦ |
h1 ++ r = h0 ∪ h, r.=>_ = !(me, hO2, r.=>_), r ≠ null, (!(me, hO1, hP) * hP0)(h), h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h, r.=>_ = !(me, hO2, r.=>_), r ≠ null, (!(me, hO1, hP) * hP0)(h), h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
h1 ++ r = h0 ∪ h, r.=>_ = !(me, hO2, r.=>_), r ≠ null, h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ !(me, hO1, hP)(h0) ∧ hP0(h1) ⊦
Used terms: h, hP0, !(me, hO1, hP)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| h1 ++ r = h0 ∪ h, r.=>_ = !(me, hO2, r.=>_), r ≠ null, h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ !(me, hO1, hP)(h0) ∧ hP0(h1) ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
Used simplifier rules: h1 ⊥ h ⊦ h0 ⊥ h1 ∪ h ↔ h0 ⊥ h1 ∧ h0 ⊥ h; (ws)
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
⊦ !(me, hO, hP0) * !(me, hO, hP1) = !(me, hO, hP0 * hP1)
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ ((!(me, hO2, r.=>_) * !(me, hO2, hP)) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
Used terms: hP, r.=>_, hO2, me
| ⊦ !(me, hO, hP0) * !(me, hO, hP1) = !(me, hO, hP0 * hP1) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ ((!(me, hO2, r.=>_) * !(me, hO2, hP)) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h0 ∪ h3 ∪ h4, hO2, h2), ¬ ((!(me, hO2, r.=>_) * !(me, hO2, hP)) * hP0)(h0 ∪ h3 ∪ h4), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h0 ∪ h3 ∪ h4, hO2, h2), ¬ ((!(me, hO2, r.=>_) * !(me, hO2, hP)) * hP0)(h0 ∪ h3 ∪ h4), ¬ r ∈ h1 ⊦ |
⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h0 ∪ h3 ∪ h4, hO2, h2), ¬ (!(me, hO2, r.=>_) * !(me, hO2, hP) * hP0)(h0 ∪ h3 ∪ h4), ¬ r ∈ h1 ⊦
Used terms: hP0, !(me, hO2, hP), !(me, hO2, r.=>_)
| ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2 |
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h0 ∪ h3 ∪ h4, hO2, h2), ¬ (!(me, hO2, r.=>_) * !(me, hO2, hP) * hP0)(h0 ∪ h3 ∪ h4), ¬ r ∈ h1 ⊦ |
⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1)
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h0 ∪ h3 ∪ h4, hO2, h2), ¬ (!(me, hO2, r.=>_) * !(me, hO2, hP) * hP0)(h0 ∪ h3 ∪ h4), ¬ r ∈ h1 ⊦ !(me, hO2, r.=>_)(h0) ∧ (!(me, hO2, hP) * hP0)(h3 ∪ h4) ∧ h0 ⊥ h3 ∪ h4
Used terms: h3 ∪ h4, h0, !(me, hO2, hP) * hP0, !(me, hO2, r.=>_)
| ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h0 ∪ h3 ∪ h4, hO2, h2), ¬ (!(me, hO2, r.=>_) * !(me, hO2, hP) * hP0)(h0 ∪ h3 ∪ h4), ¬ r ∈ h1 ⊦ !(me, hO2, r.=>_)(h0) ∧ (!(me, hO2, hP) * hP0)(h3 ∪ h4) ∧ h0 ⊥ h3 ∪ h4 |
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦
Used simplifier rules: compact-local: ⊦ !(me, hO, hP0) * !(me, hO, hP1) = !(me, hO, hP0 * hP1); h1 ⊥ h ⊦ h0 ⊥ h1 ∪ h ↔ h0 ⊥ h1 ∧ h0 ⊥ h; (ws) sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦ |
⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1)
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦ !(me, hO2, hP)(h3) ∧ hP0(h4) ∧ h3 ⊥ h4
Used terms: h4, h3, hP0, !(me, hO2, hP)
| ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦ !(me, hO2, hP)(h3) ∧ hP0(h4) ∧ h3 ⊥ h4 |
h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, r.=>_ = !(me, hO2, r.=>_), r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1 ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO1, hP)(h3), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1 ⊦ |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1, ∀ r. r ∈ h3 → hO1(r) = me ⊦
Used terms: h3, hP, hO1, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1, ∀ r. r ∈ h3 → hO1(r) = me ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1, ∀ r. r ∈ h3 → hO1(r) = me ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO2, hP)(h3), ¬ r ∈ h1, ∀ r. r ∈ h3 → hO1(r) = me ⊦ |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ hP(h3) ∨ (∃ r. ¬(r ∈ h3 → hO2(r) = me)), ∀ r. r ∈ h3 → hO1(r) = me ⊦
Used terms: h3, hP, hO2, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ hP(h3) ∨ (∃ r. ¬(r ∈ h3 → hO2(r) = me)), ∀ r. r ∈ h3 → hO1(r) = me ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ me, r ≠ null, h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ∀ r. r ∈ h3 → hO1(r) = me ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ me, r ≠ null, h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ∀ r. r ∈ h3 → hO1(r) = me ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ me, r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, r0 ∈ h3 → hO1(r0) = me ⊦
Used terms: r0
| h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ me, r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ (!(me, hO2, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, r0 ∈ h3 → hO1(r0) = me ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ hO1(r0), r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, rely(hO1(r0), hO1(r := hO1(r0)), h1 ++ r, hO2, h2), ¬ (!(hO1(r0), hO2, hP) * hP0)(h3 ∪ h4), ¬ (!(hO1(r0), hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ hO1(r0), r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, rely(hO1(r0), hO1(r := hO1(r0)), h1 ++ r, hO2, h2), ¬ (!(hO1(r0), hO2, hP) * hP0)(h3 ∪ h4), ¬ (!(hO1(r0), hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
⊦ rely(me, of1, h1, of2, h2) ↔ (∀ r. (of1(r) = me ↔ of2(r) = me) ∧ (of1(r) = me → (r ∈ h1 ↔ r ∈ h2) ∧ (r ∈ h1 → h1(r) = h2(r))))
h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ hO1(r0), r ≠ null, h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, ¬ (!(hO1(r0), hO2, hP) * hP0)(h3 ∪ h4), ¬ (!(hO1(r0), hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∀ r1. (hO1(r := hO1(r0))(r1) = hO1(r0) ↔ hO2(r1) = hO1(r0)) ∧ (hO1(r := hO1(r0))(r1) = hO1(r0) → (r1 ∈ h1 ++ r ↔ r1 ∈ h2) ∧ (r1 ∈ h1 ++ r → (h1 ++ r)(r1) = h2(r1))) ⊦
Used terms: h2, hO1(r := hO1(r0)), h1 ++ r, hO1(r0), hO2
| ⊦ rely(me, of1, h1, of2, h2) ↔ (∀ r. (of1(r) = me ↔ of2(r) = me) ∧ (of1(r) = me → (r ∈ h1 ↔ r ∈ h2) ∧ (r ∈ h1 → h1(r) = h2(r)))) |
| h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ hO1(r0), r ≠ null, h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, ¬ (!(hO1(r0), hO2, hP) * hP0)(h3 ∪ h4), ¬ (!(hO1(r0), hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∀ r1. (hO1(r := hO1(r0))(r1) = hO1(r0) ↔ hO2(r1) = hO1(r0)) ∧ (hO1(r := hO1(r0))(r1) = hO1(r0) → (r1 ∈ h1 ++ r ↔ r1 ∈ h2) ∧ (r1 ∈ h1 ++ r → (h1 ++ r)(r1) = h2(r1))) ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ hO1(r0), r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, ¬ (!(hO1(r0), hO2, hP) * hP0)(h3 ∪ h4), ¬ (!(hO1(r0), hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∀ r1. ((r = r1 ⊃ hO1(r0);hO1(r1)) = hO1(r0) ↔ hO2(r1) = hO1(r0)) ∧ ((r = r1 ⊃ hO1(r0);hO1(r1)) = hO1(r0) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 = r ∨ r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
Used simplifier rules: r0 ≠ null, ¬ r0 ∈ h ⊦ r ∈ h ++ r0 ↔ r = r0 ∨ r ∈ h; (s)
| h1 ++ r = h0 ∪ h3 ∪ h4, hO2(r0) ≠ hO1(r0), r ≠ null, h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r0 ∈ h3, ¬ (!(hO1(r0), hO2, hP) * hP0)(h3 ∪ h4), ¬ (!(hO1(r0), hO2, r.=>_ * hP) * hP0)(h1 ++ r), ¬ r ∈ h1, ∀ r1. ((r = r1 ⊃ hO1(r0);hO1(r1)) = hO1(r0) ↔ hO2(r1) = hO1(r0)) ∧ ((r = r1 ⊃ hO1(r0);hO1(r1)) = hO1(r0) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 = r ∨ r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
Used terms: r0
| r ≠ null, (!(me, hO2, r.=>_ * hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦ |
⊦ !(me, hO, hP0) * !(me, hO, hP1) = !(me, hO, hP0 * hP1)
r ≠ null, ((!(me, hO2, r.=>_) * !(me, hO2, hP)) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦
Used terms: hP, r.=>_, hO2, me
| ⊦ !(me, hO, hP0) * !(me, hO, hP1) = !(me, hO, hP0 * hP1) |
| r ≠ null, ((!(me, hO2, r.=>_) * !(me, hO2, hP)) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦ |
⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2
r ≠ null, (!(me, hO2, r.=>_) * !(me, hO2, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦
Used terms: hP0, !(me, hO2, hP), !(me, hO2, r.=>_)
| ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2 |
| r ≠ null, (!(me, hO2, r.=>_) * !(me, hO2, hP) * hP0)(h1 ++ r), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, ∃ h0, h2. h0 ⊥ h2 ∧ h1 ++ r = h0 ∪ h2 ∧ !(me, hO2, r.=>_)(h0) ∧ (!(me, hO2, hP) * hP0)(h2) ⊦
Used terms: h1 ++ r, !(me, hO2, hP) * hP0, !(me, hO2, r.=>_)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| r ≠ null, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, ∃ h0, h2. h0 ⊥ h2 ∧ h1 ++ r = h0 ∪ h2 ∧ !(me, hO2, r.=>_)(h0) ∧ (!(me, hO2, hP) * hP0)(h2) ⊦ |
h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦ |
¬ r ∈ h, r ≠ null ⊦ (r.=>_ * hP)(h ++ r) ↔ hP(h)
h1 ++ r = h0 ∪ h, (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r) ↔ (!(me, hO1, hP) * hP0)(h1), r ≠ null, (!(me, hO2, hP) * hP0)(h), !(me, hO2, r.=>_)(h0), h0 ⊥ h, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦
Used terms: r, h1, !(me, hO1, hP) * hP0
| ¬ r ∈ h, r ≠ null ⊦ (r.=>_ * hP)(h ++ r) ↔ hP(h) |
| h1 ++ r = h0 ∪ h, (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r) ↔ (!(me, hO1, hP) * hP0)(h1), r ≠ null, (!(me, hO2, hP) * hP0)(h), !(me, hO2, r.=>_)(h0), h0 ⊥ h, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦ |
h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (r.=>_ * !(me, hO1, hP) * hP0)(h1 ++ r), ¬ r ∈ h1 ⊦ |
h1 ++ r = h0 ∪ h, r ≠ null, (!(me, hO2, hP) * hP0)(h), !(me, hO2, r.=>_)(h0), h0 ⊥ h, rely(me, hO1(r := me), h0 ∪ h, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (r.=>_ * !(me, hO1, hP) * hP0)(h0 ∪ h), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h, r ≠ null, (!(me, hO2, hP) * hP0)(h), !(me, hO2, r.=>_)(h0), h0 ⊥ h, rely(me, hO1(r := me), h0 ∪ h, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (r.=>_ * !(me, hO1, hP) * hP0)(h0 ∪ h), ¬ r ∈ h1 ⊦ |
⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1)
h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, rely(me, hO1(r := me), h0 ∪ h, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (r.=>_ * !(me, hO1, hP) * hP0)(h0 ∪ h), ¬ r ∈ h1 ⊦ r.=>_(h0) ∧ (!(me, hO1, hP) * hP0)(h) ∧ h0 ⊥ h
Used terms: h, h0, !(me, hO1, hP) * hP0, r.=>_
| ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1) |
| h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, rely(me, hO1(r := me), h0 ∪ h, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (r.=>_ * !(me, hO1, hP) * hP0)(h0 ∪ h), ¬ r ∈ h1 ⊦ r.=>_(h0) ∧ (!(me, hO1, hP) * hP0)(h) ∧ h0 ⊥ h |
h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h), ¬ r ∈ h1 ⊦
Used simplifier rules: owned-P: ⊦ !(me, hO, hP)(h) ∧ ¬ hP(h) → false; sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ¬ r ∈ h, r ≠ null ⊦ (r.=>_ * hP)(h ++ r) ↔ hP(h); (ss)
| h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), (!(me, hO2, hP) * hP0)(h), h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h), ¬ r ∈ h1 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h), ¬ r ∈ h1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ !(me, hO2, hP)(h0) ∧ hP0(h1) ⊦
Used terms: h, hP0, !(me, hO2, hP)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| h1 ++ r = h0 ∪ h, r ≠ null, !(me, hO2, r.=>_)(h0), h0 ⊥ h, r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h), ¬ r ∈ h1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ !(me, hO2, hP)(h0) ∧ hP0(h1) ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦
Used simplifier rules: h1 ⊥ h ⊦ h0 ⊥ h1 ∪ h ↔ h0 ⊥ h1 ∧ h0 ⊥ h; (ws)
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦ |
⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1)
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦ !(me, hO1, hP)(h3) ∧ hP0(h4) ∧ h3 ⊥ h4
Used terms: h4, h3, hP0, !(me, hO1, hP)
| ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1 ⊦ !(me, hO1, hP)(h3) ∧ hP0(h4) ∧ h3 ⊥ h4 |
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO1, hP)(h3), ¬ r ∈ h1 ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ !(me, hO1, hP)(h3), ¬ r ∈ h1 ⊦ |
⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id)
h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ hP(h3) ∨ (∃ r. ¬(r ∈ h3 → hO1(r) = me)) ⊦
Used terms: h3, hP, hO1, me
| ⊦ !(id, of, hP)(h) ↔ hP(h) ∧ (∀ r. r ∈ h → of(r) = id) |
| h1 ++ r = h0 ∪ h3 ∪ h4, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP0(h4), r.=>_(h0), rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ hP(h3) ∨ (∃ r. ¬(r ∈ h3 → hO1(r) = me)) ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦
Used simplifier rules: owned-P: ⊦ !(me, hO, hP)(h) ∧ ¬ hP(h) → false;
| h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, rely(me, hO1(r := me), h1 ++ r, hO2, h2), ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1 ⊦ |
⊦ rely(me, of1, h1, of2, h2) ↔ (∀ r. (of1(r) = me ↔ of2(r) = me) ∧ (of1(r) = me → (r ∈ h1 ↔ r ∈ h2) ∧ (r ∈ h1 → h1(r) = h2(r))))
h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, ∀ r0. (hO1(r := me)(r0) = me ↔ hO2(r0) = me) ∧ (hO1(r := me)(r0) = me → (r0 ∈ h1 ++ r ↔ r0 ∈ h2) ∧ (r0 ∈ h1 ++ r → (h1 ++ r)(r0) = h2(r0))) ⊦
Used terms: h2, hO1(r := me), h1 ++ r, me, hO2
| ⊦ rely(me, of1, h1, of2, h2) ↔ (∀ r. (of1(r) = me ↔ of2(r) = me) ∧ (of1(r) = me → (r ∈ h1 ↔ r ∈ h2) ∧ (r ∈ h1 → h1(r) = h2(r)))) |
| h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, ∀ r0. (hO1(r := me)(r0) = me ↔ hO2(r0) = me) ∧ (hO1(r := me)(r0) = me → (r0 ∈ h1 ++ r ↔ r0 ∈ h2) ∧ (r0 ∈ h1 ++ r → (h1 ++ r)(r0) = h2(r0))) ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, ∀ r1. ((r = r1 ⊃ me;hO1(r1)) = me ↔ hO2(r1) = me) ∧ ((r = r1 ⊃ me;hO1(r1)) = me → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 = r ∨ r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
Used simplifier rules: r0 ≠ null, ¬ r0 ∈ h ⊦ r ∈ h ++ r0 ↔ r = r0 ∨ r ∈ h; (s)
| h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, hP)(h3), !(me, hO2, r.=>_)(h0), h0 ⊥ h4, h0 ⊥ h3, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, ∀ r1. ((r = r1 ⊃ me;hO1(r1)) = me ↔ hO2(r1) = me) ∧ ((r = r1 ⊃ me;hO1(r1)) = me → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 = r ∨ r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
(r = r0 ⊃ me;hO1(r0)) = me ↔ hO2(r0) = me, h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, (r = r0 ⊃ me;hO1(r0)) = me → (r0 = r ∨ r0 ∈ h1 ↔ r0 ∈ h2) ∧ (r0 = r ∨ r0 ∈ h1 → (h1 ++ r)(r0) = h2(r0)), ∀ r1. ((r = r1 ⊃ me;hO1(r1)) = me ↔ hO2(r1) = me) ∧ ((r = r1 ⊃ me;hO1(r1)) = me → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 = r ∨ r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
Used terms: r0
| (r = r0 ⊃ me;hO1(r0)) = me ↔ hO2(r0) = me, h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r0) ≠ me, r ≠ null, !(me, hO2, r.=>_)(h0), !(me, hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r.=>_(h0), r0 ∈ h3, ¬ (!(me, hO1, hP) * hP0)(h3 ∪ h4), ¬ (!(me, hO1, hP) * hP0)(h1), ¬ r ∈ h1, (r = r0 ⊃ me;hO1(r0)) = me → (r0 = r ∨ r0 ∈ h1 ↔ r0 ∈ h2) ∧ (r0 = r ∨ r0 ∈ h1 → (h1 ++ r)(r0) = h2(r0)), ∀ r1. ((r = r1 ⊃ me;hO1(r1)) = me ↔ hO2(r1) = me) ∧ ((r = r1 ⊃ me;hO1(r1)) = me → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 = r ∨ r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
(h1 ++ r)(r) = h2(r), h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r) ≠ hO2(r), !(hO2(r), hO2, r.=>_)(h0), !(hO2(r), hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h2, r.=>_(h0), r ∈ h3, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
Used simplifier rules: owned-r: ⊦ !(me, hO, hP)(h) ∧ hO(r) ≠ me → ¬ r ∈ h; ⊦ r ∈ h → r ≠ null; (s)
| (h1 ++ r)(r) = h2(r), h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r) ≠ hO2(r), !(hO2(r), hO2, r.=>_)(h0), !(hO2(r), hO2, hP)(h3), h0 ⊥ h3, h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h2, r.=>_(h0), r ∈ h3, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
⊦ h0 ⊥ h1 ↔ (∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h1)
h1 ++ r = h0 ∪ h3 ∪ h4, (h1 ++ r)(r) = h2(r), hO1(r) ≠ hO2(r), !(hO2(r), hO2, hP)(h3), !(hO2(r), hO2, r.=>_)(h0), h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h3, r.=>_(h0), r ∈ h2, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
Used terms: h3, h0
| ⊦ h0 ⊥ h1 ↔ (∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h1) |
| h1 ++ r = h0 ∪ h3 ∪ h4, (h1 ++ r)(r) = h2(r), hO1(r) ≠ hO2(r), !(hO2(r), hO2, hP)(h3), !(hO2(r), hO2, r.=>_)(h0), h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h3, r.=>_(h0), r ∈ h2, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
(h1 ++ r)(r) = h2(r), h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r) ≠ hO2(r), !(hO2(r), hO2, r.=>_)(h0), !(hO2(r), hO2, hP)(h3), h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h2, r.=>_(h0), r ∈ h3, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
Used terms: r
| (h1 ++ r)(r) = h2(r), h1 ++ r = h0 ∪ h3 ∪ h4, hO1(r) ≠ hO2(r), !(hO2(r), hO2, r.=>_)(h0), !(hO2(r), hO2, hP)(h3), h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h2, r.=>_(h0), r ∈ h3, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
h1 ++ r = h0 ∪ h3 ∪ h4, (h1 ++ r)(r) = h2(r), hO1(r) ≠ hO2(r), !(hO2(r), hO2, hP)(h3), !(hO2(r), hO2, r.=>_)(h0), h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h3, r.=>_(h0), r ∈ h2, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ r ∈ h0, ∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦
| h1 ++ r = h0 ∪ h3 ∪ h4, (h1 ++ r)(r) = h2(r), hO1(r) ≠ hO2(r), !(hO2(r), hO2, hP)(h3), !(hO2(r), hO2, r.=>_)(h0), h0 ⊥ h4, h3 ⊥ h4, hP(h3), hP0(h4), r ∈ h3, r.=>_(h0), r ∈ h2, ¬ (!(hO2(r), hO1, hP) * hP0)(h1), ¬ (!(hO2(r), hO1, hP) * hP0)(h3 ∪ h4), ¬ r ∈ h1, ¬ r ∈ h0, ∀ r. ¬ r ∈ h0 ∨ ¬ r ∈ h3, ∀ r1. ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) ↔ hO2(r1) = hO2(r)) ∧ ((r = r1 ⊃ hO2(r1);hO1(r1)) = hO2(r) → (r1 = r ∨ r1 ∈ h1 ↔ r1 ∈ h2) ∧ (r1 ∈ h1 → (h1 ++ r)(r1) = h2(r1))) ⊦ |
⊦ r.=>_ = _∃(λ o. r => o)
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s) precise(hP1) ⊦ hP1(h1) ∧ h0 ⊥ h1 → ((hP0 * hP1)(h0 ∪ h1) ↔ hP0(h0)); (s) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ (r => o)(h) → r ∈ h; (s) Used terms: r
| ⊦ r.=>_ = _∃(λ o. r => o) |
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.