| ⊦ af(r) ≠ o ∧ r ≠ null → ((o[lst(r)] * hR)[rs, cf, af] ↔ false) |
¬((o[lst(r)] * hR)[rs, cf, af] ↔ false), af(r) ≠ o, r ≠ null ⊦
| ¬((o[lst(r)] * hR)[rs, cf, af] ↔ false), af(r) ≠ o, r ≠ null ⊦ |
af(r) ≠ o, r ≠ null, (o[_∃(λ x. ls(r, x))] * hR)[rs, cf, af] ⊦
Used simplifier rules: lst-rec: ⊦ r ≠ null → lst(r) = _∃(λ x. ls(r, x));
| af(r) ≠ o, r ≠ null, (o[_∃(λ x. ls(r, x))] * hR)[rs, cf, af] ⊦ |
⊦ (o[_∃ xv] * hR)[rs, cf, af] ↔ (∃ x. (o[xv(x)] * hR)[rs, cf, af])
af(r) ≠ o, r ≠ null, ∃ x. (o[ls(r, x)] * hR)[rs, cf, af] ⊦
Used terms: hR, cf, λ x. ls(r, x), rs, af, o
| ⊦ (o[_∃ xv] * hR)[rs, cf, af] ↔ (∃ x. (o[xv(x)] * hR)[rs, cf, af]) |
| af(r) ≠ o, r ≠ null, ∃ x. (o[ls(r, x)] * hR)[rs, cf, af] ⊦ |
af(r) ≠ o, r ≠ null, (o[ls(r, x)] * hR)[rs, cf, af] ⊦
| af(r) ≠ o, r ≠ null, (o[ls(r, x)] * hR)[rs, cf, af] ⊦ |
⊦ (hR0 * hR1)[rs, f, g] ↔ (∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ hR0[rs0, f, g] ∧ hR1[rs1, f, g])
af(r) ≠ o, r ≠ null, ∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ o[ls(r, x)][rs0, cf, af] ∧ hR[rs1, cf, af] ⊦
Used terms: cf, rs, hR, af, o[ls(r, x)]
| ⊦ (hR0 * hR1)[rs, f, g] ↔ (∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ hR0[rs0, f, g] ∧ hR1[rs1, f, g]) |
| af(r) ≠ o, r ≠ null, ∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ o[ls(r, x)][rs0, cf, af] ∧ hR[rs1, cf, af] ⊦ |
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, o[ls(r, x)][rs0, cf, af], hR[rs1, cf, af] ⊦
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, o[ls(r, x)][rs0, cf, af], hR[rs1, cf, af] ⊦ |
⊦ hR[rs, f, g] ↔ hR(mk(rs, f, g))
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], o[ls(r, x)](mk(rs0, cf, af)) ⊦
Used terms: o[ls(r, x)], rs0, cf, af
| ⊦ hR[rs, f, g] ↔ hR(mk(rs, f, g)) |
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], o[ls(r, x)](mk(rs0, cf, af)) ⊦ |
⊦ a[hP](mk(rs, f, g)) ↔ hP(mk(rs, f)) ∧ (∀ r. r ∈ rs → g(r) = a)
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ∀ r. r ∈ rs0 → af(r) = o ⊦
Used terms: cf, o, ls(r, x), rs0, af
| ⊦ a[hP](mk(rs, f, g)) ↔ hP(mk(rs, f)) ∧ (∀ r. r ∈ rs → g(r) = a) |
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ∀ r. r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ∀ r. r ∈ rs0 → af(r) = o ⊦
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ∀ r. r ∈ rs0 → af(r) = o ⊦ |
x = a + x0, rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ∀ r. r ∈ rs0 → af(r) = o ⊦
Used simplifier rules: ls-base: ⊦ ls(r, []) = (emp ∧ ⌜r = null⌝ ); list freely generated by [], +;; ⊦ ⌜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)
| x = a + x0, rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ∀ r. r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], ∀ r. r ∈ rs0 → af(r) = o ⊦
Used simplifier rules: ls-rec: ⊦ ls(r, a ' + x) = _∃(λ r0. r => a × r0 * ls(r0, x)); ⊦ (_∃ rP)(h) ↔ (∃ r. rP(r)(h)); (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s)
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], ∀ r. r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], r ∈ rs0 → af(r) = o ⊦
Used terms: r
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], ¬ r ∈ rs0 ⊦
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], ¬ r ∈ rs0 ⊦ |
⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ¬ r ∈ rs0, ∃ h0, h1. h0 ⊥ h1 ∧ mk(rs0, cf) = h0 ∪ h1 ∧ ((r => a × r0))(h0) ∧ ls(r0, x0)(h1) ⊦
Used terms: mk(rs0, cf), ls(r0, x0), r => a × r0
| ⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, hR[rs1, cf, af], ¬ r ∈ rs0, ∃ h0, h1. h0 ⊥ h1 ∧ mk(rs0, cf) = h0 ∪ h1 ∧ ((r => a × r0))(h0) ∧ ls(r0, x0)(h1) ⊦ |
mk(rs0, cf) = h0 ∪ h1, rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0 ⊦
| mk(rs0, cf) = h0 ∪ h1, rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0 ⊦ |
⊦ h0 = h1 ↔ (∀ r. (r ∈ h0 ↔ r ∈ h1) ∧ (r ∈ h0 → h0[r] = h1[r]))
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ∀ r. (r ∈ mk(rs0, cf) ↔ r ∈ h0 ∪ h1) ∧ (r ∈ mk(rs0, cf) → mk(rs0, cf)[r] = (h0 ∪ h1)[r]) ⊦
Used terms: h0 ∪ h1, mk(rs0, cf)
| ⊦ h0 = h1 ↔ (∀ r. (r ∈ h0 ↔ r ∈ h1) ∧ (r ∈ h0 → h0[r] = h1[r])) |
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ∀ r. (r ∈ mk(rs0, cf) ↔ r ∈ h0 ∪ h1) ∧ (r ∈ mk(rs0, cf) → mk(rs0, cf)[r] = (h0 ∪ h1)[r]) ⊦ |
rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ∀ r1. (r1 ∈ rs0 ↔ r1 ∈ h0 ∨ r1 ∈ h1) ∧ (r1 ∈ rs0 → cf(r1) = (h0 ∪ h1)[r1]) ⊦
Used simplifier rules: ⊦ r ∈ rs → mk(rs, f)[r] = f(r); (s) ⊦ r ∈ mk(rs, f) ↔ r ∈ rs; (s) ⊦ h0 ⊥ h1 → (r ∈ h0 ∪ h1 ↔ r ∈ h0 ∨ r ∈ h1); (s)
| rs0 ∩ rs1 = ∅, af(r) ≠ o, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ∀ r1. (r1 ∈ rs0 ↔ r1 ∈ h0 ∨ r1 ∈ h1) ∧ (r1 ∈ rs0 → cf(r1) = (h0 ∪ h1)[r1]) ⊦ |
Used simplifier rules: ⊦ ((r => o))(h) → r ∈ h; (s) Used terms: 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.