| ¬ # el < n, move(IOAut(start, step, ext))(s, el, s2) ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2) |
move(IOAut(start, step, ext))(s, el, s2), ¬ # el < n ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2)
| move(IOAut(start, step, ext))(s, el, s2), ¬ # el < n ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2) |
move(IOAut(start, step, ext))(s, el, s2), n ≤ # el ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2)
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss)
| move(IOAut(start, step, ext))(s, el, s2), n ≤ # el ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2) |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
n ≤ # el, ∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ s = sl[0] ∧ s2 = sl.last ∧ IOAut(start, step, ext).ext !(al) = el ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2)
Used terms: IOAut(start, step, ext), s, el, s2
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| n ≤ # el, ∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ s = sl[0] ∧ s2 = sl.last ∧ IOAut(start, step, ext).ext !(al) = el ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2) |
frag*(IOAut(start, step, ext))(sl, al), n ≤ # ext !(al) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al).take(n), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al).drop(n), sl.last)
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| frag*(IOAut(start, step, ext))(sl, al), n ≤ # ext !(al) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al).take(n), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al).drop(n), sl.last) |
ext !(al) = el + el0, # el = n, frag*(IOAut(start, step, ext))(sl, al), n ≤ # ext !(al) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], el, s1) ∧ move(IOAut(start, step, ext))(s1, el0, sl.last)
Used simplifier rules: ⊦ n ≤ # x → (y = x.take(n) ∧ z = x.drop(n) ↔ x = y + z ∧ # y = n); (elim) Used terms: ext !(al), n, el, el0
| ext !(al) = el + el0, # el = n, frag*(IOAut(start, step, ext))(sl, al), n ≤ # ext !(al) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], el, s1) ∧ move(IOAut(start, step, ext))(s1, el0, sl.last) |
ext !(al) = el + el0, frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], el, s1) ∧ move(IOAut(start, step, ext))(s1, el0, sl.last)
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)
| ext !(al) = el + el0, frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], el, s1) ∧ move(IOAut(start, step, ext))(s1, el0, sl.last) |
⊦ ext !(al) = el + el0 ↔ (∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el0)
frag*(IOAut(start, step, ext))(sl, al), ∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el0 ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], el, s1) ∧ move(IOAut(start, step, ext))(s1, el0, sl.last)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: ext, al, el, el0
| ⊦ ext !(al) = el + el0 ↔ (∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el0) |
| frag*(IOAut(start, step, ext))(sl, al), ∃ al1, al0. al = al1 + al0 ∧ ext !(al1) = el ∧ ext !(al0) = el0 ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], el, s1) ∧ move(IOAut(start, step, ext))(s1, el0, sl.last) |
frag*(IOAut(start, step, ext))(sl, al1 + al0) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
| frag*(IOAut(start, step, ext))(sl, al1 + al0) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
⊦ ¬ # 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) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last), ¬ #(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)), ¬ #(al1 + al0) < # al1 ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
Used terms: ext, # al1, al1 + al0, step, start, sl
| ⊦ ¬ # 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) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last), ¬ #(al1 + al0) < # al1 ∧ # al1 < # sl |
frag*(IOAut(start, step, ext))(sl, al1 + al0), # sl ≤ # al1 ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
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), # sl ≤ # al1 ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1]))
# sl = #(al1 + al0) + 1, # sl ≤ # al1, ∀ n. n < #(al1 + al0) → IOAut(start, step, ext).step(sl[n], (al1 + al0)[n], sl[n +1]) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
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, # sl ≤ # al1, ∀ n. n < #(al1 + al0) → IOAut(start, step, ext).step(sl[n], (al1 + al0)[n], sl[n +1]) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
# sl = (# al1 + # al0) + 1, # sl ≤ # al1, ∀ n. n < # al1 + # al0 → step(sl[n], (al1 + al0)[n], sl[n + 1]) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
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, # sl ≤ # al1, ∀ n. n < # al1 + # al0 → step(sl[n], (al1 + al0)[n], sl[n + 1]) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
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)), ¬ #(al1 + al0) < # al1 ⊦ ∃ s1. move(IOAut(start, step, ext))(sl[0], ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), frag*(IOAut(start, step, ext))(sl.drop(# al1), al0) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl.head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
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) ⊦ ∃ s1. move(IOAut(start, step, ext))(sl.head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
# sl0 = # al1, sl = sl0 + sl1, sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), # al1 ≤ # sl ⊦ ∃ s1. move(IOAut(start, step, ext))(sl.head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last)
Used simplifier rules: ⊦ m < n → m ≤ n; (s) ⊦ n ≤ # x → (y = x.take(n) ∧ z = x.drop(n) ↔ x = y + z ∧ # y = n); (elim) Used terms: sl, # al1, sl0, sl1
| # sl0 = # al1, sl = sl0 + sl1, sl ≠ [], # al1 < # sl, frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(sl.take(# al1 + 1), al1), # al1 ≤ # sl ⊦ ∃ s1. move(IOAut(start, step, ext))(sl.head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl.last) |
# sl0 = # al1, sl1 ≠ [], frag*(IOAut(start, step, ext))((sl0 + sl1).take(# al1 + 1), al1), frag*(IOAut(start, step, ext))(sl1, al0) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ m < m + n ↔ n ≠ 0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ y ≠ [] → (x + y).last = y.last; (s) ⊦ m < n → n ≠ 0; (s) lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ m < n → m ≤ n; (s) ⊦ #(x + y) = # x + # y; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| # sl0 = # al1, sl1 ≠ [], frag*(IOAut(start, step, ext))((sl0 + sl1).take(# al1 + 1), al1), frag*(IOAut(start, step, ext))(sl1, al0) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last) |
⊦ # x < n → (x + y).take(n) = x + y.take(n - # x)
# sl0 = # al1, sl1 ≠ [], # sl0 < # al1 + 1, frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(sl0 + sl1.take(# al1 + 1 - # sl0), al1) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last)
Used simplifier rules: ⊦ m < n + 1 ↔ ¬ n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ m < n → ¬ n < m; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: # al1 + 1, sl0, sl1
| ⊦ # x < n → (x + y).take(n) = x + y.take(n - # x) |
| # sl0 = # al1, sl1 ≠ [], # sl0 < # al1 + 1, frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(sl0 + sl1.take(# al1 + 1 - # sl0), al1) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last) |
# sl0 = # al1, sl1 ≠ [], frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(sl0 + sl1.head ', al1) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last)
Used simplifier rules: ⊦ m ≤ m; (s) ⊦ x ≠ [] → x.take(1) = x.head '; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m - m = 0; (s) ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n + 1 ↔ ¬ n < m; (s)
| # sl0 = # al1, sl1 ≠ [], frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(sl0 + sl1.head ', al1) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last) |
# sl0 = # al1, sl1 = s + sl, sl1 ≠ [], frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(sl1, al0) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last)
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: sl1, s, sl
| # sl0 = # al1, sl1 = s + sl, sl1 ≠ [], frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(sl1, al0) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + sl1).head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), sl1.last) |
# sl0 = # al1, frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + s ').head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), (s ' + sl).last)
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (x + a ' + y).head = (x + a ').head; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| # sl0 = # al1, frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0) ⊦ ∃ s1. move(IOAut(start, step, ext))((sl0 + s ').head, ext !(al1), s1) ∧ move(IOAut(start, step, ext))(s1, ext !(al0), (s ' + sl).last) |
# sl0 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(sl0 + s ', al1) ⊦ move(IOAut(start, step, ext))((sl0 + s ').head, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used terms: s
| # sl0 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(sl0 + s ', al1) ⊦ move(IOAut(start, step, ext))((sl0 + s ').head, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
# sl0 = # al1, sl0 + s ' = s0 + sl1, sl0 + s ' ≠ [], frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0) ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used simplifier rules: ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl0 + s ', s0, sl1
| # sl0 = # al1, sl0 + s ' = s0 + sl1, sl0 + s ' ≠ [], frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0) ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
# sl0 = # al1, sl0 + s ' = s0 ' + sl1, frag*(IOAut(start, step, ext))(s0 ' + sl1, al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), s = s0 ∨ s ∈ sl1, s0 ∈ sl0 ∨ s0 = s ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' ↔ a = a0; (s) ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a + x = a ' + x; (s)
| # sl0 = # al1, sl0 + s ' = s0 ' + sl1, frag*(IOAut(start, step, ext))(s0 ' + sl1, al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), s = s0 ∨ s ∈ sl1, s0 ∈ sl0 ∨ s0 = s ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
y ≠ [] ⊦ y + z = a ' + x ↔ a = y.head ∧ x = y.tail + z
# sl0 = # al1, sl0 + s ' = s0 ' + sl1, sl0 = [], frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(s0 ' + sl1, al1), s0 ∈ sl0 ∨ s0 = s, s = s0 ∨ s ∈ sl1 ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
# sl0 = # al1, s0 = sl0.head, sl1 = sl0.tail + s ', sl0 ≠ [], frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(s0 ' + sl1, al1), s0 ∈ sl0 ∨ s0 = s, s = s0 ∨ s ∈ sl1 ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: sl0, s ', s0, sl1
| y ≠ [] ⊦ y + z = a ' + x ↔ a = y.head ∧ x = y.tail + z |
| # sl0 = # al1, sl0 + s ' = s0 ' + sl1, sl0 = [], frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(s0 ' + sl1, al1), s0 ∈ sl0 ∨ s0 = s, s = s0 ∨ s ∈ sl1 ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
frag*(IOAut(start, step, ext))(s0 ' + sl, al0), ¬ move(IOAut(start, step, ext))(s0, ext !(al0), (s0 ' + sl).last) ⊦
Used simplifier rules: finfrag-one: ⊦ frag*(IOAut(start, step, ext))(s ', []); move-empty: ⊦ move(IOAut(start, step, ext))(s, [], s); ⊦ ext !([]) = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s) ⊦ ¬ a ∈ []; (s) ⊦ # x = 0 ↔ x = []; (s) ⊦ # [] = 0; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) ⊦ [] + x = x; (s)
| frag*(IOAut(start, step, ext))(s0 ' + sl, al0), ¬ move(IOAut(start, step, ext))(s0, ext !(al0), (s0 ' + sl).last) ⊦ |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
frag*(IOAut(start, step, ext))(s0 ' + sl, al0), ∀ al, sl0. ¬(frag*(IOAut(start, step, ext))(sl0, al) ∧ s0 = sl0[0] ∧ (s0 ' + sl).last = sl0.last ∧ IOAut(start, step, ext).ext !(al) = ext !(al0)) ⊦
Used terms: IOAut(start, step, ext), s0, ext !(al0), (s0 ' + sl).last
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| frag*(IOAut(start, step, ext))(s0 ' + sl, al0), ∀ al, sl0. ¬(frag*(IOAut(start, step, ext))(sl0, al) ∧ s0 = sl0[0] ∧ (s0 ' + sl).last = sl0.last ∧ IOAut(start, step, ext).ext !(al) = ext !(al0)) ⊦ |
frag*(IOAut(start, step, ext))(s0 ' + sl, al0), ∀ al, sl0. ¬ frag*(IOAut(start, step, ext))(sl0, al) ∨ s0 ≠ sl0[0] ∨ (sl0[0] ' + sl).last ≠ sl0.last ∨ ext !(al) ≠ ext !(al0) ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| frag*(IOAut(start, step, ext))(s0 ' + sl, al0), ∀ al, sl0. ¬ frag*(IOAut(start, step, ext))(sl0, al) ∨ s0 ≠ sl0[0] ∨ (sl0[0] ' + sl).last ≠ sl0.last ∨ ext !(al) ≠ ext !(al0) ⊦ |
Used simplifier rules: ⊦ (a ' + x)[0] = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: al0, s0 ' + sl
| # sl0 = # al1, s0 = sl0.head, sl1 = sl0.tail + s ', sl0 ≠ [], frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(s0 ' + sl1, al1), s0 ∈ sl0 ∨ s0 = s, s = s0 ∨ s ∈ sl1 ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
# sl0 = # al1, sl0 ≠ [], frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(sl0 + s ', al1) ⊦ move(IOAut(start, step, ext))(sl0.head, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used simplifier rules: ⊦ x.head ∈ x ↔ x ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' ↔ a = a0; (s) ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) ⊦ x ≠ [] → x.head ' + x.tail = x; (s)
| # sl0 = # al1, sl0 ≠ [], frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))(sl0 + s ', al1) ⊦ move(IOAut(start, step, ext))(sl0.head, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
# sl0 = # al1, sl0 = s0 + sl1, sl0 ≠ [], frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0) ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: sl0, s0, sl1
| # sl0 = # al1, sl0 = s0 + sl1, sl0 ≠ [], frag*(IOAut(start, step, ext))(sl0 + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0) ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1) ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s)
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1) ⊦ move(IOAut(start, step, ext))(s0, ext !(al1), s) ∧ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) |
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ¬ move(IOAut(start, step, ext))(s0, ext !(al1), s) ⊦
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ¬ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) ⊦
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ¬ move(IOAut(start, step, ext))(s0, ext !(al1), s) ⊦ |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), ∀ al, sl. ¬(frag*(IOAut(start, step, ext))(sl, al) ∧ s0 = sl[0] ∧ s = sl.last ∧ IOAut(start, step, ext).ext !(al) = ext !(al1)) ⊦
Used terms: IOAut(start, step, ext), s0, ext !(al1), s
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), ∀ al, sl. ¬(frag*(IOAut(start, step, ext))(sl, al) ∧ s0 = sl[0] ∧ s = sl.last ∧ IOAut(start, step, ext).ext !(al) = ext !(al1)) ⊦ |
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ∀ al, sl0. ¬ frag*(IOAut(start, step, ext))(sl0, al) ∨ s0 ≠ sl0[0] ∨ s ≠ sl0.last ∨ ext !(al) ≠ ext !(al1) ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ∀ al, sl0. ¬ frag*(IOAut(start, step, ext))(sl0, al) ∨ s0 ≠ sl0[0] ∨ s ≠ sl0.last ∨ ext !(al) ≠ ext !(al1) ⊦ |
Used simplifier rules: ⊦ (a ' + x)[0] = a; (s) ⊦ (a ' + x + b ').last = b; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: al1, (s0 ' + sl1) + s '
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ¬ move(IOAut(start, step, ext))(s, ext !(al0), (s ' + sl).last) ⊦ |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), ∀ al, sl0. ¬(frag*(IOAut(start, step, ext))(sl0, al) ∧ s = sl0[0] ∧ (s ' + sl).last = sl0.last ∧ IOAut(start, step, ext).ext !(al) = ext !(al0)) ⊦
Used terms: IOAut(start, step, ext), s, ext !(al0), (s ' + sl).last
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))(s ' + sl, al0), frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), ∀ al, sl0. ¬(frag*(IOAut(start, step, ext))(sl0, al) ∧ s = sl0[0] ∧ (s ' + sl).last = sl0.last ∧ IOAut(start, step, ext).ext !(al) = ext !(al0)) ⊦ |
# sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ∀ al, sl0. ¬ frag*(IOAut(start, step, ext))(sl0, al) ∨ s ≠ sl0[0] ∨ (sl0[0] ' + sl).last ≠ sl0.last ∨ ext !(al) ≠ ext !(al0) ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| # sl1 + 1 = # al1, frag*(IOAut(start, step, ext))((s0 ' + sl1) + s ', al1), frag*(IOAut(start, step, ext))(s ' + sl, al0), ∀ al, sl0. ¬ frag*(IOAut(start, step, ext))(sl0, al) ∨ s ≠ sl0[0] ∨ (sl0[0] ' + sl).last ≠ sl0.last ∨ ext !(al) ≠ ext !(al0) ⊦ |
Used simplifier rules: ⊦ (a ' + x)[0] = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: al0, s ' + sl
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.