This PR adds “sparse casesOn” constructions. They are similar to `.casesOn`, but have arms only for some constructors and a catch-all (providing `t.ctorIdx ≠ 42` assumptions). The compiler has native support for these constructors and now (because of the similarity) also the per-constructor elimination principles.
51 lines
1.4 KiB
Text
51 lines
1.4 KiB
Text
inductive Vec (α : Type) : Nat → Type where
|
||
| nil : Vec α 0
|
||
| cons {n} : α → Vec α n → Vec α (n + 1)
|
||
|
||
/--
|
||
info: @[reducible] protected def Vec.nil.elim.{u} : {α : Type} →
|
||
{motive : (a : Nat) → Vec α a → Sort u} → {a : Nat} → (t : Vec α a) → t.ctorIdx = 0 → motive 0 Vec.nil → motive a t
|
||
-/
|
||
#guard_msgs in
|
||
#print sig Vec.nil.elim
|
||
|
||
/--
|
||
info: @[reducible] protected def Vec.cons.elim.{u} : {α : Type} →
|
||
{motive : (a : Nat) → Vec α a → Sort u} →
|
||
{a : Nat} →
|
||
(t : Vec α a) →
|
||
t.ctorIdx = 1 → ({n : Nat} → (a : α) → (a_1 : Vec α n) → motive (n + 1) (Vec.cons a a_1)) → motive a t
|
||
-/
|
||
#guard_msgs in
|
||
#print sig Vec.cons.elim
|
||
|
||
|
||
structure JustOneConstructor where
|
||
(x : Nat)
|
||
(y : Bool)
|
||
|
||
/-- error: Unknown constant `JustOneConstructor.mk.elim` -/
|
||
#guard_msgs in #print sig JustOneConstructor.mk.elim
|
||
|
||
-- Test that the compiler compiles the ctorelim to straight line code
|
||
|
||
set_option trace.Compiler.saveBase true
|
||
|
||
/--
|
||
trace: [Compiler.saveBase] size: 0
|
||
def testDecl1 α motive a.1 t h nil : motive lcAny lcAny :=
|
||
return nil
|
||
-/
|
||
#guard_msgs in
|
||
def testDecl1 :=@Vec.nil.elim
|
||
|
||
/--
|
||
trace: [Compiler.saveBase] size: 3
|
||
def testDecl2 α motive a.1 t h cons : motive lcAny lcAny :=
|
||
cases t : motive lcAny lcAny
|
||
| Vec.cons n a.2 a.3 =>
|
||
let _x.4 := cons n a.2 a.3;
|
||
return _x.4
|
||
-/
|
||
#guard_msgs in
|
||
def testDecl2 := @Vec.cons.elim
|