タプル
タプルまたはチュープル(テンプレート:Lang-en-short)とは、複数の構成要素からなる組を総称する一般概念。
数学や計算機科学などでは通常、順序付けられた対象の並びを表すために用いられる。個別的には、n個でできた組を英語で「n-tuple」と書き、日本語に訳す場合は通常「n組」としている。タプルの概念そのものも組と呼ばれる場合がある。なお、 n-tuple は数学のタプルを意味するほか、同様に double、triple などの拡張として倍数詞の表現にも利用される(詳細は「倍」の記事を参照)。
目次
数学におけるタプル
非形式的説明
集合論では n 組 (n-tuple) とは n 個の対象 a1, a2, ..., an の順序づけられた組であり、普通、括弧でくくって (a1, a2, a3, ..., an) のように書かれる。 タプルが順序づけられているということは、2 つの n 組 (a1, a2, ..., an) と (b1, b2, ..., bn) が等しいとされるのが、対応する位置の要素がすべて等しいとき、すなわち (a1 = b1) ∧ (a2 = b2) ∧ ... ∧ (an = bn) であるとき、かつそのときに限ることを意味する。 タプルと直積集合には密接な関係があり、n 組の i 番目の対象が集合 Ai の要素とみなされるならば、n 組は直積集合 A1 × A2 × ... × An の要素である。
2 つの要素 a ∈ A, b ∈ B の順序づけられた組 (a, b) ∈ A × B は特に順序対 (ordered pair) と呼ばれる。 形式上は逆に、この順序対を元とすることによって一般の n 組 (n ≧ 2) を、例えば (a1, a2, a3, ..., an) = (...((a1, a2), a3), ..., an) のようにして構成的に定めることもできる。
タプルは様々な数学概念を定義するためにも利用される。 例えば、有限オートマトンは、入力アルファベットの有限集合 Σ, 状態の有限集合 S, 初期状態 s0 ∈ S, 遷移関数 δ : Σ × S → S, 受理状態の有限集合 F ⊆ S の 5 つ組 (quintuple, 5-tuple) (Σ, S, s0, δ, F) として定められ、有向グラフは、頂点集合 V と辺の集合 A ⊆ V × V の順序対 (V, A) として定められる。
なお数ベクトルも同じように要素の順序づけられた並びとして表されるが、数学の形式上、ある線形空間の要素とみなされるベクトルは実数、複素数など同じ体の要素からなるものである。 対して、タプルは任意の集合の要素を並べただけのずっと一般的な概念であるといえる。
タプルの特殊名
タプルには要素の個数による特殊名が存在する。これらはフランス語に由来するラテン語系の語彙で、少なくとも「クインチュープル」までと「デキュプル」は輸入当時のフランス語から直接受け継いだものである。
要素の数 | 和名 | 英名 |
---|---|---|
1 | シングル | single |
2 | ダブル | double |
3 | トリプル | triple |
4 | クオドループル | quadruple |
5 | クインチュープル | quintuple |
6 | セクスチュープル | sextuple |
7 | セプチュプル | septuple |
8 | オクチュプル | octuple |
9 | ノニュプル | nonuple |
10 | デキュプル | decuple |
100 | センチュプル | centuple |
計算機科学におけるタプル
LISP、ML、Haskell、Python といったいくつかのプログラミング言語は、このタプルを保持するデータ構造を有している。
LISP におけるタプル
LISP言語では、二分木(ダブル)が利用できる。コンスセル[1]と呼ばれるものである。二分木の要素には名前がついており、前者をテンプレート:ルビ、後者をテンプレート:ルビという。二分木のデータを生成するには、cons
関数を用いる。car部もcdr部も、格納すデータの型に制限はない。
(cons car部のデータ cdrのデータ)
car部のデータを取り出すには関数 car
を使い、cdr部のデータを取り出すには関数 cdr
を使う。
(setq x (cons 'A 1))
(setq a (car x)) ; a には 'A が入る
(setq b (cdr x)) ; b には 1 が入る
また、
(list データ1 データ2 データ3 … データN)
という関数呼び出しは、
(cons データ1 (cons データ2 (cons データ3 … (cons データN nil) … )))
という形、すなわち、car部にデータがあり、cdr部が後続のコンスセルになっており、最後のcdr部分を nil
という特殊な記号で終端させた二分木を返す。このような形式の二分木を「S式」または「(プロパー)リスト」という。
二分木は LISP 言語では組み込みデータ型の一つであり、S式型の二分木は LISP プログラムのコードを自体を記述するデータ形式でもある。
Python におけるタプル
Python では任意の要素数のタプルを利用できる。Python のタプルは、いくつかの値 (数値型、文字列型など)をひとつにまとめて、あたかもひとつの値のように扱う機能である。また、要素のデータ型がすべて同一でないといけない配列でとは異なり、タプルでは要素の型の同一性は不問である。
たとえば ('A', 1)
という 文字列と整数 からなるタプルについて考える。タプルは、ひと塊として変数に代入できる:
x = ('A', 1)
さらに、タプルは関数の返り値として使うこともできる。これによって、複数の値を返す関数を実現することができる。
def func():
return ('A', 1)
x = func() # x には ('A', 1) が入る
また、タプルは下記のようにして個別の要素を分離する。
x = ('A', 1)
(a, b) = x # a には 'A'、b には 1 が入る
関係データベースにおけるタプル
関係データベースの理論である関係モデルでは、タプル(組)とはある関係(リレーション)を表(テーブル) として表したときの1つの行にあたり、形式的には、上述のタプルと同様に属性名を添字とした属性の型の直積集合の要素として表される。