| h1 ≡ h0(r := o) ∧ r ∈ h0 ⊦ hP(h1) ↔ ((r => o -* hP) * r.=>_)(h0) |
¬(hP(h1) ↔ ((r => o -* hP) * r.=>_)(h0)), h1 ≡ h0(r := o), r ∈ h0 ⊦
| ¬(hP(h1) ↔ ((r => o -* hP) * r.=>_)(h0)), h1 ≡ h0(r := o), r ∈ h0 ⊦ |
¬(hP(h0(r := o)) ↔ ((r => o -* hP) * r.=>_)(h0)), r ∈ h0 ⊦
Used simplifier rules: eq: ⊦ h0 ≡ h1 ↔ h0 = h1;
| ¬(hP(h0(r := o)) ↔ ((r => o -* hP) * r.=>_)(h0)), r ∈ h0 ⊦ |
hP(h0(r := o)), r ∈ h0, ¬ ((r => o -* hP) * r.=>_)(h0) ⊦
r ∈ h0, ((r => o -* hP) * r.=>_)(h0), ¬ hP(h0(r := o)) ⊦
| hP(h0(r := o)), r ∈ h0, ¬ ((r => o -* hP) * r.=>_)(h0) ⊦ |
hP(h0(r := o)), r ∈ h0, ¬ ((r => o -* hP) * r.=>_)(h0) ⊦
| hP(h0(r := o)), r ∈ h0, ¬ ((r => o -* hP) * r.=>_)(h0) ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
hP(h0(r := o)), r ∈ h0, ∀ h1, h2. ¬(h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => o -* hP)(h1) ∧ r.=>_(h2)) ⊦
Used terms: h0, r.=>_, r => o -* hP
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| hP(h0(r := o)), r ∈ h0, ∀ h1, h2. ¬(h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => o -* hP)(h1) ∧ r.=>_(h2)) ⊦ |
⊦ r ≠ null → (r ∈ h ↔ (∃ h0, o. h = (h0 ++ r)(r := o) ∧ ¬ r ∈ h0))
r ≠ null, hP(h0(r := o)), ∀ h1, h2. ¬(h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => o -* hP)(h1) ∧ r.=>_(h2)), ∃ h1, o. h0 = (h1 ++ r)(r := o) ∧ ¬ r ∈ h1 ⊦
Used simplifier rules: ⊦ ¬ null ∈ h; (s) Used terms: h0, r
| ⊦ r ≠ null → (r ∈ h ↔ (∃ h0, o. h = (h0 ++ r)(r := o) ∧ ¬ r ∈ h0)) |
| r ≠ null, hP(h0(r := o)), ∀ h1, h2. ¬(h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => o -* hP)(h1) ∧ r.=>_(h2)), ∃ h1, o. h0 = (h1 ++ r)(r := o) ∧ ¬ r ∈ h1 ⊦ |
r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ∀ h, h2. ¬ h ⊥ h2 ∨ (h1 ++ r)(r := o0) ≠ h ∪ h2 ∨ ¬ (r => o -* hP)(h) ∨ ¬ r.=>_(h2) ⊦
Used simplifier rules: ⊦ h(r := o0)(r := o1) = h(r := o1); (s)
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ∀ h, h2. ¬ h ⊥ h2 ∨ (h1 ++ r)(r := o0) ≠ h ∪ h2 ∨ ¬ (r => o -* hP)(h) ∨ ¬ r.=>_(h2) ⊦ |
r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ¬ h1 ⊥ (∅ ++ r)(r := o0) ∨ (h1 ++ r)(r := o0) ≠ h1 ∪ (∅ ++ r)(r := o0) ∨ ¬ (r => o -* hP)(h1) ∨ ¬ r.=>_((∅ ++ r)(r := o0)) ⊦
Used terms: h1, (∅ ++ r)(r := o0)
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ¬ h1 ⊥ (∅ ++ r)(r := o0) ∨ (h1 ++ r)(r := o0) ≠ h1 ∪ (∅ ++ r)(r := o0) ∨ ¬ (r => o -* hP)(h1) ∨ ¬ r.=>_((∅ ++ r)(r := o0)) ⊦ |
r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ¬ (r => o -* hP)(h1) ∨ ¬ r.=>_((∅ ++ r)(r := o0)) ⊦
Used simplifier rules: ⊦ r ≠ null ∧ ¬ r ∈ h → h ∪ (∅ ++ r)(r := o) = (h ++ r)(r := o); (s) ⊦ h ⊥ ∅; (s) r ≠ null, ¬ r ∈ h1 ⊦ h0 ⊥ (h1 ++ r)(r := o) ↔ h0 ⊥ h1 ∧ ¬ r ∈ h0; (s) ⊦ ¬ r ∈ ∅; (s)
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ¬ (r => o -* hP)(h1) ∨ ¬ r.=>_((∅ ++ r)(r := o0)) ⊦ |
r ≠ null, hP((h1 ++ r)(r := o)), ¬ (r => o -* hP)(h1), ¬ r ∈ h1 ⊦
r ≠ null, hP((h1 ++ r)(r := o)), ¬ r.=>_((∅ ++ r)(r := o0)), ¬ r ∈ h1 ⊦
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ (r => o -* hP)(h1), ¬ r ∈ h1 ⊦ |
⊦ (hP0 -* hP1)(h) ↔ (∀ h1. h1 ⊥ h ∧ hP0(h1) → hP1(h1 ∪ h))
r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ∃ h0. ¬(h0 ⊥ h1 ∧ (r => o)(h0) → hP(h0 ∪ h1)) ⊦
Used terms: h1, hP, r => o
| ⊦ (hP0 -* hP1)(h) ↔ (∀ h1. h1 ⊥ h ∧ hP0(h1) → hP1(h1 ∪ h)) |
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ∃ h0. ¬(h0 ⊥ h1 ∧ (r => o)(h0) → hP(h0 ∪ h1)) ⊦ |
r ≠ null, h0 ⊥ h1, hP((h1 ++ r)(r := o)), (r => o)(h0), ¬ hP(h0 ∪ h1), ¬ r ∈ h1 ⊦
| r ≠ null, h0 ⊥ h1, hP((h1 ++ r)(r := o)), (r => o)(h0), ¬ hP(h0 ∪ h1), ¬ r ∈ h1 ⊦ |
⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null
Used simplifier rules: r ≠ null ⊦ (∅ ++ r)(r := o) ⊥ h ↔ ¬ r ∈ h; (s) ⊦ r ≠ null ∧ ¬ r ∈ h → (∅ ++ r)(r := o) ∪ h = (h ++ r)(r := o); (s) Used terms: h0, o, r
| ⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null |
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ r.=>_((∅ ++ r)(r := o0)), ¬ r ∈ h1 ⊦ |
⊦ r.=>_ = _∃(λ o. r => o)
r ≠ null, hP((h1 ++ r)(r := o)), ¬ (_∃(λ o. r => o))((∅ ++ r)(r := o0)), ¬ r ∈ h1 ⊦
Used terms: r
| ⊦ r.=>_ = _∃(λ o. r => o) |
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ (_∃(λ o. r => o))((∅ ++ r)(r := o0)), ¬ r ∈ h1 ⊦ |
r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1 ⊦ ∃ o. (r => o)((∅ ++ r)(r := o0))
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s)
| r ≠ null, hP((h1 ++ r)(r := o)), ¬ r ∈ h1 ⊦ ∃ o. (r => o)((∅ ++ r)(r := o0)) |
Used simplifier rules: ⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null; (ss) Used terms: o0
| r ∈ h0, ((r => o -* hP) * r.=>_)(h0), ¬ hP(h0(r := o)) ⊦ |
((r => o -* hP) * r.=>_)(h0), ¬ hP(h0(r := o)) ⊦
Used simplifier rules: ⊦ (r.=>_ * hP)(h) → r ∈ h; (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 -* hP) * r.=>_)(h0), ¬ hP(h0(r := o)) ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
¬ hP(h0(r := o)), ∃ h1, h2. h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => o -* hP)(h1) ∧ r.=>_(h2) ⊦
Used terms: h0, r.=>_, r => o -* hP
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| ¬ hP(h0(r := o)), ∃ h1, h2. h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => o -* hP)(h1) ∧ r.=>_(h2) ⊦ |
h1 ⊥ h2, (r => o -* hP)(h1), r.=>_(h2), ¬ hP((h1 ∪ h2)(r := o)) ⊦
| h1 ⊥ h2, (r => o -* hP)(h1), r.=>_(h2), ¬ hP((h1 ∪ h2)(r := o)) ⊦ |
⊦ r.=>_ = _∃(λ o. r => o)
(_∃(λ o. r => o))(h2), h1 ⊥ h2, (r => o -* hP)(h1), ¬ hP((h1 ∪ h2)(r := o)) ⊦
Used terms: r
| ⊦ r.=>_ = _∃(λ o. r => o) |
| (_∃(λ o. r => o))(h2), h1 ⊥ h2, (r => o -* hP)(h1), ¬ hP((h1 ∪ h2)(r := o)) ⊦ |
h1 ⊥ h2, (r => o -* hP)(h1), (r => o0)(h2), ¬ hP((h1 ∪ h2)(r := o)) ⊦
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s)
| h1 ⊥ h2, (r => o -* hP)(h1), (r => o0)(h2), ¬ hP((h1 ∪ h2)(r := o)) ⊦ |
⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null
h2 = (∅ ++ r)(r := o0), r ≠ null, h1 ⊥ h2, (r => o -* hP)(h1), ¬ hP((h1 ∪ h2)(r := o)) ⊦
Used terms: h2, o0, r
| ⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null |
| h2 = (∅ ++ r)(r := o0), r ≠ null, h1 ⊥ h2, (r => o -* hP)(h1), ¬ hP((h1 ∪ h2)(r := o)) ⊦ |
r ≠ null, (r => o -* hP)(h1), ¬ hP((h1 ++ r)(r := o)), ¬ r ∈ h1 ⊦
Used simplifier rules: ⊦ h(r := o0)(r := o1) = h(r := o1); (s) ⊦ r ≠ null ∧ ¬ r ∈ h → h ∪ (∅ ++ r)(r := o) = (h ++ r)(r := o); (s) ⊦ h ⊥ ∅; (s) r ≠ null, ¬ r ∈ h1 ⊦ h0 ⊥ (h1 ++ r)(r := o) ↔ h0 ⊥ h1 ∧ ¬ r ∈ h0; (s) ⊦ ¬ r ∈ ∅; (s)
| r ≠ null, (r => o -* hP)(h1), ¬ hP((h1 ++ r)(r := o)), ¬ r ∈ h1 ⊦ |
⊦ (hP0 -* hP1)(h) ↔ (∀ h1. h1 ⊥ h ∧ hP0(h1) → hP1(h1 ∪ h))
r ≠ null, ¬ hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ∀ h0. h0 ⊥ h1 ∧ (r => o)(h0) → hP(h0 ∪ h1) ⊦
Used terms: h1, hP, r => o
| ⊦ (hP0 -* hP1)(h) ↔ (∀ h1. h1 ⊥ h ∧ hP0(h1) → hP1(h1 ∪ h)) |
| r ≠ null, ¬ hP((h1 ++ r)(r := o)), ¬ r ∈ h1, ∀ h0. h0 ⊥ h1 ∧ (r => o)(h0) → hP(h0 ∪ h1) ⊦ |
Used simplifier rules: r ≠ null ⊦ (∅ ++ r)(r := o) ⊥ h ↔ ¬ r ∈ h; (s) ⊦ r ≠ null ∧ ¬ r ∈ h → (∅ ++ r)(r := o) ∪ h = (h ++ r)(r := o); (s) ⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null; (ss) Used terms: (∅ ++ r)(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.