| frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + (al + ARetInsert(tid, true))), SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), ¬ tid ∈ setExt !(al).map(.tid) ⊦ e ∈ sl.last.gstate.set |
SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + (al + ARetInsert(tid, true))), ¬ e ∈ sl.last.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
| SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + (al + ARetInsert(tid, true))), ¬ e ∈ sl.last.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
sl = sl0 + s ', sl ≠ [], SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + (al + ARetInsert(tid, true))), ¬ e ∈ s.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
Used simplifier rules: ⊦ x + a = x + a '; (s) ⊦ a + x = a ' + x; (s) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.last ∧ y = x.butlast ↔ x = y + a '; (elim) Used terms: sl, s, sl0
| sl = sl0 + s ', sl ≠ [], SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + (al + ARetInsert(tid, true))), ¬ e ∈ s.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
SetInv((sl0 + s ').head.gstate, (sl0 + s ').head.lsf, (sl0 + s ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0 + s ', AInvInsert(tid, e) ' + al + ARetInsert(tid, true) '), ¬ e ∈ s.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s) ⊦ x + a = x + a '; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| SetInv((sl0 + s ').head.gstate, (sl0 + s ').head.lsf, (sl0 + s ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0 + s ', AInvInsert(tid, e) ' + al + ARetInsert(tid, true) '), ¬ e ∈ s.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
⊦ frag*(IOAut(start, step, ext))(sl + s ', al + a ') ↔ step(sl.last, a, s) ∧ frag*(IOAut(start, step, ext))(sl, al)
SetInv((sl0 + s ').head.gstate, (sl0 + s ').head.lsf, (sl0 + s ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), s), ¬ e ∈ s.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: AInvInsert(tid, e) ' + al, s, setExt, sl0, ARetInsert(tid, true), setInit, setStep
| ⊦ frag*(IOAut(start, step, ext))(sl + s ', al + a ') ↔ step(sl.last, a, s) ∧ frag*(IOAut(start, step, ext))(sl, al) |
| SetInv((sl0 + s ').head.gstate, (sl0 + s ').head.lsf, (sl0 + s ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), s), ¬ e ∈ s.gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
s = mkstate(gstate, lsf, pcf), SetInv((sl0 + s ').head.gstate, (sl0 + s ').head.lsf, (sl0 + s ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), s), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
Used simplifier rules: ⊦ (gstate = s.gstate ∧ lsf = s.lsf) ∧ pcf = s.pcf ↔ s = mkstate(gstate, lsf, pcf); (elim) Used terms: s, gstate, lsf, pcf
| s = mkstate(gstate, lsf, pcf), SetInv((sl0 + s ').head.gstate, (sl0 + s ').head.lsf, (sl0 + s ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), s), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
SetInv((sl0 + mkstate(gstate, lsf, pcf) ').head.gstate, (sl0 + mkstate(gstate, lsf, pcf) ').head.lsf, (sl0 + mkstate(gstate, lsf, pcf) ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
| SetInv((sl0 + mkstate(gstate, lsf, pcf) ').head.gstate, (sl0 + mkstate(gstate, lsf, pcf) ').head.lsf, (sl0 + mkstate(gstate, lsf, pcf) ').head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
sl0 + mkstate(gstate, lsf, pcf) ' = s + sl, sl0 + mkstate(gstate, lsf, pcf) ' ≠ [], SetInv(s.gstate, s.lsf, s.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
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 + mkstate(gstate, lsf, pcf) ', s, sl
| sl0 + mkstate(gstate, lsf, pcf) ' = s + sl, sl0 + mkstate(gstate, lsf, pcf) ' ≠ [], SetInv(s.gstate, s.lsf, s.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
sl0 + mkstate(gstate, lsf, pcf) ' = s ' + sl, SetInv(s.gstate, s.lsf, s.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstate.set, mkstate(gstate, lsf, pcf) = s ∨ mkstate(gstate, lsf, pcf) ∈ sl, s ∈ sl0 ∨ s = mkstate(gstate, lsf, pcf) ⊦
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 + mkstate(gstate, lsf, pcf) ' = s ' + sl, SetInv(s.gstate, s.lsf, s.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstate.set, mkstate(gstate, lsf, pcf) = s ∨ mkstate(gstate, lsf, pcf) ∈ sl, s ∈ sl0 ∨ s = mkstate(gstate, lsf, pcf) ⊦ |
sl0 + mkstate(gstate, lsf, pcf) ' = s ' + sl, s = mkstate(gstate0, lsf0, pcf0), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstate.set, s ∈ sl0 ∨ s = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = s ∨ mkstate(gstate, lsf, pcf) ∈ sl ⊦
Used simplifier rules: ⊦ (gstate = s.gstate ∧ lsf = s.lsf) ∧ pcf = s.pcf ↔ s = mkstate(gstate, lsf, pcf); (elim) Used terms: s, gstate0, lsf0, pcf0
| sl0 + mkstate(gstate, lsf, pcf) ' = s ' + sl, s = mkstate(gstate0, lsf0, pcf0), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstate.set, s ∈ sl0 ∨ s = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = s ∨ mkstate(gstate, lsf, pcf) ∈ sl ⊦ |
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦
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
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦ |
frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + al), SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), ¬ tid ∈ setExt !(al).map(.tid) ⊦ sl.last.pcf(tid) = invInsert ∧ sl.last.lsf(tid).le = e ∨ sl.last.pcf(tid) = retInsert ∧ (sl.last.lsf(tid).lb → e ∈ sl.last.gstate.set)
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl ⊦ frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) + al) ∧ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf)
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, sl0.last.pcf(tid) = invInsert ∧ sl0.last.lsf(tid).le = e ∨ sl0.last.pcf(tid) = retInsert ∧ (sl0.last.lsf(tid).lb → e ∈ sl0.last.gstate.set) ⊦
Used terms: sl0, tid, e, al
| frag*(IOAut(setInit, setStep, setExt))(sl, AInvInsert(tid, e) + al), SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), ¬ tid ∈ setExt !(al).map(.tid) ⊦ sl.last.pcf(tid) = invInsert ∧ sl.last.lsf(tid).le = e ∨ sl.last.pcf(tid) = retInsert ∧ (sl.last.lsf(tid).lb → e ∈ sl.last.gstate.set) |
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl ⊦ frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) + al) ∧ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf) |
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s)
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦ |
Used simplifier rules: ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y; (ws) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) ⊦ a + x = a ' + x; (s) ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list ⊦ mkstate(gstate, lsf, pcf).gstate = gstate; (s) ⊦ mkstate(gstate, lsf, pcf).lsf = lsf; (s) ⊦ mkstate(gstate, lsf, pcf).pcf = pcf; (s) ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) ⊦ a ∈ a0 ' ↔ a = a0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) ⊦ mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ↔ gstate = gstate0 ∧ lsf = lsf0 ∧ pcf = pcf0; (ws) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl0, s, sl1
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, sl0.last.pcf(tid) = invInsert ∧ sl0.last.lsf(tid).le = e ∨ sl0.last.pcf(tid) = retInsert ∧ (sl0.last.lsf(tid).lb → e ∈ sl0.last.gstate.set) ⊦ |
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦
Used simplifier rules: ⊦ (gstate = s.gstate ∧ lsf = s.lsf) ∧ pcf = s.pcf ↔ s = mkstate(gstate, lsf, pcf); (elim) Used terms: sl0.last, gstate1, lsf1, pcf1
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(sl0.last, ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦ |
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(mkstate(gstate1, lsf1, pcf1), ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set) ⊦
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), setStep(mkstate(gstate1, lsf1, pcf1), ARetInsert(tid, true), mkstate(gstate, lsf, pcf)), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set) ⊦ |
⊦ setStep(mkstate(gs, lsf, pcf), a, mkstate(gs0, lsf0, pcf0)) ↔ (∃ tid, ls, pc. lstep(gs, lsf(tid), pcf(tid), a, gs0, ls, pc) ∧ lsf0 = lsf(tid := ls) ∧ pcf0 = pcf(tid := pc))
sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), ∃ tid0, ls, pc. lstep(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true), gstate, ls, pc) ∧ lsf = lsf1(tid0 := ls) ∧ pcf = pcf1(tid0 := pc), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦
Used terms: lsf1, pcf1, pcf, lsf, gstate, gstate1, ARetInsert(tid, true)
| ⊦ setStep(mkstate(gs, lsf, pcf), a, mkstate(gs0, lsf0, pcf0)) ↔ (∃ tid, ls, pc. lstep(gs, lsf(tid), pcf(tid), a, gs0, ls, pc) ∧ lsf0 = lsf(tid := ls) ∧ pcf0 = pcf(tid := pc)) |
| sl0 + mkstate(gstate, lsf, pcf) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), ¬ e ∈ gstate.set, ¬ tid ∈ setExt !(al).map(.tid), ∃ tid0, ls, pc. lstep(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true), gstate, ls, pc) ∧ lsf = lsf1(tid0 := ls) ∧ pcf = pcf1(tid0 := pc), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate(gstate, lsf, pcf) ∈ sl, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate(gstate, lsf, pcf) ⊦ |
sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ⊦
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 ⊦ lstep(gs, ls, pc, a, gs0, ls0, pc0) ↔ pre(gs, ls, pc, a) ∧ ls0 = lstepf(gs, ls, pc, a) ∧ gs0 = gstepf(gs, ls, pc, a) ∧ pc0 = pcstepf(gs, ls, pc, a); (s)
| sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ⊦ |
SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl, al) ⊦ sl.head.gstate.set ⊆ sl.last.gstate.set ∧ SetInv(sl.last.gstate, sl.last.lsf, sl.last.pcf)
sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), ¬ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl ⊦
sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), SetInv(sl0.last.gstate, sl0.last.lsf, sl0.last.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), sl0.head.gstate.set ⊆ sl0.last.gstate.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl ⊦
Used terms: sl0, AInvInsert(tid, e) ' + al
| SetInv(sl.head.gstate, sl.head.lsf, sl.head.pcf), frag*(IOAut(setInit, setStep, setExt))(sl, al) ⊦ sl.head.gstate.set ⊆ sl.last.gstate.set ∧ SetInv(sl.last.gstate, sl.last.lsf, sl.last.pcf) |
| sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), ¬ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl ⊦ |
sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), ¬ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ⊦
| sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), ¬ SetInv(sl0.head.gstate, sl0.head.lsf, sl0.head.pcf), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ⊦ |
Used simplifier rules: ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y; (ws) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) ⊦ a + x = a ' + x; (s) ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) ⊦ a ∈ a0 ' ↔ a = a0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ mkstate(gstate, lsf, pcf).gstate = gstate; (s) ⊦ mkstate(gstate, lsf, pcf).lsf = lsf; (s) ⊦ mkstate(gstate, lsf, pcf).pcf = pcf; (s) ⊦ [] + x = x; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) ⊦ mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ↔ gstate = gstate0 ∧ lsf = lsf0 ∧ pcf = pcf0; (ws) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl0, s, sl1
| sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), SetInv(sl0.last.gstate, sl0.last.lsf, sl0.last.pcf), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), sl0.head.gstate.set ⊆ sl0.last.gstate.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl ⊦ |
sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), SetInv(gstate1, lsf1, pcf1), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), sl0.head.gstate.set ⊆ gstate1.set, ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl ⊦
Used simplifier rules: ⊦ mkstate(gstate, lsf, pcf).gstate = gstate; (s) ⊦ mkstate(gstate, lsf, pcf).pcf = pcf; (s) ⊦ mkstate(gstate, lsf, pcf).lsf = lsf; (s)
| sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), SetInv(gstate1, lsf1, pcf1), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), sl0.head.gstate.set ⊆ gstate1.set, ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl ⊦ |
sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), sl0 = s + sl1, sl0 ≠ [], SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), s.gstate.set ⊆ gstate1.set, ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ⊦
Used simplifier rules: ⊦ [] + x = x; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ mkstate(gstate, lsf, pcf) = mkstate(gstate0, lsf0, pcf0) ↔ gstate = gstate0 ∧ lsf = lsf0 ∧ pcf = pcf0; (ws) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl0, s, sl1
| sl0 + mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ' = mkstate(gstate0, lsf0, pcf0) ' + sl, sl0.last = mkstate(gstate1, lsf1, pcf1), sl0 = s + sl1, sl0 ≠ [], SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(sl0, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), s.gstate.set ⊆ gstate1.set, ¬ tid ∈ setExt !(al).map(.tid), ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) = mkstate(gstate0, lsf0, pcf0) ∨ mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ∈ sl, pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set), mkstate(gstate0, lsf0, pcf0) ∈ sl0 ∨ mkstate(gstate0, lsf0, pcf0) = mkstate (gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), lsf1(tid0 := lstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true))), pcf1(tid0 := pcstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)))) ⊦ |
(mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set) ⊦
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) ⊦ mkstate(gstate, lsf, pcf).gstate = gstate; (s) in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y; (ws)
| (mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), pcf1(tid) = invInsert ∧ lsf1(tid).le = e ∨ pcf1(tid) = retInsert ∧ (lsf1(tid).lb → e ∈ gstate1.set) ⊦ |
(mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), lsf1(tid).le = e, pcf1(tid) = invInsert, SetInv(gstate0, lsf0, pcf0), SetInv(gstate1, lsf1, pcf1), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
(mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid) = retInsert, SetInv(gstate0, lsf0, pcf0), SetInv(gstate1, lsf1, pcf1), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), lsf1(tid).lb → e ∈ gstate1.set ⊦
| (mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), lsf1(tid).le = e, pcf1(tid) = invInsert, SetInv(gstate0, lsf0, pcf0), SetInv(gstate1, lsf1, pcf1), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
(mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid) = invInsert, SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, lsf1(tid).le) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ lsf1(tid).le ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid) ⊦
| (mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid) = invInsert, SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, lsf1(tid).le) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ lsf1(tid).le ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid) ⊦ |
Used simplifier rules: inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; SetPC freely generated by idle, invInsert, invMember, retInsert, retMember;; ⊦ pre(gs, ls, retMember, a) ↔ (∃ b0. a = ARetMember(ls.tid, b0) ∧ (b0 ↔ ls.lb)); (s) ⊦ ARetInsert(tid, b) ≠ ARetMember(tid0, b0); (s) ⊦ pre(gs, ls, retInsert, a) ↔ (∃ b0. a = ARetInsert(ls.tid, b0) ∧ (b0 ↔ ls.lb)); (s) ⊦ ARetInsert(tid, b) = ARetInsert(tid0, b0) ↔ tid = tid0 ∧ (b ↔ b0); (ws) ⊦ invInsert ≠ retInsert; (s) ⊦ pre(gs, ls, invMember, a) ↔ a = ADoMember(ls.tid); (s) ⊦ ADoMember(tid) ≠ ARetInsert(tid0, b); (s) ⊦ pre(gs, ls, invInsert, a) ↔ (∃ b. a = ADoInsert(ls.tid, b)); (s) ⊦ ADoInsert(tid, b) ≠ ARetInsert(tid0, b0); (s) ⊦ pre(gs, ls, idle, a) ↔ (∃ e. a = AInvInsert(ls.tid, e) ∧ e ≠ ⊥) ∨ (∃ e. a = AInvMember(ls.tid, e) ∧ e ≠ ⊥); (s) ⊦ AInvInsert(tid, e) ≠ ARetInsert(tid0, b); (s) ⊦ AInvMember(tid, e) ≠ ARetInsert(tid0, b); (s)
| (mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid) = retInsert, SetInv(gstate0, lsf0, pcf0), SetInv(gstate1, lsf1, pcf1), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), lsf1(tid).lb → e ∈ gstate1.set ⊦ |
(mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid) = retInsert, pcf1(tid0) = retInsert, SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), lsf1(tid).lb → e ∈ gstate1.set ⊦
Used simplifier rules: inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; SetPC freely generated by idle, invInsert, invMember, retInsert, retMember;; ⊦ pre(gs, ls, retMember, a) ↔ (∃ b0. a = ARetMember(ls.tid, b0) ∧ (b0 ↔ ls.lb)); (s) ⊦ ARetInsert(tid, b) ≠ ARetMember(tid0, b0); (s) ⊦ pre(gs, ls, invMember, a) ↔ a = ADoMember(ls.tid); (s) ⊦ ADoMember(tid) ≠ ARetInsert(tid0, b); (s) ⊦ pre(gs, ls, invInsert, a) ↔ (∃ b. a = ADoInsert(ls.tid, b)); (s) ⊦ ADoInsert(tid, b) ≠ ARetInsert(tid0, b0); (s) ⊦ pre(gs, ls, idle, a) ↔ (∃ e. a = AInvInsert(ls.tid, e) ∧ e ≠ ⊥) ∨ (∃ e. a = AInvMember(ls.tid, e) ∧ e ≠ ⊥); (s) ⊦ AInvInsert(tid, e) ≠ ARetInsert(tid0, b); (s) ⊦ AInvMember(tid, e) ≠ ARetInsert(tid0, b); (s)
| (mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid) = retInsert, pcf1(tid0) = retInsert, SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid, e) ' + al), pre(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)), gstate0.set ⊆ gstate1.set, ¬ e ∈ gstepf(gstate1, lsf1(tid0), pcf1(tid0), ARetInsert(tid, true)).set, ¬ tid ∈ setExt !(al).map(.tid), lsf1(tid).lb → e ∈ gstate1.set ⊦ |
(mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid0) = retInsert, # gstate1.set ≠ 0, gstate1.set ≠ ∅, lsf1(tid0).lb, SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid0, e) ' + al), e ∈ gstate1.set, gstate0.set ⊆ gstate1.set, ¬ tid0 ∈ setExt !(al).map(.tid), ¬ e ∈ gstepf(gstate1, lsf1(tid0), retInsert, ARetInsert(tid0, true)).set ⊦
Used simplifier rules: inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; size-zero-01: ⊦ s ≠ ∅ → # s ≠ 0; (forward) from specification set-basic ne-01: ⊦ a ∈ s → s ≠ ∅; (forward) from specification set-basic ⊦ ARetInsert(tid, b) = ARetInsert(tid0, b0) ↔ tid = tid0 ∧ (b ↔ b0); (ws) ⊦ pre(gs, ls, retInsert, a) ↔ (∃ b0. a = ARetInsert(ls.tid, b0) ∧ (b0 ↔ ls.lb)); (s)
| (mkstate(gstate0, lsf0, pcf0) ' + sl1).last = mkstate(gstate1, lsf1, pcf1), pcf1(tid0) = retInsert, # gstate1.set ≠ 0, gstate1.set ≠ ∅, lsf1(tid0).lb, SetInv(gstate1, lsf1, pcf1), SetInv(gstate0, lsf0, pcf0), frag*(IOAut(setInit, setStep, setExt))(mkstate(gstate0, lsf0, pcf0) ' + sl1, AInvInsert(tid0, e) ' + al), e ∈ gstate1.set, gstate0.set ⊆ gstate1.set, ¬ tid0 ∈ setExt !(al).map(.tid), ¬ e ∈ gstepf(gstate1, lsf1(tid0), retInsert, ARetInsert(tid0, true)).set ⊦ |
⊦ ls.tid = tid → gstepf(gs, ls, retInsert, ARetInsert(tid, b0)) = gs
Used simplifier rules: inv-tid: ⊦ SetInv(gstate, lsf, pcf) → lsf(tid).tid = tid; Used terms: gstate1, lsf1(tid0), tid0, true
| ⊦ ls.tid = tid → gstepf(gs, ls, retInsert, ARetInsert(tid, b0)) = gs |
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.