シンボルの属性で,このシンボル f がネストしている場合に自動的にフラットにする(ネストをほどく)ことを指定する.この属性はパターンマッチの際に考慮される.
Flat
シンボルの属性で,このシンボル f がネストしている場合に自動的にフラットにする(ネストをほどく)ことを指定する.この属性はパターンマッチの際に考慮される.
例題
すべて開く すべて閉じる例 (3)
スコープ (3)
Attributes[NonCommutativeMultiply](a**(b**c))**(d)パターンマッチングで,Flatは要素列の置換を許容する:
SetAttributes[f, Flat]f[a, b, c, d, e] /. f[b, c, d] -> xf[a, b, c, d, e] /. f[b, c, d] -> f[x, y]f[a, b, c, d, e] /. f[b] -> x平坦で順序を問わない関数の場合,引数の部分集合が一致することがある:
SetAttributes[f, {Flat, Orderless}]f[a, b, c, d, e] /. f[d, b] -> x特性と関係 (5)
f[f[a, b], f[c, f[d, e]]]Flatten[%]SetAttributes[g, Flat]g[g[a, b], g[c, g[d, e]]]SetAttributes[g, {Flat, OneIdentity}]g[x_, y_] := x + yg[a, b, c, d]平らな頭部を持つ式は,任意の列とマッチする場合はその全体がマッチされるとみなされる:
a + b + Sin[a + b] /. a + b -> 5{a + b, Sin[a + b]} /. a + b -> 5ReplaceRepeatedは出現するすべてを確実に置換するのに役立つかもしれない:
a + b + Sin[a + b] //. a + b -> 5BlankがFlat関数 f 内の列をマッチするとき,頭部 f はそのまま保持される:
SetAttributes[f, Flat]f[a, b, c] /. f[a, x_] -> {x}f[a, b, c] /. f[x_] -> {x}BlankSequenceやBlankNullSequenceのような連続パターンはFlatの影響は受けない:
f[a, b, c] /. f[a, z__] :> {z}f[a, b, c] /. f[a, z___] :> {z}OneIdentityではない関数 f については,f[x_]が f[expr]と比較される際に,パターンマッチはまず x_を f[expr]にバインドしようとし,それが失敗したときに限って expr にバインドしようとする:
SetAttributes[f, Flat]f[3] /. f[z_] /; IntegerQ[Echo[z]] :> z関数がOneIdentity属性も持つ場合は,最初の試みは省かれる:
SetAttributes[fo, {Flat, OneIdentity}]fo[3] /. fo[z_] /; IntegerQ[Echo[z]] :> z考えられる問題 (4)
平坦で順序を問わない関数の場合,パターンマッチにはたくさんの場合を試さなければならないことがある:
SetAttributes[f, {Flat, OneIdentity, Orderless}]ReplaceList[f[a, b, c, d], f[x_, y_] :> {x, y}]Longestを使うと,短い部分式についての追加的なマッチを防ぐことができる:
SetAttributes[f, {Flat, OneIdentity}]Replace[f[a, b, c, d], f[x_, y__, z_] :> {y}]Replace[f[a, b, c, d], f[x_, Longest[y__], z_] :> {y}]平坦な関n f については,パターン f[_]は f と1つあるいは複数の引数をマッチする:
SetAttributes[f, Flat]MatchQ[f[1, 2], f[_]]Repeatedを,たとえ平坦な関数の中でも1つの引数のみをマッチするパターンとして使うことができる:
MatchQ[f[1, 2], f[Repeated[_, {1}]]]x_は平坦な関数の頭部とともにマッチされるので,制約は思いがけない動作をするかもしれない:
Replace[a + b + c , Plus[a, x_] :> x]x_Plus はPlus[b,c]とマッチするので次の制約はうまくいく:
Replace[a + b + c , Plus[a, x_Plus] :> x]x_はPlusとSymbolの両方の頭部を持つことはできないので,次は失敗する:
Replace[a + b + c , Plus[a, x_Symbol] :> x]BlankSequenceを左辺に使うとより一貫した結果が与えられる:
Replace[a + b + c, Plus[a, x__Symbol] :> Plus[x]]関連項目
テクニカルノート
-
▪
- 平坦な関数と順不同な関数 ▪
- 属性 ▪
- パターンと変換規則
履歴
1988 で導入 (1.0)
テキスト
Wolfram Research (1988), Flat, Wolfram言語関数, https://reference.wolfram.com/language/ref/Flat.html.
CMS
Wolfram Language. 1988. "Flat." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/Flat.html.
APA
Wolfram Language. (1988). Flat. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/Flat.html
BibTeX
@misc{reference.wolfram_2026_flat, author="Wolfram Research", title="{Flat}", year="1988", howpublished="\url{https://reference.wolfram.com/language/ref/Flat.html}", note=[Accessed: 07-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_flat, organization={Wolfram Research}, title={Flat}, year={1988}, url={https://reference.wolfram.com/language/ref/Flat.html}, note=[Accessed: 07-September-2026]}