60 lines
2.4 KiB
Text
60 lines
2.4 KiB
Text
/-!
|
||
This test tests and also explains the noConfusionType construction.
|
||
|
||
It contains copies of the definitions of the constructions, for manual experimentation with
|
||
the code, and uses `#guard_msgs` and `rfl` to compare them to the generated ones.
|
||
|
||
This also serves as documentation to the `NoConfusionLinear` module, so do not delete or remove
|
||
from this file without updating that module's docstring.
|
||
-/
|
||
|
||
-- set_option debug.skipKernelTC true
|
||
-- set_option trace.Meta.mkNoConfusion true
|
||
-- set_option trace.Kernel true
|
||
-- set_option genInjectivity false
|
||
-- set_option trace.Meta.injective true
|
||
-- set_option trace.Meta.Tactic.injection true
|
||
|
||
inductive Vec.{u} (α : Type) : Nat → Type u where
|
||
| nil : Vec α 0
|
||
| cons1 {n} : α → Vec α n → Vec α (n + 1)
|
||
| cons2 {n} : α → Vec α n → Vec α (n + 1)
|
||
|
||
@[reducible] protected def Vec.noConfusionType'.{u_1, u} : Sort u_1 →
|
||
{α : Type} → {a : Nat} → Vec.{u} α a →
|
||
{α : Type} → {a : Nat} → Vec α a → Sort u_1 :=
|
||
fun P _ _ x1 _ _ x2 =>
|
||
Vec.casesOn x1
|
||
(if h : x2.ctorIdx = 0 then
|
||
Vec.nil.elim (motive := fun _ _ => Sort u_1) x2 h (P → P)
|
||
else P)
|
||
(fun {n} a_1 a_2 => if h : x2.ctorIdx = 1 then
|
||
Vec.cons1.elim (motive := fun _ _ => Sort u_1) x2 h fun {n_1} a a_3 => (n = n_1 → a_1 ≍ a → a_2 ≍ a_3 → P) → P
|
||
else P)
|
||
(fun {n} a_1 a_2 => if h : x2.ctorIdx = 2 then
|
||
Vec.cons2.elim (motive := fun _ _ => Sort u_1) x2 h fun {n_1} a a_3 => (n = n_1 → a_1 ≍ a → a_2 ≍ a_3 → P) → P
|
||
else P)
|
||
|
||
/--
|
||
info: @[reducible] protected def Vec.noConfusionType.{u_1, u} : Sort u_1 →
|
||
{α : Type} → {a : Nat} → Vec α a → {α' : Type} → {a' : Nat} → Vec α' a' → Sort u_1 :=
|
||
fun P {α} {a} t {α'} {a'} t' =>
|
||
Vec.casesOn t (if h : t'.ctorIdx = 0 then Vec.nil.elim t' h (P → P) else P)
|
||
(fun {n} a a_1 =>
|
||
if h : t'.ctorIdx = 1 then Vec.cons1.elim t' h fun {n_1} a_2 a_3 => (n = n_1 → a ≍ a_2 → a_1 ≍ a_3 → P) → P
|
||
else P)
|
||
fun {n} a a_1 =>
|
||
if h : t'.ctorIdx = 2 then Vec.cons2.elim t' h fun {n_1} a_2 a_3 => (n = n_1 → a ≍ a_2 → a_1 ≍ a_3 → P) → P else P
|
||
-/
|
||
#guard_msgs in
|
||
#print Vec.noConfusionType
|
||
|
||
example : @Vec.noConfusionType.{u_1,u} = @Vec.noConfusionType'.{u_1,u} := rfl
|
||
|
||
|
||
-- A possibly tricky universes case (resulting universe cannot be decremented)
|
||
|
||
inductive UnivTest.{u,v} (α : Sort v): Sort (max u v 1) where
|
||
| mk1 : UnivTest α
|
||
| mk2 : (x : α) → UnivTest α
|
||
| mk3 : (x : α) → UnivTest α
|