lean4-htt/tests/lean/run/subsingletonCasesOn.lean
Cameron Zwarich c1b5d54737
feat: compiler support for casesOn of subsingletons (#9411)
This PR adds support for compilation of `casesOn` for subsingletons. We
rely on the elaborator's type checking to restrict this to inductives in
`Prop` that can actually eliminate into `Type n`. This does not yet
cover other recursors of these types (or of inductives not in `Prop` for
that matter).
2025-07-16 23:07:32 +00:00

66 lines
2.1 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.

def addAndMatch (a₁ a₂ : Array Nat) (i j : Nat) (and : And (i < a₁.size) (j < a₂.size)) : Nat :=
match and with
| ⟨p, q⟩ => a₁[i] + a₂[j]
def addAndCasesOn (a₁ a₂ : Array Nat) (i j : Nat) (and : And (i < a₁.size) (j < a₂.size)) : Nat :=
and.casesOn fun p q => a₁[i] + a₂[j]
/-- info: 9 -/
#guard_msgs in
#eval addAndMatch #[1, 2, 3] #[4, 5, 6, 7] 1 3 (And.intro (by grind) (by grind))
/-- info: 9 -/
#guard_msgs in
#eval addAndCasesOn #[1, 2, 3] #[4, 5, 6, 7] 1 3 (And.intro (by grind) (by grind))
structure Und (P Q : Prop) : Prop where
p : P
q : Q
def addUndMatch (a₁ a₂ : Array Nat) (i j : Nat) (and : Und (i < a₁.size) (j < a₂.size)) : Nat :=
match and with
| ⟨p, q⟩ => a₁[i] + a₂[j]
def addUndCasesOn (a₁ a₂ : Array Nat) (i j : Nat) (and : Und (i < a₁.size) (j < a₂.size)) : Nat :=
and.casesOn fun p q => a₁[i] + a₂[j]
/-- info: 8 -/
#guard_msgs in
#eval addUndMatch #[1, 2, 3] #[4, 5, 6, 7] 2 1 (Und.mk (by grind) (by grind))
/-- info: 8 -/
#guard_msgs in
#eval addUndCasesOn #[1, 2, 3] #[4, 5, 6, 7] 2 1 (Und.mk (by grind) (by grind))
def castEqMatch (n₁ n₂ : Nat) (eq : Eq n₁ n₂) (v : Vector Nat n₁) : Vector Nat n₂ :=
match eq with
| .refl _ => v
def castEqCasesOn (n₁ n₂ : Nat) (eq : Eq n₁ n₂) (v : Vector Nat n₁) : Vector Nat n₂ :=
eq.casesOn v
/-- info: 5 -/
#guard_msgs in
#eval castEqMatch (1 + 3) (2 + 2) (.refl 4) #[2, 3, 5, 7].toVector |>.get 2
/-- info: 5 -/
#guard_msgs in
#eval castEqCasesOn (1 + 3) (2 + 2) (.refl 4) #[2, 3, 5, 7].toVector |>.get 2
inductive Eek {α : Type} : αα → Prop where
| refl (a : α) : Eek a a
def castEekMatch (n₁ n₂ : Nat) (eq : Eek n₁ n₂) (v : Vector Nat n₁) : Vector Nat n₁ :=
match eq with
| .refl _ => v
def castEekCasesOn (n₁ n₂ : Nat) (eq : Eek n₁ n₂) (v : Vector Nat n₁) : Vector Nat n₁ :=
eq.casesOn v
/-- info: 7 -/
#guard_msgs in
#eval castEekMatch (1 + 3) (2 + 2) (.refl 4) #[2, 3, 5, 7].toVector |>.get 3
/-- info: 7 -/
#guard_msgs in
#eval castEekCasesOn (1 + 3) (2 + 2) (.refl 4) #[2, 3, 5, 7].toVector |>.get 3