| ⊦ pfxclosed(exec*(ioa)) |
¬ pfxclosed(exec*(ioa)) ⊦
| ¬ pfxclosed(exec*(ioa)) ⊦ |
⊦ pfxclosed(frag*(ioa))
pfxclosed(frag*(ioa)), ¬ pfxclosed(exec*(ioa)) ⊦
Used terms: ioa
| ⊦ pfxclosed(frag*(ioa)) |
| pfxclosed(frag*(ioa)), ¬ pfxclosed(exec*(ioa)) ⊦ |
⊦ pfxclosed(trlp) ↔ (∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1))
¬ pfxclosed(exec*(ioa)), ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1) ⊦
Used terms: frag*(ioa)
| ⊦ pfxclosed(trlp) ↔ (∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1)) |
| ¬ pfxclosed(exec*(ioa)), ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1) ⊦ |
⊦ pfxclosed(trlp) ↔ (∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1))
∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1), ∃ sl1, sl2, al1, al2. ¬(exec*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → exec*(ioa)(sl1, al1)) ⊦
Used terms: exec*(ioa)
| ⊦ pfxclosed(trlp) ↔ (∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1)) |
| ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1), ∃ sl1, sl2, al1, al2. ¬(exec*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → exec*(ioa)(sl1, al1)) ⊦ |
# sl1 = # al1 + 1, # sl2 = # al2 + 1, ioa.start(sl2[0]), frag*(ioa)(sl2, al2), sl1 ⊑ sl2, al1 ⊑ al2, ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1) ⊦ frag*(ioa)(sl1, al1) ∧ ioa.start(sl1[0])
Used simplifier rules: ⊦ exec*(ioa)(sl, al) ↔ frag*(ioa)(sl, al) ∧ ioa.start(sl[0]); (s)
| # sl1 = # al1 + 1, # sl2 = # al2 + 1, ioa.start(sl2[0]), frag*(ioa)(sl2, al2), sl1 ⊑ sl2, al1 ⊑ al2, ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1) ⊦ frag*(ioa)(sl1, al1) ∧ ioa.start(sl1[0]) |
# sl2 = # al2 + 1, # sl1 = # al1 + 1, ioa = IOAut(start, step, ext), frag*(ioa)(sl2, al2), start(sl2[0]), al1 ⊑ al2, sl1 ⊑ sl2, ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1) ⊦ frag*(ioa)(sl1, al1) ∧ start(sl1[0])
Used simplifier rules: ⊦ (start = ioaut.start ∧ step = ioaut.step) ∧ ext = ioaut.ext ↔ ioaut = IOAut(start, step, ext); (elim) Used terms: ioa, start, step, ext
| # sl2 = # al2 + 1, # sl1 = # al1 + 1, ioa = IOAut(start, step, ext), frag*(ioa)(sl2, al2), start(sl2[0]), al1 ⊑ al2, sl1 ⊑ sl2, ∀ sl1, sl2, al1, al2. frag*(ioa)(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → frag*(ioa)(sl1, al1) ⊦ frag*(ioa)(sl1, al1) ∧ start(sl1[0]) |
# sl1 = # al1 + 1, # sl2 = # al2 + 1, frag*(IOAut(start, step, ext))(sl2, al2), start(sl2[0]), sl1 ⊑ sl2, al1 ⊑ al2, ∀ sl, sl0, al, al0. frag*(IOAut(start, step, ext))(sl0, al0) ∧ sl ⊑ sl0 ∧ al ⊑ al0 ∧ # sl = # al + 1 → frag*(IOAut(start, step, ext))(sl, al) ⊦ frag*(IOAut(start, step, ext))(sl1, al1) ∧ start(sl1[0])
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# sl = # al + 1 ↔ true); (ss)
| # sl1 = # al1 + 1, # sl2 = # al2 + 1, frag*(IOAut(start, step, ext))(sl2, al2), start(sl2[0]), sl1 ⊑ sl2, al1 ⊑ al2, ∀ sl, sl0, al, al0. frag*(IOAut(start, step, ext))(sl0, al0) ∧ sl ⊑ sl0 ∧ al ⊑ al0 ∧ # sl = # al + 1 → frag*(IOAut(start, step, ext))(sl, al) ⊦ frag*(IOAut(start, step, ext))(sl1, al1) ∧ start(sl1[0]) |
# sl2 = # al2 + 1, # sl1 = # al1 + 1, frag*(IOAut(start, step, ext))(sl2, al2), start(sl2[0]), al1 ⊑ al2, sl1 ⊑ sl2, frag*(IOAut(start, step, ext))(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 → frag*(IOAut(start, step, ext))(sl1, al1) ⊦ frag*(IOAut(start, step, ext))(sl1, al1) ∧ start(sl1[0])
Used terms: sl1, sl2, al1, al2
| # sl2 = # al2 + 1, # sl1 = # al1 + 1, frag*(IOAut(start, step, ext))(sl2, al2), start(sl2[0]), al1 ⊑ al2, sl1 ⊑ sl2, frag*(IOAut(start, step, ext))(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 → frag*(IOAut(start, step, ext))(sl1, al1) ⊦ frag*(IOAut(start, step, ext))(sl1, al1) ∧ start(sl1[0]) |
# sl1 = # al1 + 1, # sl2 = # al2 + 1, frag*(IOAut(start, step, ext))(sl2, al2), frag*(IOAut(start, step, ext))(sl1, al1), start(sl2[0]), sl1 ⊑ sl2, al1 ⊑ al2, ¬ start(sl1[0]) ⊦
| # sl1 = # al1 + 1, # sl2 = # al2 + 1, frag*(IOAut(start, step, ext))(sl2, al2), frag*(IOAut(start, step, ext))(sl1, al1), start(sl2[0]), sl1 ⊑ sl2, al1 ⊑ al2, ¬ start(sl1[0]) ⊦ |
⊦ x ⊑ y ↔ (∃ z. x + z = y)
# sl2 = # al2 + 1, # sl1 = # al1 + 1, frag*(IOAut(start, step, ext))(sl1, al1), frag*(IOAut(start, step, ext))(sl2, al2), start(sl2[0]), al1 ⊑ al2, ¬ start(sl1[0]), ∃ z. sl1 + z = sl2 ⊦
Used terms: sl1, sl2
| ⊦ x ⊑ y ↔ (∃ z. x + z = y) |
| # sl2 = # al2 + 1, # sl1 = # al1 + 1, frag*(IOAut(start, step, ext))(sl1, al1), frag*(IOAut(start, step, ext))(sl2, al2), start(sl2[0]), al1 ⊑ al2, ¬ start(sl1[0]), ∃ z. sl1 + z = sl2 ⊦ |
# sl1 = # al1 + 1, # sl1 + # sl = # al2 + 1, frag*(IOAut(start, step, ext))(sl1 + sl, al2), frag*(IOAut(start, step, ext))(sl1, al1), start((sl1 + sl)[0]), al1 ⊑ al2, ¬ start(sl1[0]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s)
| # sl1 = # al1 + 1, # sl1 + # sl = # al2 + 1, frag*(IOAut(start, step, ext))(sl1 + sl, al2), frag*(IOAut(start, step, ext))(sl1, al1), start((sl1 + sl)[0]), al1 ⊑ al2, ¬ start(sl1[0]) ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
Used simplifier rules: ⊦ ¬ n < # x → (x + y)[n] = y[n - # x]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ 0 < m ↔ m ≠ 0; (s) ⊦ # [] = 0; (s) ⊦ m + n = 0 ↔ m = 0 ∧ n = 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 Used terms: 0, sl1, sl
| ⊦ n < # x → (x + y)[n] = x[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.