This PR improves support for `Fin n` in `grind cutsat` when `n` is not a
numeral. For example, the following goals can now be solved
automatically:
```lean
example (p d : Nat) (n : Fin (p + 1))
: 2 ≤ p → p ≤ d + 1 → d = 1 → n = 0 ∨ n = 1 ∨ n = 2 := by
grind
example (s : Nat) (i j : Fin (s + 1)) (hn : i ≠ j) (hl : ¬i < j) : j < i := by
grind
example {n : Nat} (j : Fin (n + 1)) : j ≤ j := by
grind
example {n : Nat} (x y : Fin ((n + 1) + 1)) (h₂ : ¬x = y) (h : ¬x < y) : y < x := by
grind
```
38 lines
1.3 KiB
Text
38 lines
1.3 KiB
Text
/-
|
|
Copyright (c) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Lean.CoreM
|
|
|
|
public section
|
|
|
|
namespace Lean
|
|
|
|
register_builtin_option exponentiation.threshold : Nat := {
|
|
defValue := 256
|
|
descr := "maximum value for \
|
|
which exponentiation operations are safe to evaluate. When an exponent \
|
|
is a value greater than this threshold, the exponentiation will not be evaluated, \
|
|
and a warning will be logged. This helps to prevent the system from becoming \
|
|
unresponsive due to excessively large computations."
|
|
}
|
|
|
|
/--
|
|
Returns `true` if `n` is `≤ exponentiation.threshold`. Otherwise,
|
|
reports a warning and returns `false`.
|
|
This method ensures there is at most one warning message of this kind in the message log.
|
|
-/
|
|
def checkExponent (n : Nat) (warning := true) : CoreM Bool := do
|
|
let threshold := exponentiation.threshold.get (← getOptions)
|
|
if n > threshold then
|
|
if (← pure warning <&&> logMessageKind `unsafe.exponentiation) then
|
|
logWarning s!"exponent {n} exceeds the threshold {threshold}, exponentiation operation was not evaluated, use `set_option {exponentiation.threshold.name} <num>` to set a new threshold"
|
|
return false
|
|
else
|
|
return true
|
|
|
|
end Lean
|