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