| ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h) ⊦ ((adP0 ⊗_ st))(h) → ((adP ⊗_ st))(h) |
((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h) ⊦
| ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h) ⊦ |
((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h) ⊦
| ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h) ⊦ |
((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦
Used simplifier rules: <; (wellfounded) Used terms: # st
| ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦ |
((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦
| ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦ |
st ≠ ∅, ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦
Used simplifier rules: Sep-emp: ⊦ adP ⊗_ ∅ = emp; ⊦ emp(h) ↔ h = ∅; (s) Used formulas: st = ∅
| st ≠ ∅, ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦ |
⊦ st = ∅ ↔ ¬(∃ a, d, st0. st = st0[a, d] ∧ ¬ a ∈ st0)
((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∃ a, d, st0. st = st0[a, d] ∧ ¬ a ∈ st0, ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦
Used terms: st
| ⊦ st = ∅ ↔ ¬(∃ a, d, st0. st = st0[a, d] ∧ ¬ a ∈ st0) |
| ((adP0 ⊗_ st))(h), ¬ ((adP ⊗_ st))(h), ∀ a, h. a ∈ st ∧ adP0(a, st[a])(h) → adP(a, st[a])(h), ∃ a, d, st0. st = st0[a, d] ∧ ¬ a ∈ st0, ∀ st0, adP0, h, adP. # st0 < # st → ((adP0 ⊗_ st0))(h) ∧ ¬ ((adP ⊗_ st0))(h) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) → false ⊦ |
((adP0(a, d) * adP0 ⊗_ st0))(h), ¬ ((adP(a, d) * adP ⊗_ st0))(h), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦
Used simplifier rules: Sep-ins: ⊦ ¬ a ∈ st → adP ⊗_ st[a, d] = adP(a, d) * adP ⊗_ st;
| ((adP0(a, d) * adP0 ⊗_ st0))(h), ¬ ((adP(a, d) * adP ⊗_ st0))(h), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ |
⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
¬ ((adP(a, d) * adP ⊗_ st0))(h), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ adP0(a, d)(h0) ∧ ((adP0 ⊗_ st0))(h1), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦
Used terms: h, adP0 ⊗_ st0, adP0(a, d)
| ⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| ¬ ((adP(a, d) * adP ⊗_ st0))(h), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ adP0(a, d)(h0) ∧ ((adP0 ⊗_ st0))(h1), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ |
adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦
| adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ |
⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → ((hP0 * hP1))(h0 ∪ h1)
adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1) ∧ h0 ⊥ h1
Used terms: h1, h0, adP ⊗_ st0, adP(a, d)
| ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → ((hP0 * hP1))(h0 ∪ h1) |
| adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1) ∧ h0 ⊥ h1 |
adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1)
| adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1) |
adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1), ((adP0 ⊗_ st0))(h1) ∧ ¬ ((adP ⊗_ st0))(h1) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h))
Used simplifier rules: ⊦ ¬ a ∈ st → # st[a, d] = # st + 1; (s) ⊦ 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: st0, adP0, h1, adP
| adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1), ((adP0 ⊗_ st0))(h1) ∧ ¬ ((adP ⊗_ st0))(h1) ∧ (∀ a, h. a ∈ st0 ∧ adP0(a, st0[a])(h) → adP(a, st0[a])(h)) |
adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1), ¬ ((adP ⊗_ st0))(h1) ∧ (a0 ∈ st0 ∧ adP0(a0, st0[a0])(h) → adP(a0, st0[a0])(h))
| adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1), ¬ ((adP ⊗_ st0))(h1) ∧ (a0 ∈ st0 ∧ adP0(a0, st0[a0])(h) → adP(a0, st0[a0])(h)) |
adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, a ∈ st0[a, d] ∧ adP0(a, st0[a, d][a])(h0) → adP(a, st0[a, d][a])(h0), ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ ¬ ((adP ⊗_ st0))(h1) ∧ (a0 ∈ st0 ∧ adP0(a0, st0[a0])(h) → adP(a0, st0[a0])(h)), adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1)
Used terms: a, h0
| adP0(a, d)(h0), ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ a ∈ st0, a ∈ st0[a, d] ∧ adP0(a, st0[a, d][a])(h0) → adP(a, st0[a, d][a])(h0), ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ ¬ ((adP ⊗_ st0))(h1) ∧ (a0 ∈ st0 ∧ adP0(a0, st0[a0])(h) → adP(a0, st0[a0])(h)), adP(a, d)(h0) ∧ ((adP ⊗_ st0))(h1) |
adP(a, d)(h0), adP0(a, d)(h0), adP0(a0, st0[a0])(h), a0 ∈ st0, ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ adP(a0, st0[a0])(h), ¬ a ∈ st0, ¬ ((adP ⊗_ st0))(h1), ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦
Used simplifier rules: ⊦ st[a, d][a] = d; (s) ⊦ a ∈ st[a, d]; (s)
| adP(a, d)(h0), adP0(a, d)(h0), adP0(a0, st0[a0])(h), a0 ∈ st0, ((adP0 ⊗_ st0))(h1), h0 ⊥ h1, ¬ ((adP(a, d) * adP ⊗_ st0))(h0 ∪ h1), ¬ adP(a0, st0[a0])(h), ¬ a ∈ st0, ¬ ((adP ⊗_ st0))(h1), ∀ a0, h. a0 ∈ st0[a, d] ∧ adP0(a0, st0[a, d][a0])(h) → adP(a0, st0[a, d][a0])(h), ∀ st1, adP0, h, adP. # st1 < # st0[a, d] → ((adP0 ⊗_ st1))(h) ∧ ¬ ((adP ⊗_ st1))(h) ∧ (∀ a, h. a ∈ st1 ∧ adP0(a, st1[a])(h) → adP(a, st1[a])(h)) → false ⊦ |
Used simplifier rules: ⊦ b ∈ st ∧ ¬ a ∈ st → st[a, d][b] = st[b]; (s) precise(hP0) ⊦ hP0(h0) ∧ h0 ⊥ h1 → (((hP0 * hP1))(h0 ∪ h1) ↔ hP1(h1)); (s) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ a ∈ st[b, d] ↔ a = b ∨ a ∈ st; (ws) Used terms: a0, 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.