The OmegaM
state monad. #
We keep track of the linear atoms (up to defeq) that have been encountered so far, and also generate new facts as new atoms are recorded.
The main functions are:
atoms : OmegaM (List Expr)
which returns the atoms recorded so farlookup (e : Expr) : OmegaM (Nat × Option (HashSet Expr))
which checks if anExpr
has already been recorded as an atom, and records it.lookup
return the index inatoms
for thisExpr
. TheOption (HashSet Expr)
return value isnone
is the expression has been previously recorded, and otherwise contains new facts that should be added to theomega
problem.- for each new atom
a
of the form((x : Nat) : Int)
, the fact that0 ≤ a
- for each new atom
a
of the formx / k
, fork
a positive numeral, the facts thatk * a ≤ x < k * a + k
- for each new atom of the form
((a - b : Nat) : Int)
, the fact:b ≤ a ∧ ((a - b : Nat) : Int) = a - b ∨ a < b ∧ ((a - b : Nat) : Int) = 0
- for each new atom of the form
min a b
, the factsmin a b ≤ a
andmin a b ≤ b
(and similarly formax
) - for each new atom of the form
if P then a else b
, the disjunction:(P ∧ (if P then a else b) = a) ∨ (¬ P ∧ (if P then a else b) = b)
TheOmegaM
monad also keeps an internal cache of visited expressions (not necessarily atoms, but arbitrary subexpressions of one side of a linear relation) to reduce duplication. The cache mapsExpr
s to pairs consisting of aLinearCombo
, and proof that the expression is equal to the evaluation of theLinearCombo
at the atoms.
- for each new atom
Context for the OmegaM
monad, containing the user configurable options.
- cfg : Meta.Omega.OmegaConfig
User configurable options for
omega
.
Instances For
The internal state for the OmegaM
monad, recording previously encountered atoms.
- atoms : Std.HashMap Expr Nat
The atoms up-to-defeq encountered so far.
Instances For
Cache of expressions that have been visited, and their reflection as a linear combination.
Equations
Instances For
The OmegaM
monad maintains two pieces of state:
- the linear atoms discovered while processing hypotheses
- a cache mapping subexpressions of one side of a linear inequality to
LinearCombo
s (and a proof that theLinearCombo
evaluates at the atoms to the original expression).
Equations
Instances For
Run a computation in the OmegaM
monad, starting with no recorded atoms.
Equations
- m.run cfg = (StateRefT'.run' (StateRefT'.run' m ∅) { } { cfg := cfg }).run'
Instances For
Retrieve the user-specified configuration options.
Equations
- Lean.Elab.Tactic.Omega.cfg = do let __do_lift ← read pure __do_lift.cfg
Instances For
Retrieve the list of atoms.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Return the Expr
representing the list of atoms.
Equations
- Lean.Elab.Tactic.Omega.atomsList = do let __do_lift ← Lean.Elab.Tactic.Omega.atoms liftM (Lean.Meta.mkListLit (Lean.Expr.const `Int []) __do_lift.toList)
Instances For
Return the Expr
representing the list of atoms as a Coeffs
.
Equations
- Lean.Elab.Tactic.Omega.atomsCoeffs = do let __do_lift ← Lean.Elab.Tactic.Omega.atomsList pure ((Lean.Expr.const `Lean.Omega.Coeffs.ofList []).app __do_lift)
Instances For
Run an OmegaM
computation, restoring the state afterwards.
Equations
- Lean.Elab.Tactic.Omega.withoutModifyingState t = Lean.Elab.Tactic.Omega.commitWhen do let __do_lift ← t pure (__do_lift, false)
Instances For
If groundNat? e = some n
, then e
is definitionally equal to OfNat.ofNat n
.
If groundInt? e = some i
,
then e
is definitionally equal to the standard expression for i
.
Construct the term with type hint (Eq.refl a : a = b)
Equations
- Lean.Elab.Tactic.Omega.mkEqReflWithExpectedType a b = do let __do_lift ← Lean.Meta.mkEqRefl a let __do_lift_1 ← Lean.Meta.mkEq a b pure (Lean.Meta.mkExpectedPropHint __do_lift __do_lift_1)
Instances For
Look up an expression in the atoms, recording it if it has not previously appeared.
Return its index, and, if it is new, a collection of interesting facts about the atom.
- for each new atom
a
of the form((x : Nat) : Int)
, the fact that0 ≤ a
- for each new atom
a
of the formx / k
, fork
a positive numeral, the facts thatk * a ≤ x < k * a + k
- for each new atom of the form
((a - b : Nat) : Int)
, the fact:b ≤ a ∧ ((a - b : Nat) : Int) = a - b ∨ a < b ∧ ((a - b : Nat) : Int) = 0
Equations
- One or more equations did not get rendered due to their size.