This PR removes the `NatCast (Fin n)` global instance (both the direct instance, and the indirect one via `Lean.Grind.Semiring`), as that instance causes causes `x < n` (for `x : Fin k`, `n : Nat`) to be elaborated as `x < ↑n` rather than `↑x < n`, which is undesirable. Note however that in Mathlib this happens anyway!
30 lines
641 B
Text
30 lines
641 B
Text
set_option pp.mvars false
|
|
|
|
-- We first verify that there is no global coercion from `Nat` to `Fin n`.
|
|
-- Such a coercion would frequently introduce unexpected modular arithmetic.
|
|
|
|
/--
|
|
error: type mismatch
|
|
n
|
|
has type
|
|
Nat : Type
|
|
but is expected to have type
|
|
Fin 3 : Type
|
|
---
|
|
info: fun n => sorry : (n : Nat) → ?_ n
|
|
-/
|
|
#guard_msgs in #check fun (n : Nat) => (n : Fin 3)
|
|
|
|
-- This instance is available via `open Fin.NatCast in ...`
|
|
|
|
section
|
|
|
|
open Fin.NatCast
|
|
|
|
variable (m : Nat) (n : Fin 3)
|
|
/-- info: n < ↑m : Prop -/
|
|
#guard_msgs in #check n < m
|
|
|
|
end
|
|
|
|
example (x : Fin (n + 1)) (h : x < n) : Fin (n + 1) := x.succ.castLT (by simp [h])
|