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