lean4-htt/tests/lean/run/grind_9477.lean
Paul Reichert 89686fcd02
refactor: replace PRange shape α with Rcc α and eight other types (#10319)
This PR "monomorphizes" the structure `Std.PRange shape α`, replacing it
with nine distinct structures `Std.Rcc`, `Std.Rco`, `Std.Rci` etc., one
for each possible shape of a range's bounds. This change was necessary
because the shape polymorphism is detrimental to attempts of automation.

**BREAKING CHANGE:** While range/slice notation itself is unchanged,
this essentially breaks the entire remaining (polymorphic) range and
slice API except for the dot-notation(`toList`, `iter`, ...). It is not
possible to deprecate old declarations that were formulated in a
shape-polymorphic way that is not available anymore.
2025-10-02 06:45:11 +00:00

48 lines
1.3 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module
inductive BoundShape where
| «open» : BoundShape
| closed : BoundShape
| unbounded : BoundShape
structure RangeShape where
lower : BoundShape
upper : BoundShape
abbrev Bound (shape : BoundShape) (α : Type u) : Type u :=
match shape with
| .open | .closed => α
| .unbounded => PUnit
structure PRange {shape : RangeShape} (α : Type u) where
lower : Bound shape.lower α
upper : Bound shape.upper α
structure T where
upper_bound : Nat
def T.range (a : T) := PRange.mk (shape := ⟨.closed, .open⟩) 0 a.upper_bound
theorem range_lower (a : T) : a.range.lower = 0 := by rfl
/--
info: range_lower (a : T) :
@Eq (Bound { lower := BoundShape.closed, upper := BoundShape.open }.lower Nat)
(@PRange.lower { lower := BoundShape.closed, upper := BoundShape.open } Nat a.range)
(@OfNat.ofNat (Bound { lower := BoundShape.closed, upper := 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]