Filters used in box-based integrals #
First we define a structure BoxIntegral.IntegrationParams
. This structure will be used as an
argument in the definition of BoxIntegral.integral
in order to use the same definition for a few
well-known definitions of integrals based on partitions of a rectangular box into subboxes (Riemann
integral, Henstock-Kurzweil integral, and McShane integral).
This structure holds three boolean values (see below), and encodes eight different sets of
parameters; only four of these values are used somewhere in mathlib4
. Three of them correspond to
the integration theories listed above, and one is a generalization of the one-dimensional
Henstock-Kurzweil integral such that the divergence theorem works without additional integrability
assumptions.
Finally, for each set of parameters l : BoxIntegral.IntegrationParams
and a rectangular box
I : BoxIntegral.Box ι
, we define several Filter
s that will be used either in the definition of
the corresponding integral, or in the proofs of its properties. We equip
BoxIntegral.IntegrationParams
with a BoundedOrder
structure such that larger
IntegrationParams
produce larger filters.
Main definitions #
Integration parameters #
The structure BoxIntegral.IntegrationParams
has 3 boolean fields with the following meaning:
bRiemann
: the valuetrue
means that the filter corresponds to a Riemann-style integral, i.e. in the definition of integrability we require a constant upper estimater
on the size of boxes of a tagged partition; the valuefalse
means that the estimate may depend on the position of the tag.bHenstock
: the valuetrue
means that we require that each tag belongs to its own closed box; the valuefalse
means that we only require that tags belong to the ambient box.bDistortion
: the valuetrue
means thatr
can depend on the maximal ratio of sides of the same box of a partition. Presence of this case make quite a few proofs harder but we can prove the divergence theorem only for the filterBoxIntegral.IntegrationParams.GP = ⊥ = {bRiemann := false, bHenstock := true, bDistortion := true}
.
Well-known sets of parameters #
Out of eight possible values of BoxIntegral.IntegrationParams
, the following four are used in
the library.
BoxIntegral.IntegrationParams.Riemann
(bRiemann = true
,bHenstock = true
,bDistortion = false
): this value corresponds to the Riemann integral; in the corresponding filter, we require that the diameters of all boxesJ
of a tagged partition are bounded from above by a constant upper estimate that may not depend on the geometry ofJ
, and each tag belongs to the corresponding closed box.BoxIntegral.IntegrationParams.Henstock
(bRiemann = false
,bHenstock = true
,bDistortion = false
): this value corresponds to the most natural generalization of Henstock-Kurzweil integral to higher dimension; the only (but important!) difference between this theory and Riemann integral is that instead of a constant upper estimate on the size of all boxes of a partition, we require that the partition is subordinate to a possibly discontinuous functionr : (ι → ℝ) → {x : ℝ | 0 < x}
, i.e. each boxJ
is included in a closed ball with centerπ.tag J
and radiusr J
.BoxIntegral.IntegrationParams.McShane
(bRiemann = false
,bHenstock = false
,bDistortion = false
): this value corresponds to the McShane integral; the only difference with the Henstock integral is that we allow tags to be outside of their boxes; the tags still have to be in the ambient closed box, and the partition still has to be subordinate to a function.BoxIntegral.IntegrationParams.GP = ⊥
(bRiemann = false
,bHenstock = true
,bDistortion = true
): this is the least integration theory in our list, i.e., all functions integrable in any other theory is integrable in this one as well. This is a non-standard generalization of the Henstock-Kurzweil integral to higher dimension. In dimension one, it generates the same filter asHenstock
. In higher dimension, this generalization defines an integration theory such that the divergence of any Fréchet differentiable functionf
is integrable, and its integral is equal to the sum of integrals off
over the faces of the box, taken with appropriate signs.A function
f
isGP
-integrable if for anyε > 0
andc : ℝ≥0
there existsr : (ι → ℝ) → {x : ℝ | 0 < x}
such that for any tagged partitionπ
subordinate tor
, if each tag belongs to the corresponding closed box and for each boxJ ∈ π
, the maximal ratio of its sides is less than or equal toc
, then the integral sum off
overπ
isε
-close to the integral.
Filters and predicates on TaggedPrepartition I
#
For each value of IntegrationParams
and a rectangular box I
, we define a few filters on
TaggedPrepartition I
. First, we define a predicate
structure BoxIntegral.IntegrationParams.MemBaseSet (l : BoxIntegral.IntegrationParams)
(I : BoxIntegral.Box ι) (c : ℝ≥0) (r : (ι → ℝ) → Ioi (0 : ℝ))
(π : BoxIntegral.TaggedPrepartition I) : Prop where
This predicate says that
- if
l.bHenstock
, thenπ
is a Henstock prepartition, i.e. each tag belongs to the corresponding closed box; π
is subordinate tor
;- if
l.bDistortion
, then the distortion of each box inπ
is less than or equal toc
; - if
l.bDistortion
, then there exists a prepartitionπ'
with distortion≤ c
that covers exactlyI \ π.iUnion
.
The last condition is always true for c > 1
, see TODO section for more details.
Then we define a predicate BoxIntegral.IntegrationParams.RCond
on functions
r : (ι → ℝ) → {x : ℝ | 0 < x}
. If l.bRiemann
, then this predicate requires r
to be a constant
function, otherwise it imposes no restrictions on r
. We introduce this definition to prove a few
dot-notation lemmas: e.g., BoxIntegral.IntegrationParams.RCond.min
says that the pointwise
minimum of two functions that satisfy this condition satisfies this condition as well.
Then we define four filters on BoxIntegral.TaggedPrepartition I
.
BoxIntegral.IntegrationParams.toFilterDistortion
: an auxiliary filter that takes parameters(l : BoxIntegral.IntegrationParams) (I : BoxIntegral.Box ι) (c : ℝ≥0)
and returns the filter generated by all sets{π | MemBaseSet l I c r π}
, wherer
is a function satisfying the predicateBoxIntegral.IntegrationParams.RCond l
;BoxIntegral.IntegrationParams.toFilter l I
: the supremum ofl.toFilterDistortion I c
over allc : ℝ≥0
;BoxIntegral.IntegrationParams.toFilterDistortioniUnion l I c π₀
, whereπ₀
is a prepartition ofI
: the infimum ofl.toFilterDistortion I c
and the principal filter generated by{π | π.iUnion = π₀.iUnion}
;BoxIntegral.IntegrationParams.toFilteriUnion l I π₀
: the supremum ofl.toFilterDistortioniUnion l I c π₀
over allc : ℝ≥0
. This is the filter (in the caseπ₀ = ⊤
is the one-box partition ofI
) used in the definition of the integral of a function over a box.
Implementation details #
Later we define the integral of a function over a rectangular box as the limit (if it exists) of the integral sums along
BoxIntegral.IntegrationParams.toFilteriUnion l I ⊤
. While it is possible to define the integral with a general filter onBoxIntegral.TaggedPrepartition I
as a parameter, many lemmas (e.g., Sacks-Henstock lemma and most results about integrability of functions) require the filter to have a predictable structure. So, instead of adding assumptions about the filter here and there, we define this auxiliary type that can encode all integration theories we need in practice.While the definition of the integral only uses the filter
BoxIntegral.IntegrationParams.toFilteriUnion l I ⊤
and partitions of a box, some lemmas (e.g., the Henstock-Sacks lemmas) are best formulated in terms of the predicateMemBaseSet
and other filters defined above.We use
Bool
instead ofProp
for the fields ofIntegrationParams
in order to have decidable equality and inequalities.
TODO #
Currently, BoxIntegral.IntegrationParams.MemBaseSet
explicitly requires that there exists a
partition of the complement I \ π.iUnion
with distortion ≤ c
. For c > 1
, this condition is
always true but the proof of this fact requires more API about
BoxIntegral.Prepartition.splitMany
. We should formalize this fact, then either require c > 1
everywhere, or replace ≤ c
with < c
so that we automatically get c > 1
for a non-trivial
prepartition (and consider the special case π = ⊥
separately if needed).
Tags #
integral, rectangular box, partition, filter
An IntegrationParams
is a structure holding 3 boolean values used to define a filter to be
used in the definition of a box-integrable function.
bRiemann
: the valuetrue
means that the filter corresponds to a Riemann-style integral, i.e. in the definition of integrability we require a constant upper estimater
on the size of boxes of a tagged partition; the valuefalse
means that the estimate may depend on the position of the tag.bHenstock
: the valuetrue
means that we require that each tag belongs to its own closed box; the valuefalse
means that we only require that tags belong to the ambient box.bDistortion
: the valuetrue
means thatr
can depend on the maximal ratio of sides of the same box of a partition. Presence of this case makes quite a few proofs harder but we can prove the divergence theorem only for the filterBoxIntegral.IntegrationParams.GP = ⊥ = {bRiemann := false, bHenstock := true, bDistortion := true}
.
Instances For
Auxiliary OrderIso
with a product type used to lift a BoundedOrder
structure.
Equations
- BoxIntegral.IntegrationParams.isoProd = { toEquiv := BoxIntegral.IntegrationParams.equivProd, map_rel_iff' := @BoxIntegral.IntegrationParams.isoProd.proof_1 }
Instances For
Equations
- BoxIntegral.IntegrationParams.instBoundedOrder = BoxIntegral.IntegrationParams.isoProd.symm.toGaloisInsertion.liftBoundedOrder
The value BoxIntegral.IntegrationParams.GP = ⊥
(bRiemann = false
, bHenstock = true
, bDistortion = true
)
corresponds to a generalization of the Henstock integral such that the Divergence theorem holds true
without additional integrability assumptions, see the module docstring for details.
Equations
- BoxIntegral.IntegrationParams.instInhabited = { default := ⊥ }
Equations
- x✝.instDecidableRelLe x = And.decidable
The BoxIntegral.IntegrationParams
corresponding to the Riemann integral. In the
corresponding filter, we require that the diameters of all boxes J
of a tagged partition are
bounded from above by a constant upper estimate that may not depend on the geometry of J
, and each
tag belongs to the corresponding closed box.
Equations
- BoxIntegral.IntegrationParams.Riemann = { bRiemann := true, bHenstock := true, bDistortion := false }
Instances For
The BoxIntegral.IntegrationParams
corresponding to the Henstock-Kurzweil integral. In the
corresponding filter, we require that the tagged partition is subordinate to a (possibly,
discontinuous) positive function r
and each tag belongs to the corresponding closed box.
Equations
- BoxIntegral.IntegrationParams.Henstock = { bRiemann := false, bHenstock := true, bDistortion := false }
Instances For
The BoxIntegral.IntegrationParams
corresponding to the McShane integral. In the
corresponding filter, we require that the tagged partition is subordinate to a (possibly,
discontinuous) positive function r
; the tags may be outside of the corresponding closed box
(but still inside the ambient closed box I.Icc
).
Equations
- BoxIntegral.IntegrationParams.McShane = { bRiemann := false, bHenstock := false, bDistortion := false }
Instances For
The BoxIntegral.IntegrationParams
corresponding to the generalized Perron integral. In the
corresponding filter, we require that the tagged partition is subordinate to a (possibly,
discontinuous) positive function r
and each tag belongs to the corresponding closed box. We also
require an upper estimate on the distortion of all boxes of the partition.
Equations
Instances For
The predicate corresponding to a base set of the filter defined by an
IntegrationParams
. It says that
- if
l.bHenstock
, thenπ
is a Henstock prepartition, i.e. each tag belongs to the corresponding closed box; π
is subordinate tor
;- if
l.bDistortion
, then the distortion of each box inπ
is less than or equal toc
; - if
l.bDistortion
, then there exists a prepartitionπ'
with distortion≤ c
that covers exactlyI \ π.iUnion
.
The last condition is automatically verified for partitions, and is used in the proof of the Sacks-Henstock inequality to compare two prepartitions covering the same part of the box.
It is also automatically satisfied for any c > 1
, see TODO section of the module docstring for
details.
- isSubordinate : π.IsSubordinate r
Instances For
A set s : Set (TaggedPrepartition I)
belongs to l.toFilterDistortion I c
if there exists
a function r : ℝⁿ → (0, ∞)
(or a constant r
if l.bRiemann = true
) such that s
contains each
prepartition π
such that l.MemBaseSet I c r π
.
Equations
- l.toFilterDistortion I c = ⨅ (r : (ι → ℝ) → ↑(Set.Ioi 0)), ⨅ (_ : l.RCond r), Filter.principal {π : BoxIntegral.TaggedPrepartition I | l.MemBaseSet I c r π}
Instances For
A set s : Set (TaggedPrepartition I)
belongs to l.toFilter I
if for any c : ℝ≥0
there
exists a function r : ℝⁿ → (0, ∞)
(or a constant r
if l.bRiemann = true
) such that
s
contains each prepartition π
such that l.MemBaseSet I c r π
.
Instances For
A set s : Set (TaggedPrepartition I)
belongs to l.toFilterDistortioniUnion I c π₀
if
there exists a function r : ℝⁿ → (0, ∞)
(or a constant r
if l.bRiemann = true
) such that s
contains each prepartition π
such that l.MemBaseSet I c r π
and π.iUnion = π₀.iUnion
.
Equations
- l.toFilterDistortioniUnion I c π₀ = l.toFilterDistortion I c ⊓ Filter.principal {π : BoxIntegral.TaggedPrepartition I | π.iUnion = π₀.iUnion}
Instances For
A set s : Set (TaggedPrepartition I)
belongs to l.toFilteriUnion I π₀
if for any c : ℝ≥0
there exists a function r : ℝⁿ → (0, ∞)
(or a constant r
if l.bRiemann = true
) such that s
contains each prepartition π
such that l.MemBaseSet I c r π
and π.iUnion = π₀.iUnion
.
Instances For
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯