| okspmx(spmx, r, # x) ⊦ ⟪MULT#(spmx, r, x; ; y)⟫ (y = spmx.toMatrix(r, # x) * x) |
spmx = spmx0, okspmx(spmx0, r, # x) ⊦ ⟪y := mkvector(r); while spmx ≠ ∅ do {/* _:invariant y + spmx.toMatrix(r, # x) * x = (spmx`).toMatrix(r, # x) * x ∧ spmx ⊆ spmx` ∧ # y = r wfbound # spmx; */; choose np with np ∈ spmx in {y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np}}⟫ (y = spmx0.toMatrix(r, # x) * x)
Used simplifier rules: MULT: ⊦ ;
| spmx = spmx0, okspmx(spmx0, r, # x) ⊦ ⟪y := mkvector(r); while spmx ≠ ∅ do {/* _:invariant y + spmx.toMatrix(r, # x) * x = (spmx`).toMatrix(r, # x) * x ∧ spmx ⊆ spmx` ∧ # y = r wfbound # spmx; */; choose np with np ∈ spmx in {y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np}}⟫ (y = spmx0.toMatrix(r, # x) * x) |
spmx = spmx0, y = mkvector(r), okspmx(spmx0, r, # x) ⊦ ⟪while spmx ≠ ∅ do {/* _:invariant y + spmx.toMatrix(r, # x) * x = (spmx`).toMatrix(r, # x) * x ∧ spmx ⊆ spmx` ∧ # y = r wfbound # spmx; */; choose np with np ∈ spmx in {y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np}}⟫ (y = spmx0.toMatrix(r, # x) * x)
| spmx = spmx0, y = mkvector(r), okspmx(spmx0, r, # x) ⊦ ⟪while spmx ≠ ∅ do {/* _:invariant y + spmx.toMatrix(r, # x) * x = (spmx`).toMatrix(r, # x) * x ∧ spmx ⊆ spmx` ∧ # y = r wfbound # spmx; */; choose np with np ∈ spmx in {y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np}}⟫ (y = spmx0.toMatrix(r, # x) * x) |
spmx = spmx0, y = mkvector(r), okspmx(spmx0, r, # x) ⊦ y + spmx.toMatrix(r, # x) * x = spmx.toMatrix(r, # x) * x ∧ spmx ⊆ spmx ∧ # y = r
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), spmx ⊆ spmx2 ⊦ ⟪choose np with np ∈ spmx in {y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np}⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1)
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = ∅, spmx2 = spmx0, y0 = mkvector(r), y ≠ spmx0.toMatrix(r, # x) * x, okspmx(spmx0, r, # x), spmx ⊆ spmx2 ⊦
Used formulas: y + spmx.toMatrix(r, # x) * x = (spmx`).toMatrix(r, # x) * x ∧ spmx ⊆ spmx` ∧ # y = r, # spmx = # spmx
| spmx = spmx0, y = mkvector(r), okspmx(spmx0, r, # x) ⊦ y + spmx.toMatrix(r, # x) * x = spmx.toMatrix(r, # x) * x ∧ spmx ⊆ spmx ∧ # y = r |
mkvector(r) + spmx0.toMatrix(r, # x) * x ≠ spmx0.toMatrix(r, # x) * x, okspmx(spmx0, r, # x) ⊦
Used simplifier rules: ⊦ # mkvector(n) = n; (s) ⊦ st ⊆ st; (s)
| mkvector(r) + spmx0.toMatrix(r, # x) * x ≠ spmx0.toMatrix(r, # x) * x, okspmx(spmx0, r, # x) ⊦ |
⊦ # x = n → mkvector(n) + x = x
#(spmx0.toMatrix(r, # x) * x) ≠ r, mkvector(r) + spmx0.toMatrix(r, # x) * x ≠ spmx0.toMatrix(r, # x) * x, okspmx(spmx0, r, # x) ⊦
Used terms: r, spmx0.toMatrix(r, # x) * x
| ⊦ # x = n → mkvector(n) + x = x |
| #(spmx0.toMatrix(r, # x) * x) ≠ r, mkvector(r) + spmx0.toMatrix(r, # x) * x ≠ spmx0.toMatrix(r, # x) * x, okspmx(spmx0, r, # x) ⊦ |
⊦ #c mx = # vec → #(mx * vec) = #r mx
Used simplifier rules: toMatrix-colno: ⊦ #c spmx.toMatrix(r, c) = c; toMatrix-colno: ⊦ #c spmx.toMatrix(r, c) = c; toMatrix-rowno: ⊦ #r spmx.toMatrix(r, c) = r; Used terms: spmx0.toMatrix(r, # x), x
| ⊦ #c mx = # vec → #(mx * vec) = #r mx |
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), spmx ⊆ spmx2 ⊦ ⟪choose np with np ∈ spmx in {y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np}⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1) |
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2 ⊦ ⟪y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1)
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), spmx ⊆ spmx2, ∀ np. ¬ np ∈ spmx ⊦ ⟪abort⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1)
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2 ⊦ ⟪y[np.r] := y[np.r] + spmx[np] * x[np.c]; spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1) |
# y1 = r, y1 + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y = y1[np.r, y1[np.r] + spmx[np] * x[np.c]], y0 = mkvector(r), spmx ≠ ∅, np.r < # y1, np.c < # x, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2 ⊦ ⟪spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1)
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, np.r < # y, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.c < # x ⊦ ⟪throw ]⟫ ⟪spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1)
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.r < # y ⊦ ⟪throw ]⟫ ⟪spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1)
| # y1 = r, y1 + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y = y1[np.r, y1[np.r] + spmx[np] * x[np.c]], y0 = mkvector(r), spmx ≠ ∅, np.r < # y1, np.c < # x, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2 ⊦ ⟪spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1) |
# y1 = r, y1 + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y = y1[np.r, y1[np.r] + spmx[np] * x[np.c]], y0 = mkvector(r), spmx ≠ ∅, np.c < # x, np.r < # y1, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2 ⊦ (y + (spmx -- np).toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx -- np ⊆ spmx2 ∧ # y = r) ∧ #(spmx -- np) < # spmx1
| # y1 = r, y1 + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y = y1[np.r, y1[np.r] + spmx[np] * x[np.c]], y0 = mkvector(r), spmx ≠ ∅, np.c < # x, np.r < # y1, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2 ⊦ (y + (spmx -- np).toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx -- np ⊆ spmx2 ∧ # y = r) ∧ #(spmx -- np) < # spmx1 |
y1 + spmx1.toMatrix(# y1, # x) * x = spmx0.toMatrix(# y1, # x) * x, y1[np.r, y1[np.r] + spmx1[np] * x[np.c]] + (spmx1 -- np).toMatrix(# y1, # x) * x ≠ spmx0.toMatrix(# y1, # x) * x, spmx1 ≠ ∅, np.c < # x, np.r < # y1, okspmx(spmx0, # y1, # x), np ∈ spmx1, spmx1 ⊆ spmx0 ⊦
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ n < n; (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s) ⊦ # st = 0 ↔ st = ∅; (s) ⊦ m < 1 ↔ m = 0; (s) ⊦ m ≤ n ↔ ¬ n < m; (ss) ⊦ n -1 = n - 1; (s) ⊦ a ∈ st → #(st -- a) = (# st)-1; (s) ⊦ # ar[n, a] = # ar; (s) ⊦ st ⊆ st0 → (st -- a ⊆ st0 ↔ true); (ss)
| y1 + spmx1.toMatrix(# y1, # x) * x = spmx0.toMatrix(# y1, # x) * x, y1[np.r, y1[np.r] + spmx1[np] * x[np.c]] + (spmx1 -- np).toMatrix(# y1, # x) * x ≠ spmx0.toMatrix(# y1, # x) * x, spmx1 ≠ ∅, np.c < # x, np.r < # y1, okspmx(spmx0, # y1, # x), np ∈ spmx1, spmx1 ⊆ spmx0 ⊦ |
Used simplifier rules: main-lemma: ⊦ r × c ∈ spmx ∧ c < # x ∧ r < # y → y[r, y[r] + spmx[r × c] * x[c]] + (spmx -- (r × c)).toMatrix(# y, # x) * x = y + spmx.toMatrix(# y, # x) * x; multassoc: ⊦ (a * b) * c = a * b * c; from specification ring addassoc: ⊦ (a + b) + c = a + b + c; from specification ring addcom: ⊦ a + b = b + a; from specification ring ⊦ r = np.r ∧ c = np.c ↔ np = r × c; (elim) Used terms: np, r, c
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, np.r < # y, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.c < # x ⊦ ⟪throw ]⟫ ⟪spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1) |
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, np.r < # y, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.c < # x ⊦
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, np.r < # y, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.c < # x ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, np.r < # y, okspmx(spmx0, # y, # x), np ∈ spmx, # x ≤ np.c, spmx ⊆ spmx0 ⊦
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ m < n ↔ ¬ n ≤ m; (ss)
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, np.r < # y, okspmx(spmx0, # y, # x), np ∈ spmx, # x ≤ np.c, spmx ⊆ spmx0 ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, np = r × c, spmx ≠ ∅, r < # y, okspmx(spmx0, # y, # x), np ∈ spmx, # x ≤ c, spmx ⊆ spmx0 ⊦
Used simplifier rules: ⊦ r = np.r ∧ c = np.c ↔ np = r × c; (elim) Used terms: np, r, c
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, np = r × c, spmx ≠ ∅, r < # y, okspmx(spmx0, # y, # x), np ∈ spmx, # x ≤ c, spmx ⊆ spmx0 ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, r < # y, okspmx(spmx0, # y, # x), r × c ∈ spmx, # x ≤ c, spmx ⊆ spmx0 ⊦
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, r < # y, okspmx(spmx0, # y, # x), r × c ∈ spmx, # x ≤ c, spmx ⊆ spmx0 ⊦ |
⊦ okspmx(spmx, r, c) ↔ (∀ np. np ∈ spmx → np.r < r ∧ np.c < c)
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, r < # y, r × c ∈ spmx, # x ≤ c, spmx ⊆ spmx0, ∀ np. np ∈ spmx0 → np.r < # y ∧ np.c < # x ⊦
Used terms: spmx0, # y, # x
| ⊦ okspmx(spmx, r, c) ↔ (∀ np. np ∈ spmx → np.r < r ∧ np.c < c) |
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, r < # y, r × c ∈ spmx, # x ≤ c, spmx ⊆ spmx0, ∀ np. np ∈ spmx0 → np.r < # y ∧ np.c < # x ⊦ |
Used simplifier rules: ⊦ (n × n0).r = n; (s) ⊦ (n × n0).c = n0; (s) ⊦ m ≤ n → (n < m ↔ false); (s) ⊦ b ∈ st ∧ ¬ b ∈ st0 → ¬ st ⊆ st0; (s) Used terms: r × c
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.r < # y ⊦ ⟪throw ]⟫ ⟪spmx := spmx -- np⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1) |
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.r < # y ⊦
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), np ∈ spmx, spmx ⊆ spmx2, ¬ np.r < # y ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, okspmx(spmx0, # y, # x), np ∈ spmx, # y ≤ np.r, spmx ⊆ spmx0 ⊦
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss)
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, okspmx(spmx0, # y, # x), np ∈ spmx, # y ≤ np.r, spmx ⊆ spmx0 ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, np = r × c, spmx ≠ ∅, okspmx(spmx0, # y, # x), np ∈ spmx, # y ≤ r, spmx ⊆ spmx0 ⊦
Used simplifier rules: ⊦ r = np.r ∧ c = np.c ↔ np = r × c; (elim) Used terms: np, r, c
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, np = r × c, spmx ≠ ∅, okspmx(spmx0, # y, # x), np ∈ spmx, # y ≤ r, spmx ⊆ spmx0 ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, okspmx(spmx0, # y, # x), r × c ∈ spmx, # y ≤ r, spmx ⊆ spmx0 ⊦
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, okspmx(spmx0, # y, # x), r × c ∈ spmx, # y ≤ r, spmx ⊆ spmx0 ⊦ |
⊦ okspmx(spmx, r, c) ↔ (∀ np. np ∈ spmx → np.r < r ∧ np.c < c)
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, r × c ∈ spmx, # y ≤ r, spmx ⊆ spmx0, ∀ np. np ∈ spmx0 → np.r < # y ∧ np.c < # x ⊦
Used terms: spmx0, # y, # x
| ⊦ okspmx(spmx, r, c) ↔ (∀ np. np ∈ spmx → np.r < r ∧ np.c < c) |
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, r × c ∈ spmx, # y ≤ r, spmx ⊆ spmx0, ∀ np. np ∈ spmx0 → np.r < # y ∧ np.c < # x ⊦ |
Used simplifier rules: ⊦ (n × n0).r = n; (s) ⊦ m ≤ n → (n < m ↔ false); (s) ⊦ b ∈ st ∧ ¬ b ∈ st0 → ¬ st ⊆ st0; (s) Used terms: r × c
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), spmx ⊆ spmx2, ∀ np. ¬ np ∈ spmx ⊦ ⟪abort⟫ ((y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x ∧ spmx ⊆ spmx2 ∧ # y = r) ∧ # spmx < # spmx1) |
# y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), spmx ⊆ spmx2, ∀ np. ¬ np ∈ spmx ⊦
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = spmx1, spmx2 = spmx0, y0 = mkvector(r), spmx ≠ ∅, okspmx(spmx0, r, # x), spmx ⊆ spmx2, ∀ np. ¬ np ∈ spmx ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, okspmx(spmx0, # y, # x), spmx ⊆ spmx0, ∀ np. ¬ np ∈ spmx ⊦
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, spmx ≠ ∅, okspmx(spmx0, # y, # x), spmx ⊆ spmx0, ∀ np. ¬ np ∈ spmx ⊦ |
⊦ st1 = st2 ↔ (∀ a. (a ∈ st1 ↔ a ∈ st2) ∧ st1[a] = st2[a])
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, okspmx(spmx0, # y, # x), spmx ⊆ spmx0, ∀ np. ¬ np ∈ spmx, ∃ np. ¬((np ∈ spmx ↔ np ∈ ∅) ∧ spmx[np] = ∅[np]) ⊦
Used terms: spmx, ∅
| ⊦ st1 = st2 ↔ (∀ a. (a ∈ st1 ↔ a ∈ st2) ∧ st1[a] = st2[a]) |
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, okspmx(spmx0, # y, # x), spmx ⊆ spmx0, ∀ np. ¬ np ∈ spmx, ∃ np. ¬((np ∈ spmx ↔ np ∈ ∅) ∧ spmx[np] = ∅[np]) ⊦ |
y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, okspmx(spmx0, # y, # x), np ∈ spmx, spmx ⊆ spmx0, ∀ np. ¬ np ∈ spmx ⊦
Used simplifier rules: ⊦ ¬ a ∈ st → st[a] = ∅[a]; (s) ⊦ ¬ a ∈ ∅; (s)
| y + spmx.toMatrix(# y, # x) * x = spmx0.toMatrix(# y, # x) * x, okspmx(spmx0, # y, # x), np ∈ spmx, spmx ⊆ spmx0, ∀ np. ¬ np ∈ spmx ⊦ |
Used terms: np
| # y = r, y + spmx.toMatrix(r, # x) * x = spmx2.toMatrix(r, # x) * x, spmx = ∅, spmx2 = spmx0, y0 = mkvector(r), y ≠ spmx0.toMatrix(r, # x) * x, okspmx(spmx0, r, # x), spmx ⊆ spmx2 ⊦ |
y + mkvector(# y) = spmx0.toMatrix(# y, # x) * x, y ≠ spmx0.toMatrix(# y, # x) * x, okspmx(spmx0, # y, # x) ⊦
Used simplifier rules: multzero: ⊦ # x = n → ∅.toMatrix(m, n) * x = mkvector(m); ⊦ ∅ ⊆ st; (s)
| y + mkvector(# y) = spmx0.toMatrix(# y, # x) * x, y ≠ spmx0.toMatrix(# y, # x) * x, okspmx(spmx0, # y, # x) ⊦ |
⊦ # vec1 = # vec2 → vec1 + vec2 = vec2 + vec1
Used simplifier rules: addzero: ⊦ # x = n → mkvector(n) + x = x; ⊦ # mkvector(n) = n; (s) Used terms: y, mkvector(# y)
| ⊦ # vec1 = # vec2 → vec1 + vec2 = vec2 + vec1 |
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.