attribute

attribute は,属性(attribute)を付与するためのコマンドです.

次の例では,命題に simp 属性を付与しています.これは simp タクティクで利用される命題を増やすことを意味します.

theorem foo {P Q : Prop} : (P → Q) ∧ P ↔ Q ∧ P := by
  constructor <;> intro h
  · obtain ⟨hPQ, hP⟩ := h
    constructor
    · apply hPQ
      assumption
    · assumption
  · obtain ⟨hP, hQ⟩ := h
    constructor
    · intro _
      assumption
    · assumption

-- `simp` では示せない
example {P Q : Prop} : (P → Q) ∧ P ↔ Q ∧ P := by
  simp
  sorry

-- `attribute` で属性を付与
attribute [simp] foo

-- `simp` で示せるようになった
example {P Q : Prop} : (P → Q) ∧ P ↔ Q ∧ P := by
  simp

与えた属性を削除することもできます.削除するには - を属性の頭に付けます.

-- `simp` 属性を削除
attribute [-simp] foo

example {P Q : Prop} : (P → Q) ∧ P ↔ Q ∧ P := by
  simp
  sorry

attribute コマンドを使用すると定義の後から属性を付与することができますが,定義した直後に属性を付与する場合は @[..] という書き方が使えます.

@[simp]
theorem bar {P Q : Prop} : (P → Q) ∧ P ↔ Q ∧ P := by
  constructor <;> intro h
  · obtain ⟨hPQ, hP⟩ := h
    constructor
    · apply hPQ
      assumption
    · assumption
  · obtain ⟨hP, hQ⟩ := h
    constructor
    · intro _
      assumption
    · assumption

example {P Q : Prop} : (P → Q) ∧ P ↔ Q ∧ P := by
  simp