ext
ext
は、外延性(extensionality)を使うタクティクです。外延性とは、「同じものから作られているものは同じである」という主張のことです。たとえば
- 集合
A, B ⊂ α
についてA = B
はx ∈ A ↔ x ∈ B
と同じ - 2つの写像
f g : A → B
があるときf = g
は∀ a ∈ A, f a = g a
と同じ
といったことを指します。
@[ext]
で登録されたルールを使用するため、集合の等式 A = B
を示すときは Mathlib.Data.SetLike.Basic
も必要です。
import Aesop -- `aesop` タクティクを使うために必要
import Mathlib.Data.SetLike.Basic -- `ext` タクティクで集合の等号を展開するために必要
variable {α : Type}
-- `s` と `t` は `α` の部分集合
variable (s t : Set α)
example : s ∩ t = t ∩ s := by
-- `x ∈ α` を取る。
ext x
-- ` x ∈ s ∩ t ↔ x ∈ t ∩ s` を証明すればよい
show x ∈ s ∩ t ↔ x ∈ t ∩ s
aesop
[ext] 属性
[ext]
属性を命題に与えると、上記のようにその命題は ext
タクティクで利用できるようになります。さらに、[ext]
属性は構造体に対しても与えることができます。このとき、その構造体に対して自動的に .ext
と .ext_iff
の2つの定理が生成されます。
variable {α : Type}
structure Point (α : Type) where
x : α
y : α
-- 最初は存在しない
#check_failure Point.ext
#check_failure Point.ext_iff
-- `Point` に `[ext]` 属性を与える
attribute [ext] Point
-- 自動生成された定理
-- 各フィールドの値が等しければ、2つの `Point` は等しいという主張
#check (Point.ext : ∀{x y : Point α}, x.x = y.x → x.y = y.y → x = y)
-- 自動生成された定理その2
-- 2つの `Point` の点が等しいことは、各フィールドの値が等しいことと同値
#check (Point.ext_iff : ∀{x y : Point α}, x = y ↔ x.x = y.x ∧ x.y = y.y)