This PR fixes a kernel type mismatch that occurs when using `grind` on goals containing non-standard `OfNat.ofNat` terms. For example, in issue #9477, the `0` in the theorem `range_lower` has the form: ```lean (@OfNat.ofNat (Std.PRange.Bound (Std.PRange.RangeShape.lower (Std.PRange.RangeShape.mk Std.PRange.BoundShape.closed Std.PRange.BoundShape.open)) Nat) (nat_lit 0) (instOfNatNat (nat_lit 0))) ``` instead of the more standard form: ```lean (@OfNat.ofNat Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) ``` Closes #9477
29 lines
920 B
Text
29 lines
920 B
Text
structure T where
|
|
upper_bound : Nat
|
|
|
|
def T.range (a : T) := 0...a.upper_bound
|
|
|
|
theorem range_lower (a : T) : a.range.lower = 0 := by rfl
|
|
|
|
/--
|
|
info: range_lower (a : T) :
|
|
@Eq (Std.PRange.Bound { lower := Std.PRange.BoundShape.closed, upper := Std.PRange.BoundShape.open }.lower Nat)
|
|
(@Std.PRange.lower { lower := Std.PRange.BoundShape.closed, upper := Std.PRange.BoundShape.open } Nat a.range)
|
|
(@OfNat.ofNat
|
|
(Std.PRange.Bound { lower := Std.PRange.BoundShape.closed, upper := Std.PRange.BoundShape.open }.lower Nat)
|
|
(nat_lit 0) (instOfNatNat (nat_lit 0)))
|
|
-/
|
|
#guard_msgs in
|
|
set_option pp.explicit true in
|
|
#check range_lower
|
|
|
|
set_option warn.sorry false
|
|
|
|
#guard_msgs in
|
|
theorem test (p : T) (n: Nat) : n ≤ p.range.upper := by
|
|
fail_if_success grind only [range_lower]
|
|
sorry
|
|
|
|
example (p : T) (n: Nat) : n ≥ p.range.lower := by
|
|
set_option trace.Meta.debug true in
|
|
grind only [range_lower]
|