Extended Interval Arithmetic #
This file implements Extended Interval Arithmetic, which handles singularities by returning a disjoint union of intervals instead of a single interval.
Motivation #
Standard interval arithmetic returns overly conservative bounds when evaluating
expressions with singularities. For example, 1/[-1, 1] returns (-∞, ∞) as a
single interval, losing all useful information.
Extended interval arithmetic instead returns (-∞, -1] ∪ [1, ∞), preserving
the fact that the result is bounded away from zero.
Main definitions #
ExtendedInterval- A union of disjoint rational intervalsinvExtended- Extended inversion that splits at zero crossingsevalExtended- Recursive evaluator returning extended intervalsExtendedInterval.hull- Collapse to a single interval (convex hull)
Main theorems #
mem_invExtended- Soundness of extended inversionevalExtended_correct_core- Soundness of the extended evaluator
Design notes #
The largeBound parameter represents "infinity" for practical computation.
Using 10^30 is sufficient for most numerical applications while keeping
arithmetic tractable.
The Extended Interval Data Structure #
Extended Interval: A union of rational intervals. Used to handle singularities (e.g., 1/[-1, 1] becomes (-∞, -1] ∪ [1, ∞)).
Design choices:
- Empty list represents the empty set (e.g., sqrt(-1) for strict domains)
- Intervals in the list may overlap (we don't enforce disjointness for simplicity)
- Operations conservatively handle all parts
- parts : List Core.IntervalRat
The intervals making up this extended interval. Empty list means the empty set.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Instances For
Construct from a single interval
Instances For
The empty set (for undefined operations)
Instances For
The entire real line (represented by a very wide interval)
Equations
- LeanCert.Engine.ExtendedInterval.whole large_bound h = LeanCert.Engine.ExtendedInterval.singleton { lo := -large_bound, hi := large_bound, le := ⋯ }
Instances For
Check if an extended interval is empty
Instances For
Number of parts in the extended interval
Instances For
Compute the convex hull: merge all parts into a single interval.
Returns none if the extended interval is empty.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Compute the convex hull with a default for empty intervals
Instances For
Membership: x is in the extended interval if it's in any part
Equations
- LeanCert.Engine.ExtendedInterval.mem x E = ∃ I ∈ E.parts, x ∈ I
Instances For
Equations
- LeanCert.Engine.ExtendedInterval.instMembershipReal = { mem := fun (E : LeanCert.Engine.ExtendedInterval) (x : ℝ) => LeanCert.Engine.ExtendedInterval.mem x E }
Helper: the foldl operation maintains the property that the accumulated interval has lo ≤ head.lo and hi ≥ head.hi
Helper: the foldl operation maintains the property that the accumulated interval contains any element from the tail
Extended Inversion #
The default "large bound" representing infinity for extended arithmetic. Using 10^30 is sufficient for most numerical applications.
Equations
Instances For
Helper: defaultLargeBound is positive
Extended inversion: handles 1/I when I may contain zero.
Cases:
- I strictly positive → standard inversion [1/hi, 1/lo]
- I strictly negative → standard inversion [1/hi, 1/lo]
- I straddles zero → split into two parts: (-∞, 1/lo] ∪ [1/hi, ∞)
- I = [0, b] with b > 0 → [1/b, ∞)
- I = [a, 0] with a < 0 → (-∞, 1/a]
- I = [0, 0] → empty (1/0 is undefined)
NOTE: Uses large_bound (default 10^30) to represent ±∞. For inputs with |lo|, |hi| ≥ 10^-30, the bounds are guaranteed valid.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Soundness of extended inversion: if x ∈ I and x ≠ 0, then 1/x ∈ invExtended I.
The hypothesis hlb : |x⁻¹| ≤ large_bound ensures that 1/x fits within the finite bounds.
This is the key assumption that makes extended inversion sound - without it, 1/x could
be arbitrarily large for x close to 0.
NOTE: This theorem has remaining sorries because the invExtended function itself
has design assumption sorries for interval validity when constructing intervals near zero.
The membership logic is correct modulo these construction assumptions.
Lifting Operations to Extended Intervals #
Lift a unary operation to extended intervals
Instances For
Soundness of unary lifting
Lift a binary operation to extended intervals (Cartesian product)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Soundness of binary lifting
Extended Interval Evaluator #
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Instances For
Environment mapping variable indices to extended intervals
Equations
Instances For
Convert a standard interval environment to an extended environment
Equations
Instances For
Extended interval evaluator.
This evaluator handles singularities by splitting intervals at discontinuities.
The key improvement over standard evaluation is in inv: when the denominator
interval contains zero, we return two separate intervals rather than one huge
interval spanning everything.
For other operations, we lift the standard interval operations to work on all pairs of interval parts.
Equations
- One or more equations did not get rendered due to their size.
- LeanCert.Engine.evalExtended (LeanCert.Core.Expr.const q) ρ cfg = LeanCert.Engine.ExtendedInterval.singleton (LeanCert.Core.IntervalRat.singleton q)
- LeanCert.Engine.evalExtended (LeanCert.Core.Expr.var idx) ρ cfg = ρ idx
- LeanCert.Engine.evalExtended (e₁.add e₂) ρ cfg = LeanCert.Engine.liftBinary LeanCert.Core.IntervalRat.add (LeanCert.Engine.evalExtended e₁ ρ cfg) (LeanCert.Engine.evalExtended e₂ ρ cfg)
- LeanCert.Engine.evalExtended (e₁.mul e₂) ρ cfg = LeanCert.Engine.liftBinary LeanCert.Core.IntervalRat.mul (LeanCert.Engine.evalExtended e₁ ρ cfg) (LeanCert.Engine.evalExtended e₂ ρ cfg)
- LeanCert.Engine.evalExtended e_2.neg ρ cfg = LeanCert.Engine.liftUnary LeanCert.Core.IntervalRat.neg (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.exp ρ cfg = LeanCert.Engine.liftUnary (fun (I : LeanCert.Core.IntervalRat) => I.expComputable cfg.taylorDepth) (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.sin ρ cfg = LeanCert.Engine.liftUnary (fun (I : LeanCert.Core.IntervalRat) => I.sinComputable cfg.taylorDepth) (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.cos ρ cfg = LeanCert.Engine.liftUnary (fun (I : LeanCert.Core.IntervalRat) => I.cosComputable cfg.taylorDepth) (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.atan ρ cfg = LeanCert.Engine.liftUnary LeanCert.Engine.atanInterval (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.arsinh ρ cfg = LeanCert.Engine.liftUnary LeanCert.Engine.arsinhInterval (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.atanh ρ cfg = LeanCert.Engine.ExtendedInterval.singleton { lo := -100, hi := 100, le := LeanCert.Engine.evalExtended._proof_2 }
- LeanCert.Engine.evalExtended e_2.sinc ρ cfg = LeanCert.Engine.ExtendedInterval.singleton { lo := -1, hi := 1, le := LeanCert.Engine.evalExtended._proof_3 }
- LeanCert.Engine.evalExtended e_2.erf ρ cfg = LeanCert.Engine.ExtendedInterval.singleton { lo := -1, hi := 1, le := LeanCert.Engine.evalExtended._proof_3 }
- LeanCert.Engine.evalExtended e_2.tanh ρ cfg = LeanCert.Engine.liftUnary LeanCert.Engine.tanhInterval (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended e_2.sqrt ρ cfg = LeanCert.Engine.liftUnary LeanCert.Core.IntervalRat.sqrtInterval (LeanCert.Engine.evalExtended e_2 ρ cfg)
- LeanCert.Engine.evalExtended LeanCert.Core.Expr.pi ρ cfg = LeanCert.Engine.ExtendedInterval.singleton LeanCert.Engine.piInterval
Instances For
Convenience function for single-variable extended evaluation
Equations
- LeanCert.Engine.evalExtended1 e I cfg = LeanCert.Engine.evalExtended e (fun (x : ℕ) => LeanCert.Engine.ExtendedInterval.singleton I) cfg
Instances For
Collapse extended evaluation to standard evaluation via hull
Equations
- LeanCert.Engine.evalExtendedHull e ρ cfg = (LeanCert.Engine.evalExtended e ρ cfg).hull
Instances For
Soundness Theorem #
Real environment membership in extended environment
Equations
- LeanCert.Engine.extendedEnvMem ρ_real ρ_ext = ∀ (i : ℕ), ρ_real i ∈ ρ_ext i
Instances For
Domain validity for Extended evaluation. For log, we require the argument's hull to have positive lower bound, ensuring all parts have positive lo and the filter keeps them.
Equations
- LeanCert.Engine.evalDomainValidExtended (LeanCert.Core.Expr.const q) ρ cfg = True
- LeanCert.Engine.evalDomainValidExtended (LeanCert.Core.Expr.var idx) ρ cfg = True
- LeanCert.Engine.evalDomainValidExtended (e₁.add e₂) ρ cfg = (LeanCert.Engine.evalDomainValidExtended e₁ ρ cfg ∧ LeanCert.Engine.evalDomainValidExtended e₂ ρ cfg)
- LeanCert.Engine.evalDomainValidExtended (e₁.mul e₂) ρ cfg = (LeanCert.Engine.evalDomainValidExtended e₁ ρ cfg ∧ LeanCert.Engine.evalDomainValidExtended e₂ ρ cfg)
- LeanCert.Engine.evalDomainValidExtended e_2.neg ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.inv ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.exp ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.sin ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.cos ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.log ρ cfg = (LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg ∧ (LeanCert.Engine.evalExtended e_2 ρ cfg).hull.lo > 0)
- LeanCert.Engine.evalDomainValidExtended e_2.atan ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.arsinh ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.atanh ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.sinc ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.erf ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.sinh ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.cosh ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.tanh ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended e_2.sqrt ρ cfg = LeanCert.Engine.evalDomainValidExtended e_2 ρ cfg
- LeanCert.Engine.evalDomainValidExtended LeanCert.Core.Expr.pi ρ cfg = True
Instances For
Domain validity is trivially true for ExprSupported expressions (which exclude log).
Soundness of extended evaluation for the core expression subset.
If all variables are in their respective extended intervals, and the expression is in the supported core subset (no partial functions), then the result is in the extended interval.
Utility: Hull Soundness #
If x is in the extended interval, it's in the hull