| frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1) |
frag*(IOAut(start, step, ext))(sl, al), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1)
Used simplifier rules: <; (wellfounded) Used terms: # sl
| frag*(IOAut(start, step, ext))(sl, al), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1) |
frag*(IOAut(start, step, ext))(sl, al), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1), sl.head = sl.head ∧ sl.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl ≤ # sl1)
Used terms: sl, al
| frag*(IOAut(start, step, ext))(sl, al), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1), sl.head = sl.head ∧ sl.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl, al) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl ≤ # sl1) |
sl1.head = sl.head, sl1.last = sl.last, sl ≠ [], # sl1 < # sl, frag*(IOAut(start, step, ext))(sl1, al1), frag*(IOAut(start, step, ext))(sl, al), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1)
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ m ≤ n ↔ ¬ n < m; (ss)
| sl1.head = sl.head, sl1.last = sl.last, sl ≠ [], # sl1 < # sl, frag*(IOAut(start, step, ext))(sl1, al1), frag*(IOAut(start, step, ext))(sl, al), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1) |
sl1.head = s, sl1.last = sl.last, sl = s + sl3, sl ≠ [], # sl1 < # sl, frag*(IOAut(start, step, ext))(sl, al), frag*(IOAut(start, step, ext))(sl1, al1), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = s ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1)
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: sl, head, tail
| sl1.head = s, sl1.last = sl.last, sl = s + sl3, sl ≠ [], # sl1 < # sl, frag*(IOAut(start, step, ext))(sl, al), frag*(IOAut(start, step, ext))(sl1, al1), ∀ sl0, start, step, ext, al. # sl0 < # sl → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = s ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1) |
sl1.last = (sl1.head ' + sl3).last, frag*(IOAut(start, step, ext))(sl1, al1), frag*(IOAut(start, step, ext))(sl1.head ' + sl3, al), # sl1 ≤ # sl3, ∀ sl0, start, step, ext, al. # sl0 < #(sl1.head + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl1.head ∧ sl0.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl1.head ∧ sl.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: ⊦ a + x = a ' + x; (s) ⊦ 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) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a ' + x ≠ []; (s)
| sl1.last = (sl1.head ' + sl3).last, frag*(IOAut(start, step, ext))(sl1, al1), frag*(IOAut(start, step, ext))(sl1.head ' + sl3, al), # sl1 ≤ # sl3, ∀ sl0, start, step, ext, al. # sl0 < #(sl1.head + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl1.head ∧ sl0.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl1.head ∧ sl.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
sl1.last = (s ' + sl3).last, sl1 = s + sl4, sl1 ≠ [], frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(sl1, al1), # sl1 ≤ # sl3, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = s ∧ sl.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: not-frag-empty: ⊦ ¬ frag(IOAut(start, step, ext))([], α); ⊦ # [] = 0; (s) ⊦ 0 ≤ m; (s) ⊦ ⌜[]⌝ = []; (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl1, s, y
| sl1.last = (s ' + sl3).last, sl1 = s + sl4, sl1 ≠ [], frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(sl1, al1), # sl1 ≤ # sl3, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = s ∧ sl.last = sl1.last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
(s ' + sl4).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x ≠ [] → (a ' + x).last = x.last; (s) ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ a + x = a ' + x; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≤ n ↔ m < n; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ a ' + x ≠ []; (s)
| (s ' + sl4).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
(s ' + sl4).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(s ' + sl4, al1), ∃ sl1, al0. sl1.head = (s + sl4).head ∧ sl1.last = (s + sl4).last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = (s + sl4).head ∧ sl2.last = (s + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2), ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: ⊦ a + x = a ' + x; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(a ' + x) = (# x)+1; (s) ⊦ m +1 = m + 1; (s) ⊦ m + n < m + n0 ↔ n < n0; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n → (n ≤ m ↔ false); (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: s + sl4, start, step, ext, al1
| (s ' + sl4).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(s ' + sl4, al1), ∃ sl1, al0. sl1.head = (s + sl4).head ∧ sl1.last = (s + sl4).last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = (s + sl4).head ∧ sl2.last = (s + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2), ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
sl3.last = (sl1.head ' + sl4).last, sl1.last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(sl1.head ' + sl3, al), frag*(IOAut(start, step, ext))(sl1.head ' + sl4, al1), frag*(IOAut(start, step, ext))(sl1, al0), ∀ sl2, al2. sl2.head = sl1.head ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl1 ≤ # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(sl1.head + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl1.head ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).head = a; (s)
| sl3.last = (sl1.head ' + sl4).last, sl1.last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(sl1.head ' + sl3, al), frag*(IOAut(start, step, ext))(sl1.head ' + sl4, al1), frag*(IOAut(start, step, ext))(sl1, al0), ∀ sl2, al2. sl2.head = sl1.head ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl1 ≤ # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(sl1.head + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = sl1.head ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
sl1.last = sl3.last, sl3.last = (s ' + sl4).last, sl1 = s + sl5, sl1 ≠ [], sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl1 ≤ # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: not-frag-empty: ⊦ ¬ frag(IOAut(start, step, ext))([], α); ⊦ ⌜[]⌝ = []; (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl1, s, y
| sl1.last = sl3.last, sl3.last = (s ' + sl4).last, sl1 = s + sl5, sl1 ≠ [], sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(sl1, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl1 ≤ # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
sl3.last = (s ' + sl4).last, (s ' + sl5).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl5, al0), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≤ n ↔ m < n; (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) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a ' + x ≠ []; (s)
| sl3.last = (s ' + sl4).last, (s ' + sl5).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl5, al0), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ ∃ sl0, al0. sl0.head = s ∧ sl0.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl, al2. sl.head = sl0.head ∧ sl.last = (sl0.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → # sl0 ≤ # sl) |
(s ' + sl5).last = sl3.last, sl3.last = (s ' + sl4).last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl5, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ (s + sl5).head = s ∧ (s + sl5).last = ((s + sl5).head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(s + sl5, al0) ∧ (∀ sl, al2. sl.head = (s + sl5).head ∧ sl.last = ((s + sl5).head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → #(s + sl5) ≤ # sl)
Used terms: s + sl5, al0
| (s ' + sl5).last = sl3.last, sl3.last = (s ' + sl4).last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl5, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ (s + sl5).head = s ∧ (s + sl5).last = ((s + sl5).head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(s + sl5, al0) ∧ (∀ sl, al2. sl.head = (s + sl5).head ∧ sl.last = ((s + sl5).head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl, al2) → #(s + sl5) ≤ # sl) |
sl.last = sl3.last, sl3.last = (sl.head ' + sl4).last, (sl.head ' + sl5).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(sl, al2), frag*(IOAut(start, step, ext))(sl.head ' + sl3, al), frag*(IOAut(start, step, ext))(sl.head ' + sl4, al1), frag*(IOAut(start, step, ext))(sl.head ' + sl5, al0), # sl ≤ # sl5, ∀ sl2, al2. sl2.head = sl.head ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(sl.head + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦
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 + 1 ≤ n ↔ m < n; (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).head = a; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s)
| sl.last = sl3.last, sl3.last = (sl.head ' + sl4).last, (sl.head ' + sl5).last = sl3.last, sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(sl, al2), frag*(IOAut(start, step, ext))(sl.head ' + sl3, al), frag*(IOAut(start, step, ext))(sl.head ' + sl4, al1), frag*(IOAut(start, step, ext))(sl.head ' + sl5, al0), # sl ≤ # sl5, ∀ sl2, al2. sl2.head = sl.head ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(sl.head + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ |
(s ' + sl5).last = sl3.last, sl3.last = (s ' + sl4).last, sl.last = sl3.last, sl = s + sl6, sl ≠ [], sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl5, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(sl, al2), # sl ≤ # sl5, ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦
Used simplifier rules: not-frag-empty: ⊦ ¬ frag(IOAut(start, step, ext))([], α); ⊦ # [] = 0; (s) ⊦ 0 ≤ m; (s) ⊦ ⌜[]⌝ = []; (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl, s, y
| (s ' + sl5).last = sl3.last, sl3.last = (s ' + sl4).last, sl.last = sl3.last, sl = s + sl6, sl ≠ [], sl3 ≠ [], # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl5, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), frag*(IOAut(start, step, ext))(sl, al2), # sl ≤ # sl5, ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ |
sl3.last = (s ' + sl4).last, (s ' + sl6).last = sl3.last, sl5.last = sl3.last, sl3 ≠ [], sl5 ≠ [], # sl6 < # sl5, # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl6, al2), frag*(IOAut(start, step, ext))(s ' + sl5, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x ≠ [] → (a ' + x).last = x.last; (s) ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a + x = a ' + x; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≤ n ↔ m < n; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ a ' + x ≠ []; (s)
| sl3.last = (s ' + sl4).last, (s ' + sl6).last = sl3.last, sl5.last = sl3.last, sl3 ≠ [], sl5 ≠ [], # sl6 < # sl5, # sl4 < # sl3, frag*(IOAut(start, step, ext))(s ' + sl6, al2), frag*(IOAut(start, step, ext))(s ' + sl5, al0), frag*(IOAut(start, step, ext))(s ' + sl4, al1), frag*(IOAut(start, step, ext))(s ' + sl3, al), ∀ sl2, al2. sl2.head = s ∧ sl2.last = (sl2.head ' + sl4).last ∧ frag*(IOAut(start, step, ext))(sl2, al2) → # sl5 < # sl2, ∀ sl0, start, step, ext, al. # sl0 < #(s + sl3) → frag*(IOAut(start, step, ext))(sl0, al) → (∃ sl1, al0. sl1.head = sl0.head ∧ sl1.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl1, al0) ∧ (∀ sl2, al1. sl2.head = sl0.head ∧ sl2.last = sl0.last ∧ frag*(IOAut(start, step, ext))(sl2, al1) → # sl1 ≤ # sl2)) ⊦ |
Used simplifier rules: ⊦ (a ' + x).head = a; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a + x = a ' + x; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ m +1 = m + 1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ 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 Used terms: s + sl6, al2
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.