#check
#check
コマンドは,項の型を表示します.Lean ではすべての項に型があるので,どんな項にも使えます.#check term
というコマンドで,term
の型を表示します.逆に term
の型が T
であることを確かめるには example
コマンドを使用して example : T := term
とします.
基本的な項の型
-- 文字
#check 'a'
-- 文字列
#check "Hello"
-- 自然数
#check 1
-- 浮動小数点数
#check 1.0
-- 整数
#check -2
-- `1` はそのままだと自然数扱いになるが,整数にキャストできる
#check (1 : Int)
-- 自然数のリスト
#check [1, 2, 3]
-- 自然数の配列
#check #[1, 2, 3]
-- 関数
#check fun x ↦ x + 42
-- Bool, 真偽値
#check true
-- 命題
#check True
型の型
「すべての」項には型があるので,型も型を持ちます.
-- 宇宙変数を宣言する
universe u
#check (Prop : Type)
-- Lean では `List` は Type を受け取って,Type を返す関数.
#check (List : (α : Type u) → Type u)
-- 配列も同じ.型を型に変換する関数.
#check (Array : (α : Type u) → Type u)
-- `Type` 自身も型を持っており…
#check (Type : Type 1)
#check (Type 1 : Type 2)
-- この調子で限りなく続く
#check (Type u : Type (u + 1))
命題と証明
Lean では命題やその証明にも型があります.命題の型は Prop
で,命題の項が証明になっています.逆に言えば,Lean ではある命題 P : Prop
を証明するということは,P
という型を持つ項 proof : P
を構成することと同じです.
#check (1 + 1 = 2 : Prop)
-- `1 + 1 = 2` の証明 `two_eq_add_one` を構成
theorem two_eq_add_one : 2 = 1 + 1 := by rfl
-- 証明の型が命題になっている
#check (two_eq_add_one : 2 = 1 + 1)
型としての True/False
True
は型としては一点集合であり,
False
は型としては空集合です.
-- `trivial : True` は `True` 型を持つ項
#check trivial
関数としての証明
命題 P → Q
の証明は,P → Q
という型を持つ項です.
つまり,P
の証明 h : P
に対して Q
の証明を返す関数です.
theorem tautology : True -> True := fun a ↦ a
-- 暗黙の変数を明示的にするために `@` を付けた.
-- `tautology : True → True` と出力されるので,
-- `tautology` は `True → True` という関数であることがわかる
#check (@tautology : True → True)
-- 実際に `trivial : True` を「代入」すると
-- `tautology trivial : True` となり,
-- 確かに `True` 型の項が得られていることがわかる.
#check (tautology trivial : True)