| ⊦ rfo(t).forall(.FO?) ∧ reorder(l, fowl, fowl0, rfo) → fowl | t = (fowl0 | t) + propFOs(t, l, rfo(t)) |
fowl | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl, fowl0, rfo) ⊦
| fowl | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl, fowl0, rfo) ⊦ |
[] | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, [], fowl0, rfo) ⊦
fow + fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow + fowl1, fowl0, rfo), ∀ t, fowl0, l, rfo. ¬(fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)) ∧ rfo(t).forall(.FO?) ∧ reorder(l, fowl1, fowl0, rfo)) ⊦
Used simplifier rules: List('a) freely generated by [], +;;
| [] | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, [], fowl0, rfo) ⊦ |
propFOs(t, l, rfo(t)) ≠ [], rfo(t).forall(.FO?), ∀ t. propFOs(t, l, rfo(t)) = [] ⊦
Used simplifier rules: reorder-base: ⊦ reorder(l, [], fowl0, rfo) ↔ fowl0 = [] ∧ (∀ t. propFOs(t, l, rfo(t)) = []); ⊦ [] | t = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| propFOs(t, l, rfo(t)) ≠ [], rfo(t).forall(.FO?), ∀ t. propFOs(t, l, rfo(t)) = [] ⊦ |
⊦ x = [] ↔ ¬(∃ a, y. x = a ' + y)
rfo(t).forall(.FO?), ∀ t. propFOs(t, l, rfo(t)) = [], ∃ a, y. propFOs(t, l, rfo(t)) = a ' + y ⊦
Used terms: propFOs(t, l, rfo(t))
| ⊦ x = [] ↔ ¬(∃ a, y. x = a ' + y) |
| rfo(t).forall(.FO?), ∀ t. propFOs(t, l, rfo(t)) = [], ∃ a, y. propFOs(t, l, rfo(t)) = a ' + y ⊦ |
propFOs(t, l, rfo(t)) = fow ' + fowl, rfo(t).forall(.FO?), fow ∈ propFOs(t, l, rfo(t)), ∀ t. propFOs(t, l, rfo(t)) = [] ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list
| propFOs(t, l, rfo(t)) = fow ' + fowl, rfo(t).forall(.FO?), fow ∈ propFOs(t, l, rfo(t)), ∀ t. propFOs(t, l, rfo(t)) = [] ⊦ |
Used simplifier rules: in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: t
| fow + fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow + fowl1, fowl0, rfo), ∀ t, fowl0, l, rfo. ¬(fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)) ∧ rfo(t).forall(.FO?) ∧ reorder(l, fowl1, fowl0, rfo)) ⊦ |
(t = fow.tid ⊃ fow ';[]) + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ fow ' | t = (t = fow.tid ⊃ fow ';[]); (s) ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s)
| (t = fow.tid ⊃ fow ';[]) + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
t = fow.tid, fow ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
[] + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), t ≠ fow.tid, rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
| t = fow.tid, fow ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fow ' + (fowl1 | fow.tid) ≠ (fowl0 | fow.tid) + propFOs(fow.tid, l, rfo(fow.tid)), rfo(fow.tid).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
| fow ' + (fowl1 | fow.tid) ≠ (fowl0 | fow.tid) + propFOs(fow.tid, l, rfo(fow.tid)), rfo(fow.tid).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fow = FO(t), fow ' + (fowl1 | fow.tid) ≠ (fowl0 | fow.tid) + propFOs(fow.tid, l, rfo(fow.tid)), rfo(fow.tid).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
fow = W(v, t), fow ' + (fowl1 | fow.tid) ≠ (fowl0 | fow.tid) + propFOs(fow.tid, l, rfo(fow.tid)), rfo(fow.tid).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: FOW freely generated by FO, W;;
| fow = FO(t), fow ' + (fowl1 | fow.tid) ≠ (fowl0 | fow.tid) + propFOs(fow.tid, l, rfo(fow.tid)), rfo(fow.tid).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
FO(t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0), fowl0 = fowl2 + FO(t) ' + fowl3 ∧ fowl2 | t = [] ∧ reorder(l, fowl1, fowl2 + fowl3, rfo) ∨ fowl0 | t = [] ∧ FO(l) ∈ rfo(t) ∧ reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))) ⊦
Used simplifier rules: reorder-rec-FO: ⊦ reorder(l, FO(t) ' + fowl, fowl0, rfo) ↔ (∃ fowl1, fowl2. fowl0 = fowl1 + FO(t) ' + fowl2 ∧ fowl1 | t = [] ∧ reorder(l, fowl, fowl1 + fowl2, rfo)) ∨ fowl0 | t = [] ∧ FO(l) ∈ rfo(t) ∧ reorder(l, fowl, fowl0, rfo(t := rfo(t) -1l FO(l))); ⊦ FO(tid).tid = tid; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| FO(t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0), fowl0 = fowl2 + FO(t) ' + fowl3 ∧ fowl2 | t = [] ∧ reorder(l, fowl1, fowl2 + fowl3, rfo) ∨ fowl0 | t = [] ∧ FO(l) ∈ rfo(t) ∧ reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))) ⊦ |
fowl0 = fowl2 + FO(t) ' + fowl3, fowl2 | t = [], FO(t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
fowl0 | t = [], FO(t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
| fowl0 = fowl2 + FO(t) ' + fowl3, fowl2 | t = [], FO(t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl2 | t = [], fowl1 | t ≠ (fowl3 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) ⊦ [] + x = x; (s) ⊦ FO(tid).tid = tid; (s) ⊦ fow ' | t = (t = fow.tid ⊃ fow ';[]); (s) ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s)
| fowl2 | t = [], fowl1 | t ≠ (fowl3 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
Used simplifier rules: ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s) ⊦ [] + x = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: t, fowl2 + fowl3, l, rfo
| fowl0 | t = [], FO(t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl0 | t = [], FO(t) ' + (fowl1 | t) ≠ propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s)
| fowl0 | t = [], FO(t) ' + (fowl1 | t) ≠ propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl0 | t = [], FO(t) ' + (fowl1 | t) ≠ propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t), fowl1 | t = (fowl0 | t) + propFOs(t, l, rfo(t := rfo(t) -1l FO(l))(t)) ∨ ¬ rfo(t := rfo(t) -1l FO(l))(t).forall(.FO?) ∨ ¬ reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))) ⊦
Used terms: t, fowl0, l, rfo(t := rfo(t) -1l FO(l))
| fowl0 | t = [], FO(t) ' + (fowl1 | t) ≠ propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t), fowl1 | t = (fowl0 | t) + propFOs(t, l, rfo(t := rfo(t) -1l FO(l))(t)) ∨ ¬ rfo(t := rfo(t) -1l FO(l))(t).forall(.FO?) ∨ ¬ reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))) ⊦ |
fowl0 | t = [], fowl1 | t = propFOs(t, l, rfo(t) -1l FO(l)), FO(t) ' + (fowl1 | t) ≠ propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ x.forall(p) → (x -1l a).forall(p); (ss)
| fowl0 | t = [], fowl1 | t = propFOs(t, l, rfo(t) -1l FO(l)), FO(t) ' + (fowl1 | t) ≠ propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t := rfo(t) -1l FO(l))), FO(l) ∈ rfo(t) ⊦ |
⊦ FO(l) ∈ bel → propFOs(t, l, bel) = FO(t) ' + propFOs(t, l, bel -1l FO(l))
Used simplifier rules: ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: t, l, rfo(t)
| ⊦ FO(l) ∈ bel → propFOs(t, l, bel) = FO(t) ' + propFOs(t, l, bel -1l FO(l)) |
| fow = W(v, t), fow ' + (fowl1 | fow.tid) ≠ (fowl0 | fow.tid) + propFOs(fow.tid, l, rfo(fow.tid)), rfo(fow.tid).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl0.head = W(v, t), W(v, t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), fowl0 ≠ [], rfo(t).forall(.FO?), reorder(l, fowl1, fowl0.tail, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: reorder-rec-W: ⊦ reorder(l, W(v, t) ' + fowl0, fowl1, rfo) ↔ fowl1 ≠ [] ∧ fowl1.head = W(v, t) ∧ reorder(l, fowl0, fowl1.tail, rfo); ⊦ W(v, tid).tid = tid; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| fowl0.head = W(v, t), W(v, t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), fowl0 ≠ [], rfo(t).forall(.FO?), reorder(l, fowl1, fowl0.tail, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fow = W(v, t), fowl0 = fow + fowl2, W(v, t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), fowl0 ≠ [], rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: fowl0, fow, fowl2
| fow = W(v, t), fowl0 = fow + fowl2, W(v, t) ' + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), fowl0 ≠ [], rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl1 | t ≠ (fowl2 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a + x = a ' + x; (s) ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) ⊦ W(v, tid).tid = tid; (s) ⊦ fow ' | t = (t = fow.tid ⊃ fow ';[]); (s) ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s)
| fowl1 | t ≠ (fowl2 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
Used terms: t, fowl2, l, rfo
| [] + (fowl1 | t) ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), t ≠ fow.tid, rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
t ≠ fow.tid, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s)
| t ≠ fow.tid, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fow = FO(t1), t ≠ fow.tid, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
fow = W(v, t1), t ≠ fow.tid, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: FOW freely generated by FO, W;;
| fow = FO(t1), t ≠ fow.tid, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0), fowl0 = fowl2 + FO(t1) ' + fowl3 ∧ fowl2 | t1 = [] ∧ reorder(l, fowl1, fowl2 + fowl3, rfo) ∨ fowl0 | t1 = [] ∧ FO(l) ∈ rfo(t1) ∧ reorder(l, fowl1, fowl0, rfo(t1 := rfo(t1) -1l FO(l))) ⊦
Used simplifier rules: reorder-rec-FO: ⊦ reorder(l, FO(t) ' + fowl, fowl0, rfo) ↔ (∃ fowl1, fowl2. fowl0 = fowl1 + FO(t) ' + fowl2 ∧ fowl1 | t = [] ∧ reorder(l, fowl, fowl1 + fowl2, rfo)) ∨ fowl0 | t = [] ∧ FO(l) ∈ rfo(t) ∧ reorder(l, fowl, fowl0, rfo(t := rfo(t) -1l FO(l))); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ FO(tid).tid = tid; (s)
| t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0), fowl0 = fowl2 + FO(t1) ' + fowl3 ∧ fowl2 | t1 = [] ∧ reorder(l, fowl1, fowl2 + fowl3, rfo) ∨ fowl0 | t1 = [] ∧ FO(l) ∈ rfo(t1) ∧ reorder(l, fowl1, fowl0, rfo(t1 := rfo(t1) -1l FO(l))) ⊦ |
fowl0 = fowl2 + FO(t1) ' + fowl3, fowl2 | t1 = [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
fowl0 | t1 = [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t1 := rfo(t1) -1l FO(l))), FO(l) ∈ rfo(t1), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
| fowl0 = fowl2 + FO(t1) ' + fowl3, fowl2 | t1 = [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl2 | t1 = [], t ≠ t1, fowl1 | t ≠ ((fowl2 | t) + (fowl3 | t)) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ FO(tid).tid = tid; (s) ⊦ fow ' | t = (t = fow.tid ⊃ fow ';[]); (s) ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s)
| fowl2 | t1 = [], t ≠ t1, fowl1 | t ≠ ((fowl2 | t) + (fowl3 | t)) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2 + fowl3, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
Used simplifier rules: ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: t, fowl2 + fowl3, l, rfo
| fowl0 | t1 = [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0, rfo(t1 := rfo(t1) -1l FO(l))), FO(l) ∈ rfo(t1), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
Used terms: t, fowl0, l, rfo(t1 := rfo(t1) -1l FO(l))
| fow = W(v, t1), t ≠ fow.tid, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fow ' + fowl1, fowl0, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fowl0.head = W(v, t1), fowl0 ≠ [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0.tail, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: reorder-rec-W: ⊦ reorder(l, W(v, t) ' + fowl0, fowl1, rfo) ↔ fowl1 ≠ [] ∧ fowl1.head = W(v, t) ∧ reorder(l, fowl0, fowl1.tail, rfo); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ W(v, tid).tid = tid; (s)
| fowl0.head = W(v, t1), fowl0 ≠ [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl0.tail, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
fow = W(v, t1), fowl0 = fow + fowl2, fowl0 ≠ [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: fowl0, fow, fowl2
| fow = W(v, t1), fowl0 = fow + fowl2, fowl0 ≠ [], t ≠ t1, fowl1 | t ≠ (fowl0 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
t ≠ t1, fowl1 | t ≠ (fowl2 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ W(v, tid).tid = tid; (s) ⊦ fow ' | t = (t = fow.tid ⊃ fow ';[]); (s) ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s) ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| t ≠ t1, fowl1 | t ≠ (fowl2 | t) + propFOs(t, l, rfo(t)), rfo(t).forall(.FO?), reorder(l, fowl1, fowl2, rfo), ∀ t0, fowl, l0, rfo0. fowl1 | t0 = (fowl | t0) + propFOs(t0, l0, rfo0(t0)) ∨ ¬ rfo0(t0).forall(.FO?) ∨ ¬ reorder(l0, fowl1, fowl, rfo0) ⊦ |
Used terms: t, fowl2, l, rfo
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.