| ⊦ trace(IOAut(start, step, ext))(⌜el⌝ + β) → (trace*(IOAut(start, step, ext))(el) ↔ true) |
¬(trace*(IOAut(start, step, ext))(el) ↔ true), trace(IOAut(start, step, ext))(⌜el⌝ + β) ⊦
| ¬(trace*(IOAut(start, step, ext))(el) ↔ true), trace(IOAut(start, step, ext))(⌜el⌝ + β) ⊦ |
trace(IOAut(start, step, ext))(⌜el⌝ + β), ¬ trace*(IOAut(start, step, ext))(el) ⊦
| trace(IOAut(start, step, ext))(⌜el⌝ + β), ¬ trace*(IOAut(start, step, ext))(el) ⊦ |
⊦ trace(IOAut(start, step, ext))(β) ↔ (∃ σ, α. β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α))
¬ trace*(IOAut(start, step, ext))(el), ∃ σ, α. ⌜el⌝ + β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α) ⊦
Used terms: start, step, ext, ⌜el⌝ + β
| ⊦ trace(IOAut(start, step, ext))(β) ↔ (∃ σ, α. β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α)) |
| ¬ trace*(IOAut(start, step, ext))(el), ∃ σ, α. ⌜el⌝ + β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α) ⊦ |
⌜el⌝ + β = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ¬ trace*(IOAut(start, step, ext))(el) ⊦
Used simplifier rules: exec: ⊦ exec(ioa)(σ, α) ↔ frag(ioa)(σ, α) ∧ ioa.start(σ[0]); ⊦ IOAut(start, step, ext).start = start; (s)
| ⌜el⌝ + β = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ¬ trace*(IOAut(start, step, ext))(el) ⊦ |
⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al))
⌜el⌝ + β = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∀ sl, al. ¬(el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) ⊦
Used terms: start, step, ext, el
| ⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) |
| ⌜el⌝ + β = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∀ sl, al. ¬(el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) ⊦ |
⌜el⌝ + β = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: finexec: ⊦ exec*(ioa)(sl, al) ↔ frag*(ioa)(sl, al) ∧ ioa.start(sl[0]); ⊦ IOAut(start, step, ext).start = start; (s)
| ⌜el⌝ + β = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
⊦ ext !(α) = ⌜el⌝ + β ↔ (∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(⌜al⌝ ) = ⌜el⌝ ∧ ext !(α0) = β)
frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(⌜al⌝ ) = ⌜el⌝ ∧ ext !(α0) = β ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: ext, α, el, β
| ⊦ ext !(α) = ⌜el⌝ + β ↔ (∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(⌜al⌝ ) = ⌜el⌝ ∧ ext !(α0) = β) |
| frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(⌜al⌝ ) = ⌜el⌝ ∧ ext !(α0) = β ⊦ |
frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ∀ sl, al0. ext !(al) ≠ ext !(al0) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al0) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ ⌜x⌝ = ⌜x0⌝ ↔ x = x0; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ∀ sl, al0. ext !(al) ≠ ext !(al0) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al0) ∨ ¬ start(sl[0]) ⊦ |
frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ext !(al) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦
Used terms: σ.take(# al + 1), al
| frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ext !(al) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ |
frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦
| frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ |
⊦ ¬ # α < ⌜n⌝ ∧ ⌜n⌝ < # σ → ( frag(IOAut(start, step, ext))(σ, α) ↔ frag*(IOAut(start, step, ext))(σ.take(n + 1), α.take(n)) ∧ frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)))
frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ ¬ #(⌜al⌝ + α0) < ⌜# al⌝ ∧ ⌜# al⌝ < # σ
Used simplifier rules: ⊦ (⌜x⌝ + σ).take(# x) = x; (s) ⊦ (⌜x⌝ + σ).drop(# x) = σ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ ¬ n∞ + n∞1 < n∞1; (s) ⊦ 0 < m ↔ m ≠ 0; (s) ⊦ m + 1 ≠ 0; (s) ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ # σ < ⌜n⌝ + ⌜1⌝ ↔ ¬ ⌜n⌝ < # σ; (s) add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf m < n, ¬ # σ < ⌜n⌝ ⊦ σ.take(n)[m] = σ[m]; (s) Used terms: ext, # al, ⌜al⌝ + α0, step, start, σ
| ⊦ ¬ # α < ⌜n⌝ ∧ ⌜n⌝ < # σ → ( frag(IOAut(start, step, ext))(σ, α) ↔ frag*(IOAut(start, step, ext))(σ.take(n + 1), α.take(n)) ∧ frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n))) |
| frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ ¬ #(⌜al⌝ + α0) < ⌜# al⌝ ∧ ⌜# al⌝ < # σ |
frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ¬ ⌜# al⌝ < # σ, ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦
Used simplifier rules: add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ¬ n∞ + n∞1 < n∞1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]), ¬ ⌜# al⌝ < # σ, ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ |
⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1]))
# σ = #(⌜al⌝ + α0) + ⌜1⌝ , start(σ[0]), ¬ ⌜# al⌝ < # σ, ∀ n. ⌜n⌝ < #(⌜al⌝ + α0) → step(σ[n], (⌜al⌝ + α0)[n], σ[n +1]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦
Used terms: ext, ⌜al⌝ + α0, step, start, σ
| ⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1])) |
| # σ = #(⌜al⌝ + α0) + ⌜1⌝ , start(σ[0]), ¬ ⌜# al⌝ < # σ, ∀ n. ⌜n⌝ < #(⌜al⌝ + α0) → step(σ[n], (⌜al⌝ + α0)[n], σ[n +1]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ |
# σ = (⌜# al⌝ + # α0) + ⌜1⌝ , start(σ[0]), ¬ ⌜# al⌝ < # σ, ∀ n. ⌜n⌝ < ⌜# al⌝ + # α0 → step(σ[n], (⌜al⌝ + α0)[n], σ[n + 1]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦
Used simplifier rules: ⊦ m +1 = m + 1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf
| # σ = (⌜# al⌝ + # α0) + ⌜1⌝ , start(σ[0]), ¬ ⌜# al⌝ < # σ, ∀ n. ⌜n⌝ < ⌜# al⌝ + # α0 → step(σ[n], (⌜al⌝ + α0)[n], σ[n + 1]), ¬ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∨ ¬ start(σ.take(# al + 1)[0]) ⊦ |
Used simplifier rules: ⊦ ⌜n⌝ < ⌜1⌝ + n∞ ↔ ¬ n∞ < ⌜n⌝ ; (s) ⊦ ¬ n∞ + n∞1 < n∞1; (s) add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf
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.