The Result
type for norm_num
#
We set up predicates IsNat
, IsInt
, and IsRat
,
stating that an element of a ring is equal to the "normal form" of a natural number, integer,
or rational number coerced into that ring.
We then define Result e
, which contains a proof that a typed expression e : Q($α)
is equal to the coercion of an explicit natural number, integer, or rational number,
or is either true
or false
.
A shortcut (non)instance for AddMonoidWithOne ℕ
to shrink generated proofs.
Equations
- Mathlib.Meta.NormNum.instAddMonoidWithOneNat = inferInstance
Instances For
A shortcut (non)instance for AddMonoidWithOne α
from Ring α
to shrink generated proofs.
Equations
- Mathlib.Meta.NormNum.instAddMonoidWithOne = inferInstance
Instances For
Helper function to synthesize a typed AddMonoidWithOne α
expression.
Equations
- Mathlib.Meta.NormNum.inferAddMonoidWithOne α = do let __do_lift ← Qq.synthInstanceQ q(AddMonoidWithOne «$α») <|> Lean.throwError (Lean.toMessageData "not an AddMonoidWithOne") pure __do_lift
Instances For
Helper function to synthesize a typed Semiring α
expression.
Equations
- Mathlib.Meta.NormNum.inferSemiring α = do let __do_lift ← Qq.synthInstanceQ q(Semiring «$α») <|> Lean.throwError (Lean.toMessageData "not a semiring") pure __do_lift
Instances For
Helper function to synthesize a typed Ring α
expression.
Equations
- Mathlib.Meta.NormNum.inferRing α = do let __do_lift ← Qq.synthInstanceQ q(Ring «$α») <|> Lean.throwError (Lean.toMessageData "not a ring") pure __do_lift
Instances For
Represent an integer as a "raw" typed expression.
This uses .lit (.natVal n)
internally to represent a natural number,
rather than the preferred OfNat.ofNat
form.
We use this internally to avoid unnecessary typeclass searches.
This function is the inverse of Expr.intLit!
.
Instances For
Represent an integer as a "raw" typed expression.
This .lit (.natVal n)
internally to represent a natural number,
rather than the preferred OfNat.ofNat
form.
We use this internally to avoid unnecessary typeclass searches.
Instances For
Extract the raw natlit representing the absolute value of a raw integer literal
(of the type produced by Mathlib.Meta.NormNum.mkRawIntLit
) along with an equality proof.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Constructs an ofNat
application a'
with the canonical instance, together with a proof that
the instance is equal to the result of Nat.cast
on the given AddMonoidWithOne
instance.
This function is performance-critical, as many higher level tactics have to construct numerals. So rather than using typeclass search we hardcode the (relatively small) set of solutions to the typeclass problem.
Instances For
Assert that an element of a semiring is equal to the coercion of some natural number.
- out : a = ↑n
The element is equal to the coercion of the natural number.
Instances For
A "raw int cast" is an expression of the form:
(Nat.rawCast lit : α)
wherelit
is a raw natural number literal(Int.rawCast (Int.negOfNat lit) : α)
wherelit
is a nonzero raw natural number literal
(That is, we only actually use this function for negative integers.) This representation is used by
tactics like ring
to decrease the number of typeclass arguments required in each use of a number
literal at type α
.
Equations
- n.rawCast = ↑n
Instances For
Assert that an element of a ring is equal to num / denom
(and denom
is invertible so that this makes sense).
We will usually also have num
and denom
coprime,
although this is not part of the definition.
- mk: ∀ {α : Type u} [inst : Ring α] {a : α} {num : ℤ} {denom : ℕ} (inv : Invertible ↑denom), a = ↑num * ⅟↑denom → Mathlib.Meta.NormNum.IsRat a num denom
Instances For
A "raw rat cast" is an expression of the form:
(Nat.rawCast lit : α)
wherelit
is a raw natural number literal(Int.rawCast (Int.negOfNat lit) : α)
wherelit
is a nonzero raw natural number literal(Rat.rawCast n d : α)
wheren
is a raw int literal,d
is a raw nat literal, andd
is not1
or0
.
(where a raw int literal is of the form Int.ofNat lit
or Int.negOfNat nzlit
where lit
is a raw
nat literal)
This representation is used by tactics like ring
to decrease the number of typeclass arguments
required in each use of a number literal at type α
.
Equations
- Rat.rawCast n d = ↑n / ↑d
Instances For
The result of norm_num
running on an expression x
of type α
.
Untyped version of Result
.
- isBool: Bool → Lean.Expr → Mathlib.Meta.NormNum.Result'
Untyped version of
Result.isBool
. - isNat: Lean.Expr → Lean.Expr → Lean.Expr → Mathlib.Meta.NormNum.Result'
Untyped version of
Result.isNat
. - isNegNat: Lean.Expr → Lean.Expr → Lean.Expr → Mathlib.Meta.NormNum.Result'
Untyped version of
Result.isNegNat
. - isRat: Lean.Expr → ℚ → Lean.Expr → Lean.Expr → Lean.Expr → Mathlib.Meta.NormNum.Result'
Untyped version of
Result.isRat
.
Instances For
Equations
- Mathlib.Meta.NormNum.instInhabitedResult' = { default := Mathlib.Meta.NormNum.Result'.isBool default default }
The result of norm_num
running on an expression x
of type α
.
Instances For
Equations
- Mathlib.Meta.NormNum.instInhabitedResult = inferInstanceAs (Inhabited Mathlib.Meta.NormNum.Result')
The result is proof : x
, where x
is a (true) proposition.
Equations
- Mathlib.Meta.NormNum.Result.isTrue = Mathlib.Meta.NormNum.Result'.isBool true
Instances For
The result is proof : ¬x
, where x
is a (false) proposition.
Equations
- Mathlib.Meta.NormNum.Result.isFalse = Mathlib.Meta.NormNum.Result'.isBool false
Instances For
The result is lit : ℕ
(a raw nat literal) and proof : isNat x lit
.
Equations
Instances For
The result is -lit
where lit
is a raw nat literal
and proof : isInt x (.negOfNat lit)
.
Instances For
The result is proof : isRat x n d
,
where n
is either .ofNat lit
or .negOfNat lit
with lit
a raw nat literal,
d
is a raw nat literal (not 0 or 1),
n
and d
are coprime, and q
is the value of n / d
.
Equations
Instances For
The result is z : ℤ
and proof : isNat x z
.
Instances For
The result depends on whether q : ℚ
happens to be an integer, in which case the result is
.isInt ..
whereas otherwise it's .isRat ..
.
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.
Returns the rational number that is the result of norm_num
evaluation.
Equations
- Mathlib.Meta.NormNum.Result.toRat (Mathlib.Meta.NormNum.Result'.isBool val proof) = none
- Mathlib.Meta.NormNum.Result.toRat (Mathlib.Meta.NormNum.Result'.isNat inst lit proof) = some ↑(Lean.Expr.natLit! lit)
- Mathlib.Meta.NormNum.Result.toRat (Mathlib.Meta.NormNum.Result'.isNegNat inst lit proof) = some (-↑(Lean.Expr.natLit! lit))
- Mathlib.Meta.NormNum.Result.toRat (Mathlib.Meta.NormNum.Result'.isRat inst q n d proof) = some q
Instances For
Returns the rational number that is the result of norm_num
evaluation, along with a proof
that the denominator is nonzero in the isRat
case.
Equations
- Mathlib.Meta.NormNum.Result.toRatNZ (Mathlib.Meta.NormNum.Result'.isBool val proof) = none
- Mathlib.Meta.NormNum.Result.toRatNZ (Mathlib.Meta.NormNum.Result'.isNat inst lit proof) = some (↑(Lean.Expr.natLit! lit), none)
- Mathlib.Meta.NormNum.Result.toRatNZ (Mathlib.Meta.NormNum.Result'.isNegNat inst lit proof) = some (-↑(Lean.Expr.natLit! lit), none)
- Mathlib.Meta.NormNum.Result.toRatNZ (Mathlib.Meta.NormNum.Result'.isRat inst q n d proof) = some (q, some q(⋯))
Instances For
Extract from a Result
the integer value (as both a term and an expression),
and the proof that the original expression is equal to this integer.
Equations
- Mathlib.Meta.NormNum.Result.toInt _i (Mathlib.Meta.NormNum.Result'.isNat inst lit proof) = pure (↑(Lean.Expr.natLit! lit), ⟨q(Int.ofNat «$lit»), q(⋯)⟩)
- Mathlib.Meta.NormNum.Result.toInt _i (Mathlib.Meta.NormNum.Result'.isNegNat inst lit proof) = pure (-↑(Lean.Expr.natLit! lit), ⟨q(Int.negOfNat «$lit»), proof⟩)
- Mathlib.Meta.NormNum.Result.toInt _i x = failure
Instances For
Extract from a Result
the rational value (as both a term and an expression),
and the proof that the original expression is equal to this rational number.
Equations
- Mathlib.Meta.NormNum.Result.toRat' _i (Mathlib.Meta.NormNum.Result'.isBool val proof) = none
- Mathlib.Meta.NormNum.Result.toRat' _i (Mathlib.Meta.NormNum.Result'.isNat inst lit proof) = some (↑(Lean.Expr.natLit! lit), ⟨q(Int.ofNat «$lit»), ⟨q(1), q(⋯)⟩⟩)
- Mathlib.Meta.NormNum.Result.toRat' _i (Mathlib.Meta.NormNum.Result'.isNegNat inst lit proof) = some (-↑(Lean.Expr.natLit! lit), ⟨q(Int.negOfNat «$lit»), ⟨q(1), q(⋯)⟩⟩)
- Mathlib.Meta.NormNum.Result.toRat' _i (Mathlib.Meta.NormNum.Result'.isRat inst q n d proof) = some (q, ⟨n, ⟨d, proof⟩⟩)
Instances For
Given a NormNum.Result e
(which uses IsNat
, IsInt
, IsRat
to express equality to a rational
numeral), converts it to an equality e = Nat.rawCast n
, e = Int.rawCast n
, or
e = Rat.rawCast n d
to a raw cast expression, so it can be used for rewriting.
Instances For
Result.toRawEq
but providing an integer. Given a NormNum.Result e
for something known to be an
integer (which uses IsNat
or IsInt
to express equality to an integer numeral), converts it to
an equality e = Nat.rawCast n
or e = Int.rawCast n
to a raw cast expression, so it can be used
for rewriting. Gives none
if not an integer.
Equations
- Mathlib.Meta.NormNum.Result.toRawIntEq (Mathlib.Meta.NormNum.Result'.isNat inst lit p) = some (↑(Lean.Expr.natLit! lit), ⟨q(«$lit».rawCast), q(⋯)⟩)
- Mathlib.Meta.NormNum.Result.toRawIntEq (Mathlib.Meta.NormNum.Result'.isNegNat inst lit p) = some (-↑(Lean.Expr.natLit! lit), ⟨q((Int.negOfNat «$lit»).rawCast), q(⋯)⟩)
- Mathlib.Meta.NormNum.Result.toRawIntEq (Mathlib.Meta.NormNum.Result'.isRat inst q n d proof) = none
- Mathlib.Meta.NormNum.Result.toRawIntEq (Mathlib.Meta.NormNum.Result'.isBool val proof) = none
Instances For
Constructs a Result
out of a raw nat cast. Assumes e
is a raw nat cast expression.
Equations
- Mathlib.Meta.NormNum.Result.ofRawNat ((fn.app sα).app lit) = Id.run (Mathlib.Meta.NormNum.Result.isNat sα lit q(⋯))
- Mathlib.Meta.NormNum.Result.ofRawNat e = (panicWithPosWithDecl "Mathlib.Tactic.NormNum.Result" "Mathlib.Meta.NormNum.Result.ofRawNat" 397 70 "not a raw nat cast").run
Instances For
Constructs a Result
out of a raw int cast.
Assumes e
is a raw int cast expression denoting n
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Constructs a Result
out of a raw rat cast.
Assumes e
is a raw rat cast expression denoting n
.
Instances For
Convert a Result
to a Simp.Result
.
Instances For
Given Mathlib.Meta.NormNum.Result.isBool p b
, this is the type of p
.
Note that BoolResult p b
is definitionally equal to Expr
, and if you write match b with ...
,
then in the true
branch BoolResult p true
is reducibly equal to Q($p)
and
in the false
branch it is reducibly equal to Q(¬ $p)
.
Equations
- Mathlib.Meta.NormNum.BoolResult p b = Q(Bool.rec (¬«$p») «$p» «$b»)
Instances For
Obtain a Result
from a BoolResult
.
Equations
Instances For
If a = b
and we can evaluate b
, then we can evaluate a
.