| hP(∅), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]) ⊦ hP(h) |
hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r) ⊦
| hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r) ⊦ |
hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
Used simplifier rules: <; (wellfounded) Used terms: # h
| hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
h ≠ ∅, hP(∅), ¬ hP(h), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
Used formulas: h = ∅
| h ≠ ∅, hP(∅), ¬ hP(h), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
⊦ h0 = h1 ↔ (∀ r. (r ∈ h0 ↔ r ∈ h1) ∧ (r ∈ h0 → h0[r] = h1[r]))
hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∃ r. ¬((r ∈ h ↔ r ∈ ∅) ∧ (r ∈ h → h[r] = ∅[r])), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
Used terms: h, ∅
| ⊦ h0 = h1 ↔ (∀ r. (r ∈ h0 ↔ r ∈ h1) ∧ (r ∈ h0 → h0[r] = h1[r])) |
| hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∃ r. ¬((r ∈ h ↔ r ∈ ∅) ∧ (r ∈ h → h[r] = ∅[r])), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
hP(∅), r ∈ h, ¬ hP(h), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
Used simplifier rules: in-emp: ⊦ ¬ r ∈ ∅;
| hP(∅), r ∈ h, ¬ hP(h), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
⊦ r ≠ null → (r ∈ h ↔ (∃ h0, o. h = (h0 ++ r)[r, o] ∧ ¬ r ∈ h0))
r ≠ null, hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∃ h0, o. h = (h0 ++ r)[r, o] ∧ ¬ r ∈ h0, ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
Used simplifier rules: sanity: ⊦ ¬ null ∈ h; Used terms: r, h
| ⊦ r ≠ null → (r ∈ h ↔ (∃ h0, o. h = (h0 ++ r)[r, o] ∧ ¬ r ∈ h0)) |
| r ≠ null, hP(∅), ¬ hP(h), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∃ h0, o. h = (h0 ++ r)[r, o] ∧ ¬ r ∈ h0, ∀ h0, hP. # h0 < # h → hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
r ≠ null, hP(∅), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
| r ≠ null, hP(∅), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
r ≠ null, hP(∅), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r))
Used simplifier rules: in-alloc: r0 ≠ null, ¬ r0 ∈ h ⊦ r ∈ h ++ r0 ↔ r = r0 ∨ r ∈ h; size-write: r ∈ h ⊦ # h[r, o] = # h; size-alloc: ¬ r ∈ h, r ≠ null ⊦ #(h ++ r) = # h + 1; ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ ¬ n < n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: h0, hP
| r ≠ null, hP(∅), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ hP(∅) ∧ ¬ hP(h0) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) |
r ≠ null, hP(∅), hP(h0), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
| r ≠ null, hP(∅), hP(h0), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
r ≠ null, hP(h0), hP(∅), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, hP(h0) ∧ ¬ r ∈ h0 ∧ r ≠ null → hP(h0 ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
Used terms: h0, r
| r ≠ null, hP(h0), hP(∅), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, hP(h0) ∧ ¬ r ∈ h0 ∧ r ≠ null → hP(h0 ++ r), ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
r ≠ null, hP(∅), hP(h0), hP(h0 ++ r), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦
| r ≠ null, hP(∅), hP(h0), hP(h0 ++ r), ¬ hP((h0 ++ r)[r, o]), ¬ r ∈ h0, ∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o]), ∀ h1, hP. # h1 < # (h0 ++ r)[r, o] → hP(∅) ∧ ¬ hP(h1) ∧ (∀ h, r, o. hP(h) ∧ r ∈ h → hP(h[r, o])) ∧ (∀ h, r. hP(h) ∧ ¬ r ∈ h ∧ r ≠ null → hP(h ++ r)) → false ⊦ |
Used simplifier rules: in-alloc: r0 ≠ null, ¬ r0 ∈ h ⊦ r ∈ h ++ r0 ↔ r = r0 ∨ r ∈ h; Used terms: h0 ++ 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.