たまに見る Mathematica の質問にこんなのがある。下記の書き方で、分母の a b が置換されないのは何故かというものだ。

確かに、パッと式を眺めると、a b を y にいう規則置換すれば、分母の a b x も x y になる気がするのはごく自然。ならないのはなぜでしょう、というのが今回の話。

答えから言うと、期待しているような変換をするには、次のように書く必要がある。

a b を y にというのとは別に、a b の -1 乗を y の -1 乗にという規則を追加している。なんでこんな面倒くさいことをしなければならないかというと、パターンマッチが、ノートブック上に表示されている式の形ではなく、FullForm 形式での式に対して行なわれるためだ。元の式を FullForm で見てみると、こんな形になっていることがわかる。

Plus[Times[Power[a, -1], Power[b, -1], Power[x, -1]], Times[a, b, x]]

つまり、1/(a b x) は、Mathematica 内部では a b x それぞれの -1 乗の積として保持されているのだ。そのため、a b は 1/(a b x) の分母にはヒットしなかったのだ。

分数の内部保持では、他にも、有理数を表す Rational が使われることもある。また、平方根が入ると Power と Rational が混在して使われるケースもある。たとえば次の例。

表示されている式の形だけを見ると、分母も分子も変換されて良さそうだが、実際には分子しか変換されない。これも FullForm をとれば一目瞭然。

ここでは Rational[n:1|-1, 2] として1つのパターンで済ませたが、もちろん、{Sqrt[1 + a_] -> f[a], 1/Sqrt[1 + a_] -> 1/f[a]} として2つの規則のリストにしても構わない。え? Rational や Power を使った形でなくて Sqrt で書いていいのかって?いいのだ。それも FullForm で確認できる。

結局、パターンマッチがうまく行かないときには、対象やパターン(または規則)の FullForm を見ようというのが今回の結論。この話、以前に書いた Mathematica ではすべてが式として扱われているという話にも関連しているので、ご興味のある方は、こちらも合わせてどうぞ。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/481
内容に対しての関連性がみられないものは削除する場合があります

コメント一覧

Mathematica内部でどのように数式が表現されているか……とても興味深いですね。

ちさかさん、いつもありがとうございます。
僕もまだまだ未熟者で、今でも、FullForm すると、意外な発見があったりします。

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報