| ⊦ pfxclosed(trace*(ioa)) |
¬ pfxclosed(trace*(ioa)) ⊦
| ¬ pfxclosed(trace*(ioa)) ⊦ |
⊦ pfxclosed(alp) ↔ (∀ al1, al2. alp(al2) ∧ al1 ⊑ al2 → alp(al1))
∃ el, el0. ¬(trace*(ioa)(el0) ∧ el ⊑ el0 → trace*(ioa)(el)) ⊦
Used terms: trace*(ioa)
| ⊦ pfxclosed(alp) ↔ (∀ al1, al2. alp(al2) ∧ al1 ⊑ al2 → alp(al1)) |
| ∃ el, el0. ¬(trace*(ioa)(el0) ∧ el ⊑ el0 → trace*(ioa)(el)) ⊦ |
trace*(ioa)(el0), el ⊑ el0, ¬ trace*(ioa)(el) ⊦
| trace*(ioa)(el0), el ⊑ el0, ¬ trace*(ioa)(el) ⊦ |
⊦ x ⊑ y ↔ (∃ z. x + z = y)
trace*(ioa)(el0), ¬ trace*(ioa)(el), ∃ z. el + z = el0 ⊦
Used terms: el, el0
| ⊦ x ⊑ y ↔ (∃ z. x + z = y) |
| trace*(ioa)(el0), ¬ trace*(ioa)(el), ∃ z. el + z = el0 ⊦ |
trace*(ioa)(el + el1), ¬ trace*(ioa)(el) ⊦
| trace*(ioa)(el + el1), ¬ trace*(ioa)(el) ⊦ |
ioa = IOAut(start, step, ext), trace*(ioa)(el + el1), ¬ trace*(ioa)(el) ⊦
Used simplifier rules: IOAutomaton('s, 'a, 'e) freely generated by IOAut;;
| ioa = IOAut(start, step, ext), trace*(ioa)(el + el1), ¬ trace*(ioa)(el) ⊦ |
trace*(IOAut(start, step, ext))(el + el1), ¬ trace*(IOAut(start, step, ext))(el) ⊦
| trace*(IOAut(start, step, ext))(el + el1), ¬ trace*(IOAut(start, step, ext))(el) ⊦ |
⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al))
trace*(IOAut(start, step, ext))(el + el1), ∀ 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)) |
| trace*(IOAut(start, step, ext))(el + el1), ∀ sl, al. ¬(el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) ⊦ |
trace*(IOAut(start, step, ext))(el + el1), ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).start = start; (s) ⊦ exec*(ioa)(sl, al) ↔ frag*(ioa)(sl, al) ∧ ioa.start(sl[0]); (s)
| trace*(IOAut(start, step, ext))(el + el1), ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al))
∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∃ sl, al. el + el1 = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al) ⊦
Used terms: start, step, ext, el + el1
| ⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) |
| ∀ sl, al. el ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∃ sl, al. el + el1 = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al) ⊦ |
el + el1 = 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]) ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).start = start; (s) ⊦ exec*(ioa)(sl, al) ↔ frag*(ioa)(sl, al) ∧ ioa.start(sl[0]); (s)
| el + el1 = 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]) ⊦ |
⊦ ext !(al) = el + el0 ↔ (∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el0)
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]), ∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el1 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: ext, al, el, el1
| ⊦ ext !(al) = el + el0 ↔ (∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el0) |
| 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]), ∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el1 ⊦ |
frag*(IOAut(start, step, ext))(sl, al1 + al0), start(sl[0]), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
| frag*(IOAut(start, step, ext))(sl, al1 + al0), start(sl[0]), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
⊦ ¬ # al < n ∧ n < # sl → ( frag*(IOAut(start, step, ext))(sl, al) ↔ frag*(IOAut(start, step, ext))(sl.take(n + 1), al.take(n)) ∧ frag*(IOAut(start, step, ext))(sl.drop(n), al.drop(n)))
frag*(IOAut(start, step, ext))(sl, al1 + al0), start(sl[0]), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ ¬ #(al1 + al0) < # al1 ∧ # al1 < # sl
# al1 < # sl, frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), (al1 + al0).take(# al1)), frag*(IOAut(start, step, ext))(sl.drop(# al1), (al1 + al0).drop(# al1)), start(sl[0]), ¬ #(al1 + al0) < # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used terms: al1 + al0, ext, sl, start, # al1, step
| ⊦ ¬ # al < n ∧ n < # sl → ( frag*(IOAut(start, step, ext))(sl, al) ↔ frag*(IOAut(start, step, ext))(sl.take(n + 1), al.take(n)) ∧ frag*(IOAut(start, step, ext))(sl.drop(n), al.drop(n))) |
| frag*(IOAut(start, step, ext))(sl, al1 + al0), start(sl[0]), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ ¬ #(al1 + al0) < # al1 ∧ # al1 < # sl |
frag*(IOAut(start, step, ext))(sl, al1 + al0), start(sl[0]), # sl ≤ # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ m + n < m; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s)
| frag*(IOAut(start, step, ext))(sl, al1 + al0), start(sl[0]), # sl ≤ # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1]))
# sl = #(al1 + al0) + 1, start(sl[0]), # sl ≤ # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∀ n. n < #(al1 + al0) → IOAut(start, step, ext).step(sl[n], (al1 + al0)[n], sl[n +1]) ⊦
Used terms: IOAut(start, step, ext), sl, al1 + al0
| ⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1])) |
| # sl = #(al1 + al0) + 1, start(sl[0]), # sl ≤ # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∀ n. n < #(al1 + al0) → IOAut(start, step, ext).step(sl[n], (al1 + al0)[n], sl[n +1]) ⊦ |
# sl = (# al1 + # al0) + 1, start(sl[0]), # sl ≤ # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∀ n. n < # al1 + # al0 → step(sl[n], (al1 + al0)[n], sl[n + 1]) ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).step = step; (s) ⊦ m +1 = m + 1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
| # sl = (# al1 + # al0) + 1, start(sl[0]), # sl ≤ # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]), ∀ n. n < # al1 + # al0 → step(sl[n], (al1 + al0)[n], sl[n + 1]) ⊦ |
Used simplifier rules: ⊦ m + 1 ≤ n ↔ m < n; (s) ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic
| # al1 < # sl, frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), (al1 + al0).take(# al1)), frag*(IOAut(start, step, ext))(sl.drop(# al1), (al1 + al0).drop(# al1)), start(sl[0]), ¬ #(al1 + al0) < # al1, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), frag*(IOAut(start, step, ext))(sl.drop(# al1), al0), start(sl.head), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ x ≠ [] → x[0] = x.head; (s) ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ m + n < m; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s) ⊦ (x + y).take(# x) = x; (s) ⊦ (x + y).drop(# x) = y; (s)
| sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), frag*(IOAut(start, step, ext))(sl.drop(# al1), al0), start(sl.head), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
sl = s + sl0, sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl.drop(# al1), al0), frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), start(s), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: sl, s, sl0
| sl = s + sl0, sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl.drop(# al1), al0), frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), start(s), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
frag*(IOAut(start, step, ext))(s ' + sl0.take(# al1), al1), frag*(IOAut(start, step, ext))((s ' + sl0).drop(# al1), al0), start(s), # al1 ≤ # sl0, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m < n + 1 ↔ ¬ n < m; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ a + x = a ' + x; (s) ⊦ (a ' + x).take(n + 1) = a + x.take(n); (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| frag*(IOAut(start, step, ext))(s ' + sl0.take(# al1), al1), frag*(IOAut(start, step, ext))((s ' + sl0).drop(# al1), al0), start(s), # al1 ≤ # sl0, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
# sl1 = # al1, sl0 = sl1 + sl2, frag*(IOAut(start, step, ext))((s ' + sl0).drop(# al1), al0), frag*(IOAut(start, step, ext))(s ' + sl1, al1), start(s), # al1 ≤ # sl0, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: ⊦ n ≤ # x → (y = x.take(n) ∧ z = x.drop(n) ↔ x = y + z ∧ # y = n); (elim) Used terms: sl0, # al1, sl1, sl2
| # sl1 = # al1, sl0 = sl1 + sl2, frag*(IOAut(start, step, ext))((s ' + sl0).drop(# al1), al0), frag*(IOAut(start, step, ext))(s ' + sl1, al1), start(s), # al1 ≤ # sl0, ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
# sl1 = # al1, frag*(IOAut(start, step, ext))((s ' + sl1 + sl2).drop(# al1), al0), frag*(IOAut(start, step, ext))(s ' + sl1, al1), start(s), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m ≤ m + n; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s)
| # sl1 = # al1, frag*(IOAut(start, step, ext))((s ' + sl1 + sl2).drop(# al1), al0), frag*(IOAut(start, step, ext))(s ' + sl1, al1), start(s), ∀ sl, al. ext !(al1) ≠ ext !(al) ∨ ¬ frag*(IOAut(start, step, ext))(sl, al) ∨ ¬ start(sl[0]) ⊦ |
Used simplifier rules: ⊦ (a ' + x)[0] = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: s ' + sl1, al1
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.