| h0 ⊆ h, h1 ⊆ h, dll(r, r0, x)(h0), dll(r, r0, x0)(h1) ⊦ x0 = x |
x0 ≠ x, dll(r, r0, x0)(h1), dll(r, r0, x)(h0), h0 ⊆ h, h1 ⊆ h ⊦
| x0 ≠ x, dll(r, r0, x0)(h1), dll(r, r0, x)(h0), h0 ⊆ h, h1 ⊆ h ⊦ |
x0 ≠ x, dll(r, r0, x)(h0), dll(r, r0, x0)(h1), h0 ⊆ h, h1 ⊆ h ⊦
| x0 ≠ x, dll(r, r0, x)(h0), dll(r, r0, x0)(h1), h0 ⊆ h, h1 ⊆ h ⊦ |
x0 ≠ a + x1, dll(r, r0, x0)(h1), dll(r, r0, a + x1)(h0), h0 ⊆ h, h1 ⊆ h, ∀ x0, r, r0, h0, h1, h. ¬(x0 ≠ x1 ∧ dll(r, r0, x1)(h0) ∧ dll(r, r0, x0)(h1) ∧ h0 ⊆ h ∧ h1 ⊆ h) ⊦
Used simplifier rules: dll-base: ⊦ dll(r, r0, []) = (emp ∧ ⌜r = null⌝ ); dll-prev-null: ⊦ dll(null, r, x) = (emp ∧ ⌜x = []⌝ ); List[A] freely generated by [], +; ⊦ (hP0 ∧ hP1)(h) ↔ hP0(h) ∧ hP1(h); (s) ⊦ emp(h) ↔ h = ∅; (s) ⊦ ⌜bv⌝ (h) ↔ bv; (s) ⊦ ∅ ⊆ h; (s) ⊦ ⌜false⌝ = false; (s) ⊦ (false ∧ hP) = false; (s) and-ass: ⊦ ((hP0 ∧ hP1) ∧ hP2) = (hP0 ∧ hP1 ∧ hP2); from specification heap-sep and-com: ⊦ (hP0 ∧ hP1) = (hP1 ∧ hP0); from specification heap-sep ⊦ ¬ false(h); (s)
| x0 ≠ a + x1, dll(r, r0, x0)(h1), dll(r, r0, a + x1)(h0), h0 ⊆ h, h1 ⊆ h, ∀ x0, r, r0, h0, h1, h. ¬(x0 ≠ x1 ∧ dll(r, r0, x1)(h0) ∧ dll(r, r0, x0)(h1) ∧ h0 ⊆ h ∧ h1 ⊆ h) ⊦ |
x0 ≠ a ' + x1, dll(r, r0, x0)(h1), h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: dll-rec: ⊦ dll(r, r0, a ' + x) = _∃(λ r1. r => mknode(r0, a, r1) * dll(r1, r, x)); ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s)
| x0 ≠ a ' + x1, dll(r, r0, x0)(h1), h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
x0 = a0 + x2, x0 ≠ a ' + x1, dll(r, r0, x0)(h1), h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: dll-base: ⊦ dll(r, r0, []) = (emp ∧ ⌜r = null⌝ ); List[A] freely generated by [], +; ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (hP0 ∧ hP1)(h) ↔ hP0(h) ∧ hP1(h); (s) ⊦ emp(h) ↔ h = ∅; (s) ⊦ ⌜bv⌝ (h) ↔ bv; (s) and-ass: ⊦ ((hP0 ∧ hP1) ∧ hP2) = (hP0 ∧ hP1 ∧ hP2); from specification heap-sep and-com: ⊦ (hP0 ∧ hP1) = (hP1 ∧ hP0); from specification heap-sep ⊦ ∅ ⊆ h; (s) ⊦ null => o = ⌜false⌝ ; (s) ⊦ ⌜false⌝ = false; (s) ⊦ false * hP = false; (s) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ ¬ false(h); (s)
| x0 = a0 + x2, x0 ≠ a ' + x1, dll(r, r0, x0)(h1), h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
a0 ' + x2 ≠ a ' + x1, h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), (r => mknode(r0, a0, r2) * dll(r2, r, x2))(h1), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: dll-rec: ⊦ dll(r, r0, a ' + x) = _∃(λ r1. r => mknode(r0, a, r1) * dll(r1, r, x)); ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s)
| a0 ' + x2 ≠ a ' + x1, h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), (r => mknode(r0, a0, r2) * dll(r2, r, x2))(h1), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y
h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a0, r2) * dll(r2, r, x2))(h1), (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used terms: a0, x2, a, x1
| ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y |
| h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a0, r2) * dll(r2, r, x2))(h1), (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), ∃ h0, h2. h0 ⊥ h2 ∧ h1 = h0 ∪ h2 ∧ (r => mknode(r0, a0, r2))(h0) ∧ dll(r2, r, x2)(h2), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used terms: h1, r => mknode(r0, a0, r2), dll(r2, r, x2)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| h0 ⊆ h, h1 ⊆ h, (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), ∃ h0, h2. h0 ⊥ h2 ∧ h1 = h0 ∪ h2 ∧ (r => mknode(r0, a0, r2))(h0) ∧ dll(r2, r, x2)(h2), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
dll(r2, r, x2)(h3), h0 ⊆ h, h2 ⊥ h3, h2 ⊆ h, h3 ⊆ h, (r => mknode(r0, a0, r2))(h2), (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: ⊦ h0 ⊥ h1 → (h0 ∪ h1 ⊆ h ↔ h0 ⊆ h ∧ h1 ⊆ h); (ws)
| dll(r2, r, x2)(h3), h0 ⊆ h, h2 ⊥ h3, h2 ⊆ h, h3 ⊆ h, (r => mknode(r0, a0, r2))(h2), (r => mknode(r0, a, r1) * dll(r1, r, x1))(h0), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
dll(r2, r, x2)(h3), h0 ⊆ h, h2 ⊆ h, h2 ⊥ h3, h3 ⊆ h, (r => mknode(r0, a0, r2))(h2), ∃ h1, h2. h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => mknode(r0, a, r1))(h1) ∧ dll(r1, r, x1)(h2), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used terms: h0, r => mknode(r0, a, r1), dll(r1, r, x1)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| dll(r2, r, x2)(h3), h0 ⊆ h, h2 ⊆ h, h2 ⊥ h3, h3 ⊆ h, (r => mknode(r0, a0, r2))(h2), ∃ h1, h2. h1 ⊥ h2 ∧ h0 = h1 ∪ h2 ∧ (r => mknode(r0, a, r1))(h1) ∧ dll(r1, r, x1)(h2), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h1 ⊥ h4, h1 ⊆ h, h2 ⊥ h3, h2 ⊆ h, h3 ⊆ h, h4 ⊆ h, (r => mknode(r0, a, r1))(h1), (r => mknode(r0, a0, r2))(h2), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: ⊦ h0 ⊥ h1 → (h0 ∪ h1 ⊆ h ↔ h0 ⊆ h ∧ h1 ⊆ h); (ws)
| dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h1 ⊥ h4, h1 ⊆ h, h2 ⊥ h3, h2 ⊆ h, h3 ⊆ h, h4 ⊆ h, (r => mknode(r0, a, r1))(h1), (r => mknode(r0, a0, r2))(h2), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null
h2 = (∅ ++ r)(r := mknode(r0, a0, r2)), r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h1 ⊆ h, h1 ⊥ h4, h2 ⊆ h, h2 ⊥ h3, h3 ⊆ h, h4 ⊆ h, (r => mknode(r0, a, r1))(h1), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used terms: r, mknode(r0, a0, r2), h2
| ⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null |
| h2 = (∅ ++ r)(r := mknode(r0, a0, r2)), r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h1 ⊆ h, h1 ⊥ h4, h2 ⊆ h, h2 ⊥ h3, h3 ⊆ h, h4 ⊆ h, (r => mknode(r0, a, r1))(h1), a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h1 ⊥ h4, h1 ⊆ h, h3 ⊆ h, h4 ⊆ h, (r => mknode(r0, a, r1))(h1), (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: r ≠ null ⊦ (∅ ++ r)(r := o) ⊥ h ↔ ¬ r ∈ h; (s)
| r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h1 ⊥ h4, h1 ⊆ h, h3 ⊆ h, h4 ⊆ h, (r => mknode(r0, a, r1))(h1), (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null
h1 = (∅ ++ r)(r := mknode(r0, a, r1)), r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h1 ⊆ h, h1 ⊥ h4, h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used terms: r, mknode(r0, a, r1), h1
| ⊦ (r => o)(h) ↔ h = (∅ ++ r)(r := o) ∧ r ≠ null |
| h1 = (∅ ++ r)(r := mknode(r0, a, r1)), r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h1 ⊆ h, h1 ⊥ h4, h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a, r1)) ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
Used simplifier rules: r ≠ null ⊦ (∅ ++ r)(r := o) ⊥ h ↔ ¬ r ∈ h; (s)
| r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a, r1)) ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
a = a0, r2 = r1, r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, (∅ ++ r)(r := mknode(r0, a, r1)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, (∅ ++ r)(r := mknode(r0, a, r1)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1
Used formulas: a = a0 ∧ r2 = r1
| a = a0, r2 = r1, r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, (∅ ++ r)(r := mknode(r0, a, r1)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
r ≠ null, x1 ≠ x2, dll(r1, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r1)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦
| r ≠ null, x1 ≠ x2, dll(r1, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r1)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ |
Used terms: x2, r1, r, h4, h3, h
| r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, (∅ ++ r)(r := mknode(r0, a, r1)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1 |
⊦ h0 ⊆ h1 ↔ (∀ r. (r ∈ h0 → r ∈ h1) ∧ (r ∈ h0 → h0(r) = h1(r)))
r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ r2. (r2 ∈ (∅ ++ r)(r := mknode(r0, a, r1)) → r2 ∈ h) ∧ (r2 ∈ (∅ ++ r)(r := mknode(r0, a, r1)) → (∅ ++ r)(r := mknode(r0, a, r1))(r2) = h(r2)), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1
Used terms: (∅ ++ r)(r := mknode(r0, a, r1)), h
| ⊦ h0 ⊆ h1 ↔ (∀ r. (r ∈ h0 → r ∈ h1) ∧ (r ∈ h0 → h0(r) = h1(r))) |
| r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ r2. (r2 ∈ (∅ ++ r)(r := mknode(r0, a, r1)) → r2 ∈ h) ∧ (r2 ∈ (∅ ++ r)(r := mknode(r0, a, r1)) → (∅ ++ r)(r := mknode(r0, a, r1))(r2) = h(r2)), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1 |
r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ r3. (r3 = r → r ∈ h) ∧ (r3 = r → mknode(r0, a, r1) = h(r)), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1
Used simplifier rules: r0 ≠ null, ¬ r0 ∈ h ⊦ r ∈ h ++ r0 ↔ r = r0 ∨ r ∈ h; (s) ⊦ ¬ r ∈ ∅; (s) ⊦ h(r0 := o)(r) = (r = r0 ∧ r0 ∈ h ⊃ o;h(r)); (s) ⊦ r ∈ h(r0 := o) ↔ r ∈ h; (s)
| r ≠ null, dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ r3. (r3 = r → r ∈ h) ∧ (r3 = r → mknode(r0, a, r1) = h(r)), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1 |
r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, r = r → r ∈ h, r = r → mknode(r0, a, r1) = h(r), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1
Used terms: r
| r ≠ null, dll(r2, r, x2)(h3), dll(r1, r, x1)(h4), h3 ⊆ h, h4 ⊆ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, r = r → r ∈ h, r = r → mknode(r0, a, r1) = h(r), ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1 |
mknode(r0, a, r1) = h(r), dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, r ∈ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1
Used simplifier rules: ⊦ r ∈ h → r ≠ null; (s)
| mknode(r0, a, r1) = h(r), dll(r1, r, x1)(h4), dll(r2, r, x2)(h3), h3 ⊆ h, h4 ⊆ h, r ∈ h, (∅ ++ r)(r := mknode(r0, a0, r2)) ⊆ h, ¬ r ∈ h3, ¬ r ∈ h4, a ≠ a0 ∨ x1 ≠ x2, ∀ x, r2, r3, h2, h3, h4. x = x1 ∨ ¬ dll(r2, r3, x1)(h2) ∨ ¬ dll(r2, r3, x)(h3) ∨ ¬ h2 ⊆ h4 ∨ ¬ h3 ⊆ h4 ⊦ a = a0 ∧ r2 = r1 |
⊦ h0 ⊆ h1 ↔ (∀ r. (r ∈ h0 → r ∈ h1) ∧ (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) ⊦ mknode(left, val, left0) = mknode(left1, val0, left2) ↔ left = left1 ∧ val = val0 ∧ left0 = left2; (ws) Used terms: (∅ ++ r)(r := mknode(r0, a0, r2)), h
| ⊦ h0 ⊆ h1 ↔ (∀ r. (r ∈ h0 → r ∈ h1) ∧ (r ∈ h0 → h0(r) = h1(r))) |
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.