This PR generates `.ctorIdx` functions for all inductive types, not just enumeration types. This can be a building block for other constructions (`BEq`, `noConfusion`) that are size-efficient even for large inductives. It also renames it from `.toCtorIdx` to `.ctorIdx`, which is the more idiomatic naming. The old name exists as an alias, with a deprecation attribute to be added after the next stage0 update. These functions can arguably compiled down to a rather efficient tag lookup, rather than a `case` statement. This is future work (but hopefully near future). For a fair number of basic types the compiler is not able to compile a function using `casesOn` until further definitions have been defined. This therefore (ab)uses the `genInjectivity` flag and `gen_injective_theorems%` command to also control the generation of this construct. For (slightly) more efficient kernel reduction one could use `.rec` rather than `.casesOn`. I did not do that yet, also because it complicates compilation.
13 lines
258 B
Text
13 lines
258 B
Text
inductive MyBool where
|
|
| MyTrue
|
|
| MyFalse
|
|
|
|
inductive T where
|
|
| mk (b: MyBool) (u: Unit)
|
|
|
|
inductive isTrue: T → Type where
|
|
| intro: isTrue (.mk .MyTrue ())
|
|
|
|
example {τ: T} (h: isTrue τ): Unit :=
|
|
match τ, h with
|
|
| .mk .MyTrue (), .intro => ()
|