非結合的演算の記法
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/13 01:24 UTC 版)
詳細は「Operator associativity」を参照 非結合的演算が一つの式の中で複数回現れるときには、評価の順を指し示すために括弧を挿入することは(例えば .mw-parser-output .sfrac{white-space:nowrap}.mw-parser-output .sfrac.tion,.mw-parser-output .sfrac .tion{display:inline-block;vertical-align:-0.5em;font-size:85%;text-align:center}.mw-parser-output .sfrac .num,.mw-parser-output .sfrac .den{display:block;line-height:1em;margin:0 0.1em}.mw-parser-output .sfrac .den{border-top:1px solid}.mw-parser-output .sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}2/3/4 のように、ほかの方法で順番を指定する記法を用いているのでない限り)一般には不可避である。とはいえ、いくつかのよく用いられる非結合的演算については、特定の順番に評価することにして括弧の使用を回避する簡便記法が、受け入れられている。 左結合 (left-associative) 演算とは、規約として左から右に評価する—式で書けば x ∗ y ∗ z := ( x ∗ y ) ∗ z w ∗ x ∗ y ∗ z := ( ( w ∗ x ) ∗ y ) ∗ z etc. ( ∀ w , x , y , z , … ∈ S ) {\displaystyle {\begin{array}{l}x*y*z:=(x*y)*z\\w*x*y*z:=((w*x)*y)*z\\{\text{etc.}}\end{array}}\qquad (\forall w,x,y,z,\dotsc \in S)} を意味する—演算を言う。同様に右結合 (right-associative) 演算は、右から左に評価するものと約束する: x ∗ y ∗ z := x ∗ ( y ∗ z ) w ∗ x ∗ y ∗ z := w ∗ ( x ∗ ( y ∗ z ) ) etc. ( ∀ w , x , y , z , … ∈ S ) . {\displaystyle {\begin{array}{l}x*y*z:=x*(y*z)\\w*x*y*z:=w*(x*(y*z))\\{\text{etc.}}\end{array}}\qquad (\forall w,x,y,z,\dotsc \in S).} 左結合演算も右結合演算もどちらも生じ得る。左結合演算の例: 実数の減法および除法: x − y − z := ( x − y ) − z {\displaystyle x-y-z:=(x-y)-z} x / y / z := ( x / y ) / z . {\displaystyle x/y/z:=(x/y)/z.} 函数の適用: ( f x y ) = ( ( f x ) y ) . {\displaystyle (f\,x\,y)=((f\,x)\,y).} この記法はカリー化の同型によって動機づけられる。 右結合演算の例: 実数の冪(上付き添字記法の場合): x y z = x ( y z ) . {\displaystyle x^{y^{z}}=x^{(y^{z})}.} 冪演算は、反復的な左結合冪演算にあまり需要がない(左からの繰り返しの冪は、冪指数の乗法を使って ( x y ) z = x ( y z ) {\displaystyle (x^{y})^{z}=x^{(yz)}} と書き直せる)ため、括弧が付かない場合にはふつう右結合的とする。正しく組まれている限り、上付き添字それ自体に括弧で括るのと本質的に同じ効果が期待できる。例えば 2x+3 という式では右肩の和の計算が冪をとるよりも先に行われ、それは括弧で括って 2(x+3) と明示的に書いたときに期待される計算順序になっている。それゆえ、xyz のような式が与えられたときは、底 x に対する全体の冪指数 yz がまず計算されるのは必定である。とはいえ、手書きする場合などは特にそうだが、文脈によっては x y z , x y z , x y z {\displaystyle {x^{y}}^{z},\quad x^{yz},\quad x^{y^{z}}} (これらを、陽に括弧を付けて書けば、順に ( x y ) z , x ( y z ) , x ( y z ) {\textstyle (x^{y})^{z},\,x^{(yz)},\,x^{(y^{z})}} )の判別が難しいこともある。そういった場合には、ふつう右結合性が暗黙に用いられている。 写像の合成(図式順): Z → Z → Z = Z → ( Z → Z ) {\displaystyle \mathbb {Z} \rightarrow \mathbb {Z} \rightarrow \mathbb {Z} =\mathbb {Z} \rightarrow (\mathbb {Z} \rightarrow \mathbb {Z} )} x ↦ y ↦ x − y = x ↦ ( y ↦ x − y ) . {\displaystyle x\mapsto y\mapsto x-y=x\mapsto (y\mapsto x-y).} これらの演算の右結合記法は、カリー–ハワード対応およびカリー化同型に動機づけられる。 評価順について特定の規約がない演算の例: 実数の冪演算(中置記法の場合): ( x ∧ y ) ∧ z ≠ x ∧ ( y ∧ z ) . {\displaystyle (x^{\wedge }y)^{\wedge }z\neq x^{\wedge }(y^{\wedge }z).} クヌースの矢印記法: a ↑↑ ( b ↑↑ c ) ≠ ( a ↑↑ b ) ↑↑ c a ↑↑↑ ( b ↑↑↑ c ) ≠ ( a ↑↑↑ b ) ↑↑↑ c etc. {\displaystyle {\begin{array}{l}a\uparrow \uparrow (b\uparrow \uparrow c)\neq (a\uparrow \uparrow b)\uparrow \uparrow c\\a\uparrow \uparrow \uparrow (b\uparrow \uparrow \uparrow c)\neq (a\uparrow \uparrow \uparrow b)\uparrow \uparrow \uparrow c\\{\text{etc.}}\end{array}}} ベクトルの交叉積(ベクトル三重積): a → × ( b → × c → ) ≠ ( a → × b → ) × c → ( ∃ a → , b → , c → ∈ R 3 ) . {\displaystyle {\vec {a}}\times ({\vec {b}}\times {\vec {c}})\neq ({\vec {a}}\times {\vec {b}})\times {\vec {c}}\qquad (\exists {\vec {a}},{\vec {b}},{\vec {c}}\in \mathbb {R} ^{3}).} 実数の対ごとの算術平均: ( x + y ) / 2 + z 2 ≠ x + ( y + z ) / 2 2 ( ∀ x , y , z ∈ R , x ≠ z ) . {\displaystyle {(x+y)/2+z \over 2}\neq {x+(y+z)/2 \over 2}\qquad (\forall x,y,z\in \mathbb {R} ,x\neq z).} 集合の差: ( A ∖ B ) ∖ C {\displaystyle (A\setminus B)\setminus C} は A ∖ ( B ∖ C ) {\displaystyle A\setminus (B\setminus C)} と一致しない(論理学における否定論理包含(英語版)の場合と比較せよ)。
※この「非結合的演算の記法」の解説は、「結合法則」の解説の一部です。
「非結合的演算の記法」を含む「結合法則」の記事については、「結合法則」の概要を参照ください。
- 非結合的演算の記法のページへのリンク