Zulip Chat Archive

Stream: metaprogramming / tactics

Topic: ring and ∑


Tomas Skrivan (Feb 03 2025 at 16:09):

I would like to have a tactic, presumably based on ring, that can deal with . What would be the recommended way of dealing with this?

I'm thinking of extending Ring.ExSum with one extra constructor

 | sum (is : Array Expr) (As : Array Expr) (b : ExProd _ _)

where is is list of free variables with As list of sets over which b should be summed over. However this mean I would have to effectively fork ring. Would there be an approach that keeps most of the ring tactic intact?

Also ideally this should extend to module tactic and different big operators like or and ∑' where I would expect users to provide a tactic that could discharge any integrability conditions.

My imagined usage of ring_nf that can do this

import Mathlib.Tactic.Ring
import Mathlib.Algebra.BigOperators.Ring

open BigOperators

variable
  {n} {m} {R} [CommRing R] (f g : Fin n  Fin m  R)
  (ψ : Fin n  R) (φ : Fin m  R) (a : R)

example :  i,  j, f i j +  j,  i, g i j
          =
           i,  j, (f i j + g i j) := by
  conv => lhs; ring_nf +sum_together

example :  i,  j, (f i j + g i j)
          =
           i,  j, f i j +  i,  j, g i j := by
  conv => lhs; ring_nf +sum_apart

example :  i,  j, a * f i j
          =
          a *  i,  j, f i j := by
  conv => lhs; ring_nf +sum_mul_pull

-- here we automatically whic
example :  i,  j, f i j * φ j
          =
           j, φ j *  i, f i j := by
  conv => lhs; ring_nf +sum_mul_pull

Kevin Buzzard (Feb 03 2025 at 18:08):

Can simp [appropriate lemmas]; ring do this?

Tomas Skrivan (Feb 03 2025 at 18:13):

I don't think so. For example, I want to pull all the aⱼ i from ∑ i, (a₁ i * ... * aₙ i) that do not depend on i.

Tomas Skrivan (Feb 03 2025 at 18:42):

Hmm, maybe you can. Here is my attempt. It can turn

 i, (a i * b i) * (c * d i * c * a i)

intro

c^2 *  i, d i * b i * (a i)^2

code

Tomas Skrivan (Feb 03 2025 at 18:45):

The main idea is to define an auxiliary definition sum_prod which holds the data appropriately sorted. With that you run a set of carefully crafted simp theorems which bit by bit parse the whole expression and sorts all those terms. I'm a bit uneasy about the fact that you are at the peril of simp's theorem precedence and high order unification.


Last updated: May 02 2025 at 03:31 UTC