Coordinate form for vector updates; keeps Index abstract during simplification.
All goals completed! 🐙try 'simp' instead of 'simpa'Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`@[simp]theoremscatterSet_matrix(out:TensorR[n,m])(pi:Finn)(qj:Finm)(v:R):scatterSetout(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,()):=byR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:R⊢ out.scatterSet(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,())by_casesh:i=p∧j=qposR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:i=p∧j=q⊢ out.scatterSet(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,())negR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:¬(i=p∧j=q)⊢ out.scatterSet(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,())·posR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:i=p∧j=q⊢ out.scatterSet(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,())rcaseshwith⟨rfl,rfl⟩posR:Typen:ℕm:ℕout:TensorR[n,m]i:Finnj:Finmv:R⊢ out.scatterSet(i,j,())v(i,j,())=ifi=i∧j=jthenvelseout(i,j,())try 'simp' instead of 'simpa'Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpausingscatterSet_sameout(i,j,())vAll goals completed! 🐙·negR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:¬(i=p∧j=q)⊢ out.scatterSet(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,())haveh':(i,j,())≠(p,q,()):=fune=>h⟨congrArgProd.fste,congrArg(funx=>x.2.1)e⟩negR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:¬(i=p∧j=q)h':(i,j,())≠(p,q,())⊢ out.scatterSet(p,q,())v(i,j,())=ifi=p∧j=qthenvelseout(i,j,())rw[scatterSet_otherout(p,q,())(i,j,())vh',negR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:¬(i=p∧j=q)h':(i,j,())≠(p,q,())⊢ out(i,j,())=ifi=p∧j=qthenvelseout(i,j,())All goals completed! 🐙if_neghnegR:Typen:ℕm:ℕout:TensorR[n,m]p:Finni:Finnq:Finmj:Finmv:Rh:¬(i=p∧j=q)h':(i,j,())≠(p,q,())⊢ out(i,j,())=out(i,j,())All goals completed! 🐙]All goals completed! 🐙
Additive collisions are order-independent in this algebraic model.