norm_num
plugin for big operators #
This file adds norm_num
plugins for Finset.prod
and Finset.sum
.
The driving part of this plugin is Mathlib.Meta.NormNum.evalFinsetBigop
.
We repeatedly use Finset.proveEmptyOrCons
to try to find a proof that the given set is empty,
or that it consists of one element inserted into a strict subset, and evaluate the big operator
on that subset until the set is completely exhausted.
See also #
- The
fin_cases
tactic has similar scope: splitting out a finite collection into its elements.
Porting notes #
This plugin is noticeably less powerful than the equivalent version in Mathlib 3: the design of
norm_num
means plugins have to return numerals, rather than a generic expression.
In particular, we can't use the plugin on sums containing variables.
(See also the TODO note "To support variables".)
TODOs #
- Support intervals:
Finset.Ico
,Finset.Icc
, ... - To support variables, like in Mathlib 3, turn this into a standalone tactic that unfolds
the sum/prod, without computing its numeric value (using the
ring
tactic to do some normalization?)
- zero: {n : Q(ℕ)} → «$n» =Q 0 → Mathlib.Meta.Nat.UnifyZeroOrSuccResult n
n
unifies with0
- succ: {n : Q(ℕ)} → (n' : Q(ℕ)) → «$n» =Q Nat.succ «$n'» → Mathlib.Meta.Nat.UnifyZeroOrSuccResult n
n
unifies withsucc n'
for this specificn'
This represents the result of trying to determine whether the given expression n : Q(ℕ)
is either zero
or succ
.
Instances For
Determine whether the expression n : Q(ℕ)
unifies with 0
or Nat.succ n'
.
We do not use norm_num
functionality because we want definitional equality,
not propositional equality, for use in dependent types.
Fails if neither of the options succeed.
Instances For
norm_num
plugin for evaluating products of finsets.
If your finset is not supported, you can add it to the match in Finset.proveEmptyOrCons
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
norm_num
plugin for evaluating sums of finsets.
If your finset is not supported, you can add it to the match in Finset.proveEmptyOrCons
.
Equations
- One or more equations did not get rendered due to their size.