Prod

Prod は、データを重ね合わせたものを表現しており、Prod A BA のデータと B のデータの両方を持たされているようなデータの集まりです。A × B と表記されます。

example {A B : Type} : Prod A B = (A × B) := by rfl

#check (Prod.mk 3 "hello" : Nat × String)

(x₁, x₂, .., xₙ) という構文で項を表すことができます。

#guard (3, "hello") = Prod.mk 3 "hello"

カリー化

A × B → CA → B → C の間に自然な全単射が存在し、同値になることが知られています。

example {A B C : Type} : (A × B → C) ≃ (A → B → C) where
  toFun f a b := f (a, b)
  invFun f p := f p.1 p.2
  left_inv := by
    intro f
    funext p
    cases p
    rfl
  right_inv := by
    intro f
    funext a b
    rfl

この同値関係を使って A × B 上の関数をばらして定義域から積を消す操作を カリー化 と呼びます。カリー化を行うと部分適用を行いやすくなるので、Lean では関数は常にカリー化することが推奨されます。