abbrev

abbrev は,別名を宣言する構文です.

たとえば,Nat 型に別の名前を与えたかったとしましょう.Lean では型も他の項と同様に宣言できるので,次のように書いて問題がないように見えます.

def NaturalNumber : Type := Nat

しかし,ここで定義した Nat の別名を項に対して使用するとエラーになります.これは,Lean が NaturalNumber を定義に簡約(reduce)するよりも先に,42 : NaturalNumber という表記が定義されているか OfNat のインスタンスを探そうとするためです.1

/--
error: failed to synthesize instance
  OfNat NaturalNumber 42
-/
#check (42 : NaturalNumber)

ここでエラーを修正する方法の一つが,def の代わりに abbrev を使用することです.

abbrev NaturalNumber : Type := Nat

#check (42 : NaturalNumber)

舞台裏

abbrev@[reducible] 属性のついた def と同じである2ため,定義に reducible という属性を与えても機能します.

@[reducible]
def NaturalNumber : Type := Nat

#check (42 : NaturalNumber)