Automatic Continuity Proof Generation #
This module provides metaprogramming infrastructure to automatically generate
ContinuousOn proof terms for reified LeanCert expressions.
Given a reified AST e : LeanCert.Core.Expr, we construct a proof that
ContinuousOn (fun x => Expr.eval (fun _ => x) e) (Set.Icc lo hi).
Main definitions #
ExprContinuousCore- Predicate for expressions continuous everywhere (excludes inv)exprContinuousCore_continuousOn- Base theorem: all ExprContinuousCore expressions are continuousmkContinuousCoreProof- GenerateExprContinuousCoreproofs from AST structuremkContinuousOnProof- GenerateContinuousOnproofs
Design #
We define ExprContinuousCore as a separate predicate from ExprSupportedCore because:
inv(1/x) is supported for interval evaluation but NOT continuous at 0ExprContinuousCoreexcludesinv, so all its constructors are globally continuous
Operations in ExprContinuousCore:
- Constants:
continuousOn_const - Variables (identity):
continuousOn_id - Add, Mul, Neg: preserved by composition
- Sin, Cos, Exp, Sqrt, Sinh, Cosh, Tanh: continuous everywhere
Continuous Expression Predicate #
Since inv (1/x) is not continuous at 0, we define a separate predicate for
expressions that are continuous everywhere. This excludes inv from ExprSupportedCore.
Expressions that are continuous everywhere (excludes inv and log). This is a subset of ExprSupportedCore used for continuity proofs. Note: log is excluded because it is not continuous at 0.
- const (q : ℚ) : ExprContinuousCore (Core.Expr.const q)
- var (idx : ℕ) : ExprContinuousCore (Core.Expr.var idx)
- add {e₁ e₂ : LExpr} : ExprContinuousCore e₁ → ExprContinuousCore e₂ → ExprContinuousCore (Core.Expr.add e₁ e₂)
- mul {e₁ e₂ : LExpr} : ExprContinuousCore e₁ → ExprContinuousCore e₂ → ExprContinuousCore (Core.Expr.mul e₁ e₂)
- neg {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.neg e)
- sin {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.sin e)
- cos {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.cos e)
- exp {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.exp e)
- sqrt {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.sqrt e)
- sinh {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.sinh e)
- cosh {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.cosh e)
- tanh {e : LExpr} : ExprContinuousCore e → ExprContinuousCore (Core.Expr.tanh e)
Instances For
ExprContinuousCore implies ExprSupportedCore
Base Continuity Theorem #
This theorem proves that all ExprContinuousCore expressions evaluate to continuous functions.
We prove this by induction on the structure of ExprContinuousCore.
All ExprContinuousCore expressions are continuous on any set.
This is the foundational theorem that allows automatic continuity proof generation. Since ExprContinuousCore only includes operations that are continuous everywhere (const, var, add, mul, neg, sin, cos, exp, sqrt, sinh, cosh, tanh), the result follows by structural induction.
NOTE: inv and log are NOT included because they are not continuous at 0.
Specialized version for Icc intervals (common case for interval_roots)
Version taking IntervalRat for convenience
Backward Compatibility: ExprSupportedCore Continuity #
These theorems are provided for backward compatibility with code that uses
ExprSupportedCore. For expressions with log, a domain validity condition is required.
Domain validity for continuity: ensures log arguments evaluate to positive values. For expressions without log, this is always True.
Equations
- LeanCert.Meta.exprContinuousDomainValid (LeanCert.Core.Expr.const q) s = True
- LeanCert.Meta.exprContinuousDomainValid (LeanCert.Core.Expr.var idx) s = True
- LeanCert.Meta.exprContinuousDomainValid (e₁.add e₂) s = (LeanCert.Meta.exprContinuousDomainValid e₁ s ∧ LeanCert.Meta.exprContinuousDomainValid e₂ s)
- LeanCert.Meta.exprContinuousDomainValid (e₁.mul e₂) s = (LeanCert.Meta.exprContinuousDomainValid e₁ s ∧ LeanCert.Meta.exprContinuousDomainValid e₂ s)
- LeanCert.Meta.exprContinuousDomainValid e_2.neg s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.inv s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.exp s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.sin s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.cos s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.log s = (LeanCert.Meta.exprContinuousDomainValid e_2 s ∧ ∀ x ∈ s, 0 < LeanCert.Core.Expr.eval (fun (x_1 : ℕ) => x) e_2)
- LeanCert.Meta.exprContinuousDomainValid e_2.atan s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.arsinh s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.atanh s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.sinc s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.erf s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.sinh s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.cosh s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.tanh s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid e_2.sqrt s = LeanCert.Meta.exprContinuousDomainValid e_2 s
- LeanCert.Meta.exprContinuousDomainValid LeanCert.Core.Expr.pi s = True
Instances For
Domain validity is trivially true for ExprSupported expressions (which exclude log).
Domain validity is trivially true for ExprContinuousCore expressions (no log).
All ExprSupportedCore expressions are continuous on sets where log arguments are positive.
This theorem exists for backward compatibility with code that uses
ExprSupportedCore. For expressions with log, the domain validity condition
ensures the argument evaluates to positive values on s.
Metaprogramming: Continuity Proof Generation #
Generate proof terms of ContinuousOn (fun x => Expr.eval (fun _ => x) e) (Set.Icc lo hi)
by applying exprContinuousCore_continuousOn_Icc with an automatically generated
ExprContinuousCore proof.
Note: We use ExprContinuousCore (not ExprSupportedCore) because inv is not continuous
everywhere, and ExprContinuousCore excludes inv.
Generate a proof of ExprContinuousCore e_ast by matching on the AST structure.
This is similar to mkSupportedCoreProof but for the ExprContinuousCore predicate
which excludes inv (since 1/x is not continuous at 0).
Supported: const, var, add, mul, neg, sin, cos, exp, sqrt, sinh, cosh, tanh Not supported: inv, log, atan, arsinh, atanh
Generate a ContinuousOn proof for an expression on an interval.
Given:
e_ast: the AST expression (Lean.Expr representing LeanCert.Core.Expr)interval: the interval expression (Lean.Expr representing IntervalRat)
Returns a proof of:
ContinuousOn (fun x => Expr.eval (fun _ => x) e) (Set.Icc I.lo I.hi)
This works by:
- Generating an ExprContinuousCore proof for the AST
- Applying exprContinuousCore_continuousOn_interval
Note: This will fail for expressions containing inv since 1/x is not continuous at 0.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Alternative: generate ContinuousOn proof with explicit lo/hi bounds
Equations
- One or more equations did not get rendered due to their size.
Instances For
Testing Infrastructure #
Debug command to test continuity proof generation
Equations
- One or more equations did not get rendered due to their size.