| ⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) |
⊦ trace(ioa)(⌜el⌝ ) ↔ trace*(ioa)(el)
⊦ trace(IOAut(start, step, ext))(⌜el⌝ ) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al))
Used terms: IOAut(start, step, ext), el
| ⊦ trace(ioa)(⌜el⌝ ) ↔ trace*(ioa)(el) |
| ⊦ trace(IOAut(start, step, ext))(⌜el⌝ ) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) |
⊦ trace(IOAut(start, step, ext))(β) ↔ (∃ σ, α. β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α))
⊦ (∃ σ, α. ⌜el⌝ = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α)) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al))
Used terms: start, step, ext, ⌜el⌝
| ⊦ trace(IOAut(start, step, ext))(β) ↔ (∃ σ, α. β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α)) |
| ⊦ (∃ σ, α. ⌜el⌝ = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α)) ↔ (∃ 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: exec: ⊦ exec(ioa)(σ, α) ↔ frag(ioa)(σ, α) ∧ ioa.start(σ[0]); 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])) |
∃ σ, α. ⌜el⌝ = ext !(α) ∧ frag(IOAut(start, step, ext))(σ, α) ∧ start(σ[0]) ⊦ ∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0])
∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0]) ⊦ ∃ σ, α. ⌜el⌝ = ext !(α) ∧ frag(IOAut(start, step, ext))(σ, α) ∧ start(σ[0])
| ∃ σ, α. ⌜el⌝ = ext !(α) ∧ frag(IOAut(start, step, ext))(σ, α) ∧ start(σ[0]) ⊦ ∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0]) |
⌜el⌝ = ext !(α), frag(IOAut(start, step, ext))(σ, α), start(σ[0]) ⊦ ∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0])
| ⌜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]), ∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(al) = el ∧ ext !(α0) = [] ⊦ ∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0])
Used terms: el, ext, α
| ⊦ ext !(α) = ⌜el⌝ ↔ (∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(al) = el ∧ ext !(α0) = []) |
| frag(IOAut(start, step, ext))(σ, α), start(σ[0]), ∃ al, α0. α = ⌜al⌝ + α0 ∧ ext !(al) = el ∧ ext !(α0) = [] ⊦ ∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0]) |
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])
| 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]) |
ext !(α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
| ext !(α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]) |
ext !(α0) = [], frag(IOAut(start, step, ext))(σ, ⌜al⌝ + α0), start(σ[0]) ⊦ frag*(IOAut(start, step, ext))(σ.take(# al + 1), al) ∧ start(σ.take(# al + 1)[0])
| ext !(α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)))
ext !(α0) = [], 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))) |
| ext !(α0) = [], 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⌝ < # σ |
ext !(α0) = [], 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)
| ext !(α0) = [], 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]))
ext !(α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 terms: ext, ⌜al⌝ + α0, step, start, σ
| ⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1])) |
| ext !(α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]) |
ext !(α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
| ext !(α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: ⊦ ⌜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
| ∃ sl, al. el = ext !(al) ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ start(sl[0]) ⊦ ∃ σ, α. ⌜el⌝ = ext !(α) ∧ frag(IOAut(start, step, ext))(σ, α) ∧ start(σ[0]) |
frag*(IOAut(start, step, ext))(sl, al), start(sl[0]) ⊦ ∃ σ, α. ⌜ext !(al)⌝ = ext !(α) ∧ frag(IOAut(start, step, ext))(σ, α) ∧ start(σ[0])
| frag*(IOAut(start, step, ext))(sl, al), start(sl[0]) ⊦ ∃ σ, α. ⌜ext !(al)⌝ = ext !(α) ∧ frag(IOAut(start, step, ext))(σ, α) ∧ start(σ[0]) |
Used simplifier rules: fragstar-def: ⊦ frag(ioa)(⌜sl⌝ , ⌜al⌝ ) ↔ frag*(ioa)(sl, al); ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ ⌜x⌝ = ⌜x0⌝ ↔ x = x0; (s) ⊦ ⌜x⌝ [n] = x[n]; (s) Used terms: ⌜sl⌝ , ⌜al⌝
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.