elab_as_elim

[elab_as_elim] 属性を付与すると、除去子(eliminator)としてエラボレートされるようになります。

universe u

/-- 標準の再帰子である`Nat.rec`を真似て作った再帰子もどき -/
def Nat.rec' {motive : Nat → Sort u}
    (zero : motive 0) (succ : ∀ n, motive n → motive (n + 1))
    (t : Nat) : motive t := Nat.rec zero succ t

-- メタ変数を具体的に表示しない
set_option pp.mvars false in

-- 何も付けないとこういうエラーメッセージ
/-
error: Function expected at
  Nat.rec' ?_ (fun x b => b + 1) ?_
but this term has type
  ?_ ?_

Note: Expected a function because this term is being applied to the argument
  a
-/
def add (a b : Nat) := Nat.rec' _ (zero := b) (succ := fun _ b => b + 1) a

-- `elab_as_elim` 属性を付与する
attribute [elab_as_elim] Nat.rec'

-- 「eliminatorがエラボレートできません」というエラーメッセージに変わる。
-- eliminatorだと認識されている!
/- error: failed to elaborate eliminator, expected type is not available -/
def add (a b : Nat) := Nat.rec' _ (zero := b) (succ := fun _ b => b + 1) a