| ⊦ ( ( ctrok(gs.fctr, gs.fwriters) ∧ writersOk(gs.bq, gs.pq, gs.fwriters) ∧ pendingOk(gs.bq, gs.pq) ∧ SFTrailing(gs.bq) ∧ readFOsOk(gs.rfo, gs.fwriters)) ∧ notMember(ls.t, gs.freaders) ∧ notMember(ls.t, gs.fwriters) ∧ noPendingW(ls.t, gs.bq, gs.pq) ∧ ¬ SF ∈ gs.bq(ls.t) ∧ gs.rfo(ls.t) = gs.bq(ls.t)) ∧ pre(gs, ls, W1, a) ∧ pcstepf(gs, ls, W1, a) = W2 → ( ctrok(gstepf(gs, ls, W1, a).fctr, gstepf(gs, ls, W1, a).fwriters) ∧ writersOk(gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq, gstepf(gs, ls, W1, a).fwriters) ∧ pendingOk(gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq) ∧ SFTrailing(gstepf(gs, ls, W1, a).bq) ∧ readFOsOk(gstepf(gs, ls, W1, a).rfo, gstepf(gs, ls, W1, a).fwriters)) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).freaders) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).fwriters) ∧ noPendingW(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq) ∧ ( gstepf(gs, ls, W1, a).rfo(lstepf(gs, ls, W1, a).t) = gstepf(gs, ls, W1, a).bq(lstepf(gs, ls, W1, a).t) ∨ gstepf(gs, ls, W1, a).rfo(lstepf(gs, ls, W1, a).t) + SF ' = gstepf(gs, ls, W1, a).bq(lstepf(gs, ls, W1, a).t)) |
gs.rfo(ls.t) = gs.bq(ls.t), pcstepf(gs, ls, W1, a) = W2, SFTrailing(gs.bq), ctrok(gs.fctr, gs.fwriters), noPendingW(ls.t, gs.bq, gs.pq), notMember(ls.t, gs.freaders), notMember(ls.t, gs.fwriters), pendingOk(gs.bq, gs.pq), pre(gs, ls, W1, a), readFOsOk(gs.rfo, gs.fwriters), writersOk(gs.bq, gs.pq, gs.fwriters), ¬ SF ∈ gs.bq(ls.t) ⊦ ( ctrok(gstepf(gs, ls, W1, a).fctr, gstepf(gs, ls, W1, a).fwriters) ∧ writersOk(gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq, gstepf(gs, ls, W1, a).fwriters) ∧ pendingOk(gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq) ∧ SFTrailing(gstepf(gs, ls, W1, a).bq) ∧ readFOsOk(gstepf(gs, ls, W1, a).rfo, gstepf(gs, ls, W1, a).fwriters)) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).freaders) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).fwriters) ∧ noPendingW(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq) ∧ ( gstepf(gs, ls, W1, a).rfo(lstepf(gs, ls, W1, a).t) = gstepf(gs, ls, W1, a).bq(lstepf(gs, ls, W1, a).t) ∨ gstepf(gs, ls, W1, a).rfo(lstepf(gs, ls, W1, a).t) + SF ' = gstepf(gs, ls, W1, a).bq(lstepf(gs, ls, W1, a).t))
| gs.rfo(ls.t) = gs.bq(ls.t), pcstepf(gs, ls, W1, a) = W2, SFTrailing(gs.bq), ctrok(gs.fctr, gs.fwriters), noPendingW(ls.t, gs.bq, gs.pq), notMember(ls.t, gs.freaders), notMember(ls.t, gs.fwriters), pendingOk(gs.bq, gs.pq), pre(gs, ls, W1, a), readFOsOk(gs.rfo, gs.fwriters), writersOk(gs.bq, gs.pq, gs.fwriters), ¬ SF ∈ gs.bq(ls.t) ⊦ ( ctrok(gstepf(gs, ls, W1, a).fctr, gstepf(gs, ls, W1, a).fwriters) ∧ writersOk(gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq, gstepf(gs, ls, W1, a).fwriters) ∧ pendingOk(gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq) ∧ SFTrailing(gstepf(gs, ls, W1, a).bq) ∧ readFOsOk(gstepf(gs, ls, W1, a).rfo, gstepf(gs, ls, W1, a).fwriters)) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).freaders) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).fwriters) ∧ noPendingW(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).bq, gstepf(gs, ls, W1, a).pq) ∧ ( gstepf(gs, ls, W1, a).rfo(lstepf(gs, ls, W1, a).t) = gstepf(gs, ls, W1, a).bq(lstepf(gs, ls, W1, a).t) ∨ gstepf(gs, ls, W1, a).rfo(lstepf(gs, ls, W1, a).t) + SF ' = gstepf(gs, ls, W1, a).bq(lstepf(gs, ls, W1, a).t)) |
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # y = # y0 → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) ⊦ (gs.bq:= bq).bq = bq; (s) ⊦ x + a = x + a '; (s) ⊦ gstepf(gs, ls, W1, a) = gs.bq:= gs.bq(ls.t := gs.bq(ls.t) + SF); (s) ⊦ lstepf(gs, ls, W1, a) = ls; (s) ⊦ (gs.bq:= bq).rfo = gs.rfo; (s) ⊦ noPendingW(t, bq, pq) → noPendingW(t, bq(t := bq(t) + SF '), pq); (ss) ⊦ (gs.bq:= bq).pq = gs.pq; (s) ⊦ (gs.bq:= bq).fwriters = gs.fwriters; (s) ⊦ (gs.bq:= bq).freaders = gs.freaders; (s) ⊦ SFTrailing(bq(t := bq(t) + be ')) ↔ SFTrailing(bq) ∧ ¬ SF ∈ bq(t); (s) ⊦ pendingOk(bq, pq) → pendingOk(bq(t := bq(t) + SF '), pq); (ss) ⊦ writersOk(bq, pq, writers) → writersOk(bq(t := bq(t) + SF '), pq, writers); (ss) ⊦ (gs.bq:= bq).fctr = gs.fctr; (s) ⊦ pre(gs, ls, W1, a) ↔ a = sfence(ls.t); (s) ⊦ pcstepf(gs, ls, W1, a) = W2; (s)
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.