High-Performance Dyadic Interval Evaluator #
This evaluator replaces Rat with Dyadic to prevent denominator explosion.
It is designed for complex expressions where the standard evaluator becomes slow.
Main definitions #
DyadicConfig- Configuration for precision and Taylor depthLeanCert.Internal.Dyadic.evalUnchecked- Dyadic interval evaluator for expressionsevalIntervalDyadic_correct- Correctness theorem
Performance #
In v1.0, every Rat multiplication required GCD normalization. For deep
expressions (e.g., Taylor series with 20+ terms, or optimization with 100+
iterations), denominators grow exponentially, causing timeouts.
In v1.1, Dyadic arithmetic uses bit-shifts instead of GCD. With roundOut,
we can enforce a maximum precision after each operation, keeping computation
bounded regardless of expression depth.
Example #
Consider computing sin(sin(sin(x))) with 15-term Taylor series:
- v1.0 (Rat): ~500ms per call, denominators grow to millions of digits
- v1.1 (Dyadic): ~5ms per call, precision stays at 53 bits
Design notes #
For transcendental functions (sin, cos, exp), we delegate to the existing
IntervalRat implementation with Taylor series, then convert the result
to IntervalDyadic with outward rounding. This reuses verified code while
gaining the performance benefits of Dyadic for polynomial operations.
Configuration #
Configuration for Dyadic interval evaluation.
precision- Minimum exponent for outward rounding. A value of -53 gives IEEE double-like precision (~15 decimal digits). Use -100 for higher precision.taylorDepth- Number of Taylor terms for transcendental functions.
- precision : ℤ
Minimum exponent (higher = coarser). -53 ≈ IEEE double precision.
- taylorDepth : ℕ
Number of Taylor series terms for transcendental functions
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Default configuration with IEEE double-like precision
High-precision configuration for critical calculations
Equations
- LeanCert.Engine.DyadicConfig.highPrecision = { precision := -100, taylorDepth := 20 }
Instances For
Fast configuration for rapid evaluation (lower precision)
Equations
- LeanCert.Engine.DyadicConfig.fast = { precision := -30, taylorDepth := 8 }
Instances For
Variable Environment #
Variable assignment as Dyadic intervals
Equations
Instances For
Convert a rational interval environment to Dyadic
Equations
- LeanCert.Engine.toDyadicEnv ρ prec i = LeanCert.Core.IntervalDyadic.ofIntervalRat (ρ i) prec
Instances For
Transcendental Function Wrappers #
Compute sin interval using rational Taylor series, convert to Dyadic
Equations
Instances For
Compute cos interval using rational Taylor series, convert to Dyadic
Equations
Instances For
Compute exp interval using rational Taylor series, convert to Dyadic
Equations
Instances For
Compute sinh interval using rational Taylor series, convert to Dyadic
Equations
Instances For
Compute cosh interval using rational Taylor series, convert to Dyadic
Equations
Instances For
atan interval: global bound [-2, 2]
Equations
- LeanCert.Engine.atanIntervalDyadic _I _cfg = { lo := LeanCert.Core.Dyadic.ofInt (-2), hi := LeanCert.Core.Dyadic.ofInt 2, le := LeanCert.Engine.atanIntervalDyadic._proof_1 }
Instances For
tanh interval: global bound [-1, 1]
Equations
- LeanCert.Engine.tanhIntervalDyadic _I _cfg = { lo := LeanCert.Core.Dyadic.ofInt (-1), hi := LeanCert.Core.Dyadic.ofInt 1, le := LeanCert.Engine.tanhIntervalDyadic._proof_1 }
Instances For
arsinh interval: wide box bound via rational arsinhInterval
Equations
Instances For
atanh interval: computable Taylor series via rational atanhComputable
Equations
Instances For
sinc interval: global bound [-1, 1]
Equations
- LeanCert.Engine.sincIntervalDyadic _I _cfg = { lo := LeanCert.Core.Dyadic.ofInt (-1), hi := LeanCert.Core.Dyadic.ofInt 1, le := LeanCert.Engine.tanhIntervalDyadic._proof_1 }
Instances For
erf interval: global bound [-1, 1]
Equations
- LeanCert.Engine.erfIntervalDyadic _I _cfg = { lo := LeanCert.Core.Dyadic.ofInt (-1), hi := LeanCert.Core.Dyadic.ofInt 1, le := LeanCert.Engine.tanhIntervalDyadic._proof_1 }
Instances For
Compute inv interval: convert to Rat, use invInterval, convert back to Dyadic
Equations
Instances For
sqrt interval: uses conservative bound [0, max(hi, 1)]
Equations
- LeanCert.Engine.sqrtIntervalDyadic I cfg = I.sqrt cfg.precision
Instances For
log interval: conservative global bound. For any x > 0, log(x) ∈ (-∞, ∞), but we use a finite interval. For x ∈ [lo, hi] with lo > 0:
- log is monotone, so log(x) ∈ [log(lo), log(hi)]
- Legacy total-evaluator fallback; strict callers reject this domain
Equations
- One or more equations did not get rendered due to their size.
Instances For
Real power from a cached logarithm interval.
If Real.log x ∈ logBase, this computes an interval for
x ^ (p : ℝ) as exp(p * log x) without recomputing log x.
This is the hot-path primitive for cached finite sums with many terms of
the form x ^ q_k.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Real power x^p for x > 0 and rational p, computed via exp(p * log(x)).
For x ∈ [lo, hi] with lo > 0 and rational exponent p:
- x^p = exp(p * log(x))
- We compute log(x), multiply by p, then apply exp
This is the key operation for BKLNW-style sums where terms are x^(1/k - 1/3).
Equations
- LeanCert.Engine.rpowIntervalDyadic base p cfg = LeanCert.Engine.rpowFromCachedLogDyadic (LeanCert.Engine.logIntervalDyadic base cfg) p cfg
Instances For
Correctness of rpowFromCachedLogDyadic: a cached interval containing
Real.log x is enough to enclose x ^ p.
Correctness of rpowIntervalDyadic: if x ∈ base and base.lo > 0, then x^p ∈ result
Main Evaluator #
High-performance Dyadic interval evaluator.
This is the core function for v1.1. It evaluates expressions using Dyadic arithmetic for polynomial operations (add, mul, neg) and delegates to rational Taylor series for transcendentals.
Returns an interval guaranteed to contain all possible values of the expression
when ExprSupportedCore holds. For other expressions, it computes conservative
fallbacks (e.g., inv/log), but the core correctness theorem does not apply.
Equations
- LeanCert.Internal.Dyadic.evalUnchecked (LeanCert.Core.Expr.const q) ρ cfg = LeanCert.Core.IntervalDyadic.ofIntervalRat (LeanCert.Core.IntervalRat.singleton q) cfg.precision
- LeanCert.Internal.Dyadic.evalUnchecked (LeanCert.Core.Expr.var idx) ρ cfg = ρ idx
- LeanCert.Internal.Dyadic.evalUnchecked (e₁.add e₂) ρ cfg = ((LeanCert.Internal.Dyadic.evalUnchecked e₁ ρ cfg).add (LeanCert.Internal.Dyadic.evalUnchecked e₂ ρ cfg)).roundOut cfg.precision
- LeanCert.Internal.Dyadic.evalUnchecked (e₁.mul e₂) ρ cfg = ((LeanCert.Internal.Dyadic.evalUnchecked e₁ ρ cfg).mul (LeanCert.Internal.Dyadic.evalUnchecked e₂ ρ cfg)).roundOut cfg.precision
- LeanCert.Internal.Dyadic.evalUnchecked e_2.neg ρ cfg = (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg).neg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.inv ρ cfg = LeanCert.Engine.invIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.exp ρ cfg = LeanCert.Engine.expIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.sin ρ cfg = LeanCert.Engine.sinIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.cos ρ cfg = LeanCert.Engine.cosIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.log ρ cfg = LeanCert.Engine.logIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.atan ρ cfg = LeanCert.Engine.atanIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.arsinh ρ cfg = LeanCert.Engine.arsinhIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.atanh ρ cfg = LeanCert.Engine.atanhIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.sinc ρ cfg = LeanCert.Engine.sincIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.erf ρ cfg = LeanCert.Engine.erfIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.sinh ρ cfg = LeanCert.Engine.sinhIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.cosh ρ cfg = LeanCert.Engine.coshIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.tanh ρ cfg = LeanCert.Engine.tanhIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked e_2.sqrt ρ cfg = LeanCert.Engine.sqrtIntervalDyadic (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg) cfg
- LeanCert.Internal.Dyadic.evalUnchecked (LeanCert.Core.Expr.namedConst c) ρ cfg = LeanCert.Core.IntervalDyadic.ofIntervalRat c.interval cfg.precision
Instances For
Correctness #
A real environment is contained in a Dyadic interval environment
Equations
- LeanCert.Engine.envMemDyadic ρ_real ρ_dyad = ∀ (i : ℕ), ρ_real i ∈ ρ_dyad i
Instances For
Domain validity for Dyadic evaluation. This is defined directly in terms of LeanCert.Internal.Dyadic.evalUnchecked to ensure compatibility. For log, we require the argument interval (converted to Rat) to have positive lower bound.
Equations
- One or more equations did not get rendered due to their size.
- LeanCert.Engine.evalDomainValidDyadic (LeanCert.Core.Expr.const q) ρ cfg = True
- LeanCert.Engine.evalDomainValidDyadic (LeanCert.Core.Expr.var idx) ρ cfg = True
- LeanCert.Engine.evalDomainValidDyadic (e₁.add e₂) ρ cfg = (LeanCert.Engine.evalDomainValidDyadic e₁ ρ cfg ∧ LeanCert.Engine.evalDomainValidDyadic e₂ ρ cfg)
- LeanCert.Engine.evalDomainValidDyadic (e₁.mul e₂) ρ cfg = (LeanCert.Engine.evalDomainValidDyadic e₁ ρ cfg ∧ LeanCert.Engine.evalDomainValidDyadic e₂ ρ cfg)
- LeanCert.Engine.evalDomainValidDyadic e_2.neg ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.exp ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.sin ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.cos ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.log ρ cfg = (LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg ∧ (LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg).toIntervalRat.lo > 0)
- LeanCert.Engine.evalDomainValidDyadic e_2.atan ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.arsinh ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.sinc ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.erf ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.sinh ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.cosh ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.tanh ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic e_2.sqrt ρ cfg = LeanCert.Engine.evalDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.evalDomainValidDyadic (LeanCert.Core.Expr.namedConst c) ρ cfg = True
Instances For
Computable (Bool) domain validity check for Dyadic evaluation.
Equations
- One or more equations did not get rendered due to their size.
- LeanCert.Engine.checkDomainValidDyadic (LeanCert.Core.Expr.const q) ρ cfg = true
- LeanCert.Engine.checkDomainValidDyadic (LeanCert.Core.Expr.var idx) ρ cfg = true
- LeanCert.Engine.checkDomainValidDyadic (e₁.add e₂) ρ cfg = (LeanCert.Engine.checkDomainValidDyadic e₁ ρ cfg && LeanCert.Engine.checkDomainValidDyadic e₂ ρ cfg)
- LeanCert.Engine.checkDomainValidDyadic (e₁.mul e₂) ρ cfg = (LeanCert.Engine.checkDomainValidDyadic e₁ ρ cfg && LeanCert.Engine.checkDomainValidDyadic e₂ ρ cfg)
- LeanCert.Engine.checkDomainValidDyadic e_2.neg ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.exp ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.sin ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.cos ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.log ρ cfg = (LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg && decide ((LeanCert.Internal.Dyadic.evalUnchecked e_2 ρ cfg).toIntervalRat.lo > 0))
- LeanCert.Engine.checkDomainValidDyadic e_2.atan ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.arsinh ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.sinc ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.erf ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.sinh ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.cosh ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.tanh ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic e_2.sqrt ρ cfg = LeanCert.Engine.checkDomainValidDyadic e_2 ρ cfg
- LeanCert.Engine.checkDomainValidDyadic (LeanCert.Core.Expr.namedConst c) ρ cfg = true
Instances For
Static data prepared once for repeated Dyadic evaluation.
The context is operation-independent: logarithm, exponential, trigonometric, and inverse-hyperbolic kernels share certified constants and coefficient families without changing the public evaluator configuration.
- cfg : Engine.DyadicConfig
- ln2 : Core.IntervalRat
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Deterministically prepare all configuration-dependent numerical data.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Logarithm kernel using the context's prepared certified constants.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Exponential kernel using the context's prepared Taylor coefficients.
Equations
Instances For
Sine kernel using the context's prepared Taylor coefficients.
Equations
Instances For
Cosine kernel using the context's prepared Taylor coefficients.
Equations
Instances For
Inverse-hyperbolic-tangent kernel using prepared Taylor coefficients.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Evaluate an expression and its domain-validity bit in one traversal.
The value component is exactly LeanCert.Internal.Dyadic.evalUnchecked; the validity component is
exactly checkDomainValidDyadic.
Equations
- One or more equations did not get rendered due to their size.
- LeanCert.Internal.Dyadic.evalCached (LeanCert.Core.Expr.const q) ρ cfg = (LeanCert.Core.IntervalDyadic.ofIntervalRat (LeanCert.Core.IntervalRat.singleton q) cfg.precision, true)
- LeanCert.Internal.Dyadic.evalCached (LeanCert.Core.Expr.var idx) ρ cfg = (ρ idx, true)
- LeanCert.Internal.Dyadic.evalCached e_2.neg ρ cfg = ((LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).1.neg, (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).2)
- LeanCert.Internal.Dyadic.evalCached e_2.exp ρ cfg = (LeanCert.Engine.expIntervalDyadic (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).1 cfg, (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).2)
- LeanCert.Internal.Dyadic.evalCached e_2.sin ρ cfg = (LeanCert.Engine.sinIntervalDyadic (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).1 cfg, (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).2)
- LeanCert.Internal.Dyadic.evalCached e_2.cos ρ cfg = (LeanCert.Engine.cosIntervalDyadic (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).1 cfg, (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).2)
- LeanCert.Internal.Dyadic.evalCached e_2.erf ρ cfg = (LeanCert.Engine.erfIntervalDyadic (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).1 cfg, (LeanCert.Internal.Dyadic.evalCached e_2 ρ cfg).2)
- LeanCert.Internal.Dyadic.evalCached (LeanCert.Core.Expr.namedConst c) ρ cfg = (LeanCert.Core.IntervalDyadic.ofIntervalRat c.interval cfg.precision, true)
Instances For
Prepared evaluator: identical certificate semantics to evalCached, but
configuration-dependent data is shared across every evaluation.
Equations
- One or more equations did not get rendered due to their size.
- LeanCert.Internal.Dyadic.evalPreparedCached (LeanCert.Core.Expr.const q) ρ ctx = (LeanCert.Core.IntervalDyadic.ofIntervalRat (LeanCert.Core.IntervalRat.singleton q) ctx.cfg.precision, true)
- LeanCert.Internal.Dyadic.evalPreparedCached (LeanCert.Core.Expr.var idx) ρ ctx = (ρ idx, true)
- LeanCert.Internal.Dyadic.evalPreparedCached e_2.neg ρ ctx = ((LeanCert.Internal.Dyadic.evalPreparedCached e_2 ρ ctx).1.neg, (LeanCert.Internal.Dyadic.evalPreparedCached e_2 ρ ctx).2)
- LeanCert.Internal.Dyadic.evalPreparedCached (LeanCert.Core.Expr.namedConst c) ρ ctx = (LeanCert.Core.IntervalDyadic.ofIntervalRat c.interval ctx.cfg.precision, true)
Instances For
Diagnose the first failed Dyadic domain check.
Equations
- One or more equations did not get rendered due to their size.
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.neg ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.exp ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.sin ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.cos ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.atan ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.arsinh ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.sinc ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.erf ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.sinh ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.cosh ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.tanh ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2.sqrt ρ cfg = LeanCert.Engine.EvalError.nestedFailure "unary operand" (LeanCert.Engine.diagnoseEvalIntervalDyadicFailure e_2 ρ cfg)
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure (LeanCert.Core.Expr.const q) ρ cfg = LeanCert.Engine.EvalError.unsupportedBackend "internal: total Dyadic expression unexpectedly failed"
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure (LeanCert.Core.Expr.var idx) ρ cfg = LeanCert.Engine.EvalError.unsupportedBackend "internal: total Dyadic expression unexpectedly failed"
- LeanCert.Engine.diagnoseEvalIntervalDyadicFailure (LeanCert.Core.Expr.namedConst c) ρ cfg = LeanCert.Engine.EvalError.unsupportedBackend "internal: total Dyadic expression unexpectedly failed"
Instances For
Checked Dyadic evaluator. The finite fallback branches of the legacy total evaluator are never exposed after a failed domain check.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Domain validity is trivially true for ADSupported expressions (which exclude log).
Fundamental correctness theorem for Dyadic evaluation.
This theorem states that for any supported expression and any real values within the input intervals, the result of evaluating the expression is contained in the computed Dyadic interval.
The proof follows the same structure as evalIntervalCore_correct, but
with additional steps for handling Dyadic ↔ Rat conversions and rounding.
Requires cfg.precision ≤ 0 (the default -53 satisfies this).
Note: Requires domain validity for log (positive argument interval).
Correctness of Dyadic evaluation for every expression whose recursively checked domain conditions hold.
Successful checked Dyadic evaluation encloses the true value for every expression, provided outward-rounding precision is nonpositive.
Verification Checkers #
Check if expression is bounded above by q
Equations
- LeanCert.Engine.checkUpperBoundDyadic e ρ q cfg = (LeanCert.Internal.Dyadic.evalUnchecked e ρ cfg).upperBoundedBy q
Instances For
Check if expression is bounded below by q
Equations
- LeanCert.Engine.checkLowerBoundDyadic e ρ q cfg = (LeanCert.Internal.Dyadic.evalUnchecked e ρ cfg).lowerBoundedBy q
Instances For
Check if expression is bounded in interval [lo, hi]
Equations
- LeanCert.Engine.checkBoundsDyadic e ρ lo hi cfg = ((LeanCert.Internal.Dyadic.evalUnchecked e ρ cfg).lowerBoundedBy lo && (LeanCert.Internal.Dyadic.evalUnchecked e ρ cfg).upperBoundedBy hi)