| ⊦ ls.tid ≠ tid0 ∧ ( (# gs.ar ≠ 0 ∧ htok(gs.ar)) ∧ allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false) ∧ ls.n < # gs.ar ∧ ls.e ≠ ⊥ ∧ ls.sz = # gs.ar ∧ (ls.n0 < # gs.ar ∧ ls.n0 = get_hash(ls.e, ls.sz)) ∧ ¬ ls.b) ∧ pre(gs, ls, I12, a) ∧ pcstepf(gs, ls, I12, a) = I13 → rely(gs.ar, gstepf(gs, ls, I12, a).ar) |
ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, pcstepf(gs, ls, I12, a) = I13, # gs.ar ≠ 0, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n < # gs.ar, ls.n0 < # gs.ar, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), pre(gs, ls, I12, a), ¬ ls.b, ¬ rely(gs.ar, gstepf(gs, ls, I12, a).ar) ⊦
| ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, pcstepf(gs, ls, I12, a) = I13, # gs.ar ≠ 0, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n < # gs.ar, ls.n0 < # gs.ar, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), pre(gs, ls, I12, a), ¬ ls.b, ¬ rely(gs.ar, gstepf(gs, ls, I12, a).ar) ⊦ |
ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n < ls.sz, ls.n0 < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, ¬ rely(gs.ar, (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar) ⊦
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ gstepf(gs, ls, I12, a) = (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs); (s) ⊦ pre(gs, ls, I12, a) ↔ a = (gs.ar[ls.n] = ⊥ ∨ gs.ar[ls.n] = ls.e ⊃ doINSERT(ls.tid, true);τ); (s) ⊦ pcstepf(gs, ls, I12, a) = I13; (s)
| ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n < ls.sz, ls.n0 < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, ¬ rely(gs.ar, (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar) ⊦ |
⊦ rely(ar, ar0) ↔ # ar = # ar0 ∧ (∀ n. n < # ar → ar[n] ≠ ⊥ → ar0[n] = ar[n])
ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n0 < ls.sz, ls.n < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, # gs.ar ≠ # (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar ∨ (∃ n. ¬(n < # gs.ar → gs.ar[n] ≠ ⊥ → (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar[n] = gs.ar[n])) ⊦
Used terms: gs.ar, (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar
| ⊦ rely(ar, ar0) ↔ # ar = # ar0 ∧ (∀ n. n < # ar → ar[n] ≠ ⊥ → ar0[n] = ar[n]) |
| ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n0 < ls.sz, ls.n < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, # gs.ar ≠ # (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar ∨ (∃ n. ¬(n < # gs.ar → gs.ar[n] ≠ ⊥ → (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar[n] = gs.ar[n])) ⊦ |
ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n < ls.sz, ls.n0 < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, ls.sz ≠ # (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar ∨ ¬(n < ls.sz → gs.ar[n] ≠ ⊥ → (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar[n] = gs.ar[n]) ⊦
| ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n < ls.sz, ls.n0 < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, ls.sz ≠ # (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar ∨ ¬(n < ls.sz → gs.ar[n] ≠ ⊥ → (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar[n] = gs.ar[n]) ⊦ |
ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, gs.ar[ls.n] = ⊥, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n0 < ls.sz, ls.n < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, ls.sz ≠ # (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar ∨ ¬(n < ls.sz → gs.ar[n] ≠ ⊥ → (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar[n] = gs.ar[n]) ⊦
Used formulas: gs.ar[ls.n] = ⊥
| ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, gs.ar[ls.n] = ⊥, ls.e ≠ ⊥, ls.tid ≠ tid0, ls.n0 < ls.sz, ls.n < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b, ls.sz ≠ # (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar ∨ ¬(n < ls.sz → gs.ar[n] ≠ ⊥ → (gs.ar[ls.n] = ⊥ ⊃ gs.ar:= gs.ar[ls.n := ls.e];gs).ar[n] = gs.ar[n]) ⊦ |
ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, gs.ar[ls.n] = ⊥, ls.e ≠ ⊥, ls.tid ≠ tid0, gs.ar[n] ≠ ⊥, (gs.ar[ls.n := ls.e])[n] ≠ gs.ar[n], n < ls.sz, ls.n0 < ls.sz, ls.n < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b ⊦
Used simplifier rules: lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic ⊦ (gs.ar:= ar).ar = ar; (s) ⊦ # ar[n := a] = # ar; (s)
| ls.n0 = get_hash(ls.e, ls.sz), ls.sz = # gs.ar, gs.ar[ls.n] = ⊥, ls.e ≠ ⊥, ls.tid ≠ tid0, gs.ar[n] ≠ ⊥, (gs.ar[ls.n := ls.e])[n] ≠ gs.ar[n], n < ls.sz, ls.n0 < ls.sz, ls.n < ls.sz, allslotsfull(gs.ar, ls.n0, ls.n, ls.e, false), htok(gs.ar), ¬ ls.b ⊦ |
Used simplifier rules: ⊦ m ≠ n → (ar[n := a])[m] = ar[m]; (s) Used formulas: n = ls.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.