Wolfram ResearchPRODUCTSPURCHASEFOR USERSCOMPANYOUR SITES
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.

Documentation / Mathematica / デモ / 拡張表記法 /



These cells are here with the correct cell tags so they can copied when the help browser loads just a subsection of the documentation. This means the titles can always be open.

Notation,Symbolize,InfixNotation

Notation

Symbolize

挿入表記法

表記法の入力

表記法の演算子の優先順位

優先順位の決定法

表記法におけるカッコ

表記法の優先順位の変更

オプションと補助関数

オプションAction

オプションWorkingForm

オプションAutoLoadNotationPalette

関数ClearNotations[]

複雑なパターンと高度な機能

注:このセクションは上級ユーザ向けである.

タグボックス

タグNotationBoxTag

複雑なパターンとタグNotationPatternTag

タグNotationMadeBoxesTag

優先順位の変更とTagBoxオプションSyntaxForm

ガイドライン

表記法を段階的に作成する

変更しすぎない

できる限り既存の慣習に従う

可能な限り評価せずに構文解釈する

構造が異なる内部表記と外部表記

アップデートとドキュメントの拡張

Jason Harris, November 1997.

Utilities`Notation`

Notation パッケージを使うと,Mathematica が新しいタイプセット表記法を正しく認識して機能するように,Mathematica を拡張することができる.パッケージNotation.mは主にSymbolizeNotationInfixNotationの3つのユーティリティ関数で構成される.Symbolizeは合成ボックス構造をMathematica が内部で1つのシンボルとして扱うようにするためのものである.Notationは合成ボックス構造のクラスをMathematica が内部で完全形の式のクラスとして扱うようにするものである.また,InfixNotationMathematica が合成式を挿入演算子として扱うようにするものである.

このパッケージに納められている定義を使わないで新しい表記法を定義するためには,明示的にMakeExpressionMakeBoxesの規則を作る必要がある.これらの規則は完全ボックス構造で書かれている必要があるが,これは一般に長く,直感的には理解しにくい.また,新しい表記法の作成にあたり,考慮しなければならないプログラミングに関するいくつかの重要な問題がある.そのため,読みやすさと使いやすさの観点から,新しい表記法を簡単に,直感的に,図式で導入できるようにすることが望まれる.この機能を提供するのがNotation パッケージである.

Notation パッケージの本バージョンでは,前のバージョンとは異なり,すべての表記法は表記法パレットまたは入力エイリアスを介して入力しなければならない(表記法の入力を参照のこと).また,このパッケージの本バージョンは,必要に応じてノートブックを更新し,新しい表記法スタイルを自動的に現在のスタイルシートに追加する.

Notation,Symbolize,InfixNotation

Notation

表記法の宣言のシンタックス

Notation は引数として外部表現と内部表現の両方を取る.Mathematica は外部表現に合致する入力すべてを対応する内部表現に変換し,また反対に,内部表現に合致する式を対応する外部表現にフォーマットする.ここで表現というのは,ある「表記法」を表すボックスで構成された複合構造のことである.

パッケージをロードする.

In[1]:=

gplusという新しい表記法を宣言する.

In[2]:=

に合致する入力はすべてgplus[x,y,n]として構文解析される.

In[3]:=

Out[3]//FullForm=

gplus式はすべて新しい表記法にフォーマットされる.

In[4]:=

Out[4]=

を使って定義された表記法は,指定の表記法に従って式を構文解析・フォーマットする.しかし,表記法の命令文の中での代わりにまたはを使って,このような表記法を構文解析だけ,またはフォーマットだけするように限定することもできる.

仮のDomainIntegralの構文解析のための表記法を定義する.

In[5]:=

これでDomainIntegralsが解析可能になった.

In[6]:=

Out[6]=

外観がより従来の数式に近いDerivativeオブジェクトの出力形式を定義する.

In[7]:=

これにより,導関数は新しい導関数表記法でフォーマットされる.

In[9]:=

Out[9]=

前の出力を入力として使えるようにするために,偏導関数の構文解析が定義できる.

In[10]:=

これでこれらの新しい導関数の表記法が使える.

In[12]:=

Out[12]=

ユーザは通常構文解析とフォーマットの両方の機能が使用できると考えているので,両方の表記法の定義を行うことが望ましい.

次の表記法は,Applyが上ルビとして付加された矢印のフォーマットと構文解析をするものである.

In[13]:=

線形性など簡単な規則が,直観的な方法で入力できるようになった.

In[14]:=

In[15]:=

Out[15]=

初めはNotation文の両辺のアンダースコアがいくらか奇異に感じるかもしれない.しかし,表記法の変換は通常双方向に機能するため,Notation文の両辺のアンダースコアは至極自然なものであり,すぐに直観的に理解できるようになるであろう.

Symbolize

シンボル化の宣言のシンタックス

Symbolizeはボックス構造のクラスを内部的にシンボルとして扱うために使われる.複合オブジェクトは,ときにシンボル化しなければならないことがある.例えば複合オブジェクトに規則が付加できるようにするためには,そのオブジェクトはシンボルとして扱われなければならない.

次の式は複合オブジェクトScriptCapitalDScriptOScriptMScriptAScriptIScriptNPartialD がシンボルとして扱われるように宣言する.

In[16]:=

パッケージは複合シンボルScriptCapitalDScriptOScriptMScriptAScriptIScriptNPartialD 用のFullForm名を作成した.

In[17]:=

Out[17]//FullForm=

これで複合シンボルScriptCapitalDScriptOScriptMScriptAScriptIScriptNPartialD に規則が添付できる.

In[18]:=

上記のScriptCapitalDScriptOScriptMScriptAScriptIScriptNPartialD の規則はDomainIntegralsの規則の前に適用が試みられる.

In[19]:=

Out[19]=

Symbolizeは,例えばRuleが下付き文字として付加されているオブジェクトすべてをシンボル化するために,式のクラスもシンボル化する.

In[20]:=

これでRuleが下付き文字として付加されているものはすべてシンボルとして扱われる.

In[21]:=

Out[21]//FullForm=

シンボル化されたボックス構造は,定義の中でパターン変数として使うことができる.これにより,より親しみやすい表記法で公式が作成できる.しかし,「複合パターン変数 : パターンの内容」の形のパターン式を使わなければならない.この形でないと,Mathematica がそのパターン式を「複合パターン変数 パターンの内容」と構文解析してしまうことがある.

次の式は,ある状況下でのポテンシャルステップにおける入射波パケットの透過係数を定義する.

In[22]:=

In[23]:=

InfixNotation

挿入表記法の宣言のシンタックス

InfixNotationは複合ボックス構造を挿入演算子として扱うために用いられる.InfixNotationは挿入演算子を表す複合ボックスオブジェクトと,式の完全形頭部となるシンボルの両方を必要とする.この双対性は,Mathematica において挿入表記法+が完全形頭部Plusを持っているのと類似している.

複合オブジェクトJoinの挿入形式として動作するように宣言する.

In[23]:=

In[24]:=

Out[24]=

挿入表記法は入力を構文解析し,出力をフォーマットする.

In[25]:=

Out[25]=

挿入演算子の定義にNotationではなくInfixNotationを使うと,式を評価することなく内部のフラットな形式に構文解析できるという利点がある.これは小さなことではあるが,重要である(リング演算可能な限り評価せずに構文解釈するを参照のこと).

InfixNotationは入力を構文解析してフラットな式にする.

In[26]:=

Out[26]//FullForm=

関数InfixNotationは,関数~~の挿入形式を使用する場合と比較できる(Mathematica ブック2.1.3を参照のこと).

表記法の入力

独自の表記法の定義の際には,表記法テンプレートを使うことが「非常に」重要となる.表記法テンプレートは以下に示される表記法パレットに含まれている.

このような制限があるのは,ノートブックにペーストされたテンプレートには基本的なタグボックスが正しく埋め込まれているからである.このような埋め込まれたタグボックスを利用すると,NotationSymbolizeInfixNotationを使って新しく定義される表記法を適切にグループ化し,構文解析することができるようになる.さらに,これらの関数も新しい表記法のスタイル情報を得て,出力が入力と同じスペーシング,サイズ,調整などでフォーマットできるようになる.

空の表記法テンプレートは次のようなものである.

注:表記法パレットを使わないで,対応する文字のボックス構造をNotationBoxTag[]でラップしてもよい.

Mathematica では,必要な表記法や式すべてについて入力エイリアスが作成できる.このような入力に使う通常のインターフェースはやや扱いにくいため,Notation パッケージには関数AddInputAliasが含まれている.これは現行のノートブックに容易に入力エイリアスが加えられるようにするためのものである.一般的なテンプレートには簡単に入力するためのそれぞれのエイリアスがある.例えばEscapeKeynotationEscapeKeyと入力すると,表記法テンプレートが入力される.

現行ノートブックに命令文を適用するための入力エイリアスを加える.

In[27]:=

これでEscapeKeyapplyEscapeKeyと入力するだけで「適用」テンプレートが入力できるエイリアスが作成された.

表記法の演算子の優先順位

優先順位の決定法

新しい表記法または演算子の優先順位は,それを構成しているコンポーネントを調べて決定される.例えばは+の,演算子の,マッピングLongRightArrowの優先順位に従ってグループ分けされる.ポジショニングボックスのグループ化は,一般に「基底要素」で決定される.例えば,式SubscriptBox[symb, sub]symb に基づいてグループ分けされる.しかし,構造的なボックスによっては,囲んでいる要素のグループ化にはボックスの内容が関係しないこともある.複合オブジェクトの優先順位は以下の表に従って決まる.

標準ボックスとその優先順位との関係

新しい複合演算子の構成要素に対応する優先順位を作成するという設計により,表記法は直観的に理解でき,一般に矛盾のないものとなる.例として,リングに対して可能な加算と乗算の表記法を考えてみる.

次の式はリング加算とリング乗算の表記法を定義する.

In[28]:=

これでMathematica はリング加算とリング乗算を含む式を解析し,フォーマットできるようになった.

In[30]:=

Out[30]=

In[31]:=

Out[31]//FullForm=

リング乗算演算子はリング加算演算子よりも優先順位が高い.これは*の優先順位が+より高いからである.さらに,この表記法は正しい構造を維持するために式に適切なカッコを加えるように自動的に設定される.

出力は正しい形式,スタイル,スペース,カッコを持つ.

In[32]:=

Out[32]=

しかしリング加算とリング乗算の上記の表記法には限界がある.

In[33]:=

Out[33]=

上記Notation文を削除して,その代わりにInfixNotationを使うことができる.

In[34]:=

これでRingPlusRingTimesの正しい挿入演算子として動作する.

In[38]:=

Out[38]=

表記法におけるカッコ

表記法の中で,式を{}() LeftAngleBracketRightAngleBracket[]|やその他のカッコを使って囲むと,表記法のグループ分けが変わるだけでなく,カッコが入力式の中に存在しなければならなくなることに注目することは重要である.

次の式は丸カッコを使う表記法を定義する.

In[39]:=

In[40]:=

Out[40]//FullForm=

丸カッコがないと,入力はSemanticラッパーとして認識されない.

In[41]:=

Out[41]//FullForm=

表記法の優先順位の変更

内容を隔離するボックス構造で演算子や式を囲むことで,その演算子や式の周りにある要素を隔離することができる(上記表を参照).このカプセル化/隔離を行うためによく用いられるボックス構造はTagBoxである.さらに,TagBoxのオプションSyntaxFormを使うと,演算子の優先順位が変えられる.これについての詳細は,後ほどセクション「複雑なパターンと高度な機能」で述べる.

ScriptCapitalDScriptOScriptMScriptAScriptIScriptNPartialD に内在するボックス構造にはTagBoxが埋め込まれている.

In[42]:=

Out[42]=

に埋め込まれたTagBoxが必要とされることには,いくつかの理由がある.それは,ZeroWidthTimesを有効にするStyleBoxを含むため,自然な前置演算子がをグループ分けしないようにするため,そしてカプセル化された部分に構文解析とフォーマットの規則が適用されるようにするためである.

オプションと補助関数

NotationSymbolizeInfixNotationには,その動作を変更するためのいくつかのオプションがある.これらの表記法関数はすべてオプションWorkingFormおよびActionのを取る.さらに,Notation パッケージは,パレットのロードに影響を及ぼすローカルオプションAutoLoadNotationPaletteを取る.また,Notation パッケージには,それまでに定義された表記法,シンボル,挿入演算子をすべてクリアする関数が含まれている.

オプションAction

Actionオプションと,その値

NotationSymbolizeInfixNotationのオプションActionは,表記法の命令文が,生成した規則に対して行う動作を決めるものである.Actionオプションのデフォルトの値はCreateNotationRulesである.この場合,生成された表記法規則がシステムに入力される.

次の式は,従来の数式表記により近い,純関数についての表記法を作成する.

In[43]:=

これで,純関数に次の新しい表記が使われる.

In[44]:=

Out[44]=

ActionオプションがRemoveNotationRulesに設定されると,表記法の規則はシステムから削除される.オプション値RemoveNotationRulesを表記法の命令文の中で使うことと,適切なRemoveNotationRemoveSymbolizeRemoveInfixNotation文を使うことは,同等である.

次の式は上記表記法をシステムから取り除く.

In[45]:=

これで関数の特別な表記法は定義されていない状態になった.

In[46]:=

Out[46]=

オプションActionPrintNotationRulesに設定すると,表記法の命令文により生成された規則を見ることができる. MakeExpressionMakeBoxesの規則を調べると,表記法の命令文で使われている内在のボックス構造が分かるので,役立つことがある.

次の式は,指定のNotationに対応するMakeExpressionMakeBoxesの規則を表示する.

In[47]:=

オプションWorkingForm

WorkingFormオプションとその値

オプションWorkingFormNotationSymbolizeInfixNotation文が生成される「形式」や「環境」を指定するものである.WorkingFormの値は一般にStandardFormまたはTraditionalFormである.つまり,作成される表記法はどれも(それぞれ)StandardFormまたはTraditionalFormである.しかし,WorkingFormLogicFormPhysicsFormなど,定義されているどのような形式にも設定できる.

オプションWorkingFormAutomaticに設定されていると,NotationSymbolize,またはInfixNotation文はDefaultOutputFormatTypeで作成される.この形式は「セル」メニューの「標準出力形式」にある.

次の式はベクトル微積分関数DivCurl,およびラッパーVectorについてTraditionalFormの表記法を作成する.

In[48]:=

これらの表記法は希望通り動作する.

In[51]:=

Out[51]//TraditionalForm=

In[52]:=

Out[52]//FullForm=

In[53]:=

Out[53]=

オプションAutoLoadNotationPalette

オプションAutoLoadNotationPaletteとその動作

パッケージを設計しているときは,パッケージのロードの際にユーザを混乱させないように表記法パレットを隠した方がよいこともあるだろう.これは設計しているパッケージ内のブール変数AutoLoadNotationPaletteを設定することで行える.AutoLoadNotationPaletteFalseに設定されていると,Notation パッケージをロードしても表記法パレットはロードされない.値が定義されていないか,またはTrueのときは,Notation パッケージのロード時に表記法パレットもロードされる.入力形では,命令文は以下のようになる.

次はNotation パッケージのロードの際に表記法パレットがロードされないようにする文である.

関数ClearNotations[]

表記法クリアのシンタックス

一連の表記法を入力し直したいとき,または「クリーンスタート」をしたいときは,システムの中に存在する表記法,シンボル,挿入表記法をすべて消去するClearNotations[]コマンドが使える.ClearNotations[]を使っても,MakeExpressionMakeBoxesに作った他のパッケージや定義には影響しない.

表記法,シンボル,挿入表記法をすべて消去する.

In[54]:=

複雑なパターンと高度な機能

このセクションは上級ユーザ向けである.

Notation パッケージの内部の動作が複雑であるため,Mathematica フロントエンドのより高度な機能と構造のいくつかについてと,それがNotation パッケージにどのように関わってくるかの概要を知っておくと役立つ.以下のセクションでは,タグボックス,パッケージが使う特定のタグ,およびタグボックスオプションSyntaxFormの機能についての概要を述べる.

このセクションはセクション2.9 式のテキスト形入出力のコンセプトを理解しており,さらに2.9.3 式の拡張テキスト形式2.9.4 テキスト記述の式の解釈2.9.10 ボックス形テキスト表記2.9.12 ボックスの文字列表記2.9.13 文字列,ボックス,式の間の変換2.9.17 発展:低レベル入出力の規則についてよく知っていることを前提としている.

タグボックス

TagBoxRowBoxSubscriptBoxGridBoxと同様のボックス構造である.これは基底のレベルにおいて式の構造を変更したり,グループ化や部分式の解釈を示したりするのに使われる.タグボックスを理解するために,まずTagBoxが埋め込まれた次の入力を考える.

Mathematica 入出力は低レベルではすべてボックス構造で構成されている.Mathematica が入力を受け取ると,これらのボックス式は解析されて内部式になる.これは完全形の式と考えることができる.その後内部評価が行われ,最後に内部構造はMathematica フロントエンドでの表示のためにボックス構造に戻される.Mathematica がどのように低レベルの入力を見るかは「書式」メニューにある「セルを式で表示」コマンドを使って見ることができる.

以下は上記の式の基底にあるボックスを使った表現である.これは「書式」メニューの「セルを式で表示」メニュー項目で表示できる.

上式は部分式TagBox[SuperscriptBox["x", "2"],foo]]を含んでいる.このボックス式は,TagBoxが埋め込まれていてもMathematica で通常見えるようにと表示されることに注目されたい.タグに含まれている情報はユーザから見えないのである.TagBoxを含んでいる式がMathematica に入力されると,解析された部分式の周りのTagBox名(この場合はx^2の周りのfoo)が,TagBoxで囲まれた部分式のデフォルトの解釈でラップされる.

埋め込まれたTagBoxタグfooには特別な解析のための動作は関連付けられていない.

In[55]:=

Out[55]=

しかし,特定のタグボックスが構文解析される方法で独自の規則を定義することもできる.例えば,低レベル関数MakeExpressionを使うと,MathematicaTagBoxを含む式を解析する方法を変更することができる.

MakeExpressionについての新しい規則を定義すると,Mathematica がタグliteralBoxesを持つTagBoxを含む式をどのように構文解析するかが変更できる.

In[56]:=

これで,ボックスだけを返すという特別な解析動作が,埋め込まれたTagBoxタグliteralBoxesに関連付けられた.

In[57]:=

Out[57]=

このような特別な動作が特定のタグに設定できることを知っていると,Notation パッケージで定義されているタグの詳細がわかる.Notation パッケージでは,特別な動作を持つ3つのタグ,NotationBoxTagNotationPatternTag,およびNotationMadeBoxesTagが定義されている.

タグNotationBoxTag

NotationBoxTagはボックス構造をMathematica が構文解析する前に捉えるために,Notation パッケージで使われるタグである.実際,NotationBoxTagはむしろ上で定義したタグliteralBoxesのように動作する.表記法パレットにあるNotationSymbolizeInfixNotationテンプレートはすべてNotationBoxTagが埋め込まれたタグボックスを含んでいる.埋め込まれたTagBoxにより,Notation パッケージが正しい解析情報を得て,適切な書式とグループ分け情報が維持できるようになる.

埋め込まれたNotationBoxTagタグを含む式.

In[58]:=

Out[58]//FullForm=

ボックス構造コードをNotationBoxTagでラップすると,表記法テンプレートを使わないでも行える.

In[59]:=

In[60]:=

Out[60]//FullForm=

複雑なパターンとタグNotationPatternTag

通常の目的では,Notation文とSymbolize文に含まれるパターンはシンプルなパターンで十分である.しかし,時にはより複雑なパターンが表記法で必要,または望ましいことがある.例えば,ある表記法が特定のパターンが数値のときだけ有効となる場合である.表記法の命令文にNotationPatternTagタグボックスを含めると,より複雑なパターンが可能になる.定義した複雑なパターンを使うどの表記法にも,NotationPatternTagが埋め込まれていることが重要である.埋め込まれていないとパターンが文字通りの式として扱われ,パターンとしては機能しなくなってしまう.表記法パレットには「InsertPatternWrapper」というボタンが含まれている.これは選択範囲の周りにNotationPatternTagを埋め込み,またその選択範囲が複雑なパターンを含んでいることを示すために背景に色を付ける.

次の式は数値にのみ機能するTraditionalForm表記法を作成する.

In[61]:=

外部表現におけるパターンマッチングはボックス構造に施されるので,一般にボックス構造を通常の式に変換する際に多少の操作を要するということも特筆すべきことであろう.内部表現でのパターンマッチングは従来のパターンマッチングに従う.

次の式はボックス構造に作用するNumericQに似た関数を定義する.

In[62]:=

これで,上記パターンにマッチする入力だけがfooオブジェクトとして解釈されるようになった.

In[63]:=

Out[63]=

反対に,引数が数値であるfooオブジェクトだけがこの表記法を使ってフォーマットされる.

In[64]:=

Out[64]//TraditionalForm=

式を解析する際,テスト関数によって必要のない評価を行ってしまうことのないように気を付ける必要がある(可能な限り評価せずに構文解釈するを参照のこと).

オプションAction RulePrintNotationRulesを使って作成した規則の形式を調べることができる.

In[65]:=

パターンa_?StringNumericQa_?NumericQは表記法の命令文においてNotationPatternTagで囲まれているため,その通りには現れないことがわかる.

タグNotationMadeBoxesTag

NotationMadeBoxesTagは上級ユーザ向けのタグである.これはボックスの処理とフォーマットが既に終了しているため,Notation パッケージは何の処理も行う必要がないということを示すために使われる.このタグは一般に,既にボックスに変換されている式や解析されている式を持つユーザ定義関数を囲むときに使う.タグNotationMadeBoxesTagを理解するために,Tensorの表記法の作成に使われている多くの文の一部に使用できる表記法の命令文を調べてみる.

タグNotationMadeBoxesTagを含むテンソルのフォーマットのための表記法の例.

In[66]:=

返された内部定義から,式createGridBox[inds]にはさらに行わなければならない処理は何もない,つまりMakeBoxes[...,StandardForm]で囲まれていないということが分かる.

優先順位の変更とTagBoxオプションSyntaxForm

オプションSyntaxFormを使うと,TagBoxを含む式の優先順位が変更できる.SyntaxFormオプションを含んでいるタグボックスは,TagBox[ box structure, tag, SyntaxForm Rulestring]のような形式となる.ここで,string はタグボックスの優先順位がモデル化される演算子を表す文字列である.次の例でSyntaxFormオプションを説明する.

標準の優先順位の矢印LongLeftRightArrowを使う式.

In[67]:=

Out[67]//FullForm=

優先順位が低く設定されているSyntaxFormオプションを持つTagBoxで囲まれた複合矢印LongLeftRightArrowの新しい表記法が定義できる.

In[68]:=

新しく作った複合矢印の優先順位は低い.

In[69]:=

Out[69]//FullForm=

上式の基底にあるグループ分けは次の表のようになっている.

優先順位変更タグボックス付き/なしの式の優先順位とグループ分け

SyntaxFormオプションは,その値として,Mathematica で使えるどの演算子の文字列でも取ることができる.この演算子とは,UnicodeCharacters.trファイルに含まれている演算子のことである.SyntaxFormの値は,演算子の前後に,優先順位が前置・挿入・後置演算子のいずれであるかを示すシンボルを含むこともできる.次の表に,いくつかの一般的なオプションの値を示す.

一般的なSyntaxFormの値と,それに関連付けられている優先順位

ガイドライン

以下は,Notation パッケージの使用中,および/または表記法の作成中に発生する可能性がある問題と検討事項である.

表記法を段階的に作成する

目に見えないものをデバッグするのは困難である.従って,表記法を作成し,それが動作しているか,間違いがないかを見るのが最もよい方法である.テストしないで複雑な表記法のすべてを入力すると,誤りを見付けるのが難しくなる.通常,表記法に関する問題の多くは,式の完全形を確認したり,eでその内部構造を調べたりすることにより明らかになる.

変更しすぎない

変更し過ぎないように注意されたい.例えば,コンマは縦棒に変更するなどは避けるべきである.形の中で異常な表記がより多く存在すれば,それだけ1つの表記法が他の表記法に悪影響を及ぼして意外な結果が生じる危険性も高まる.構文解析法によっては指定の文法におけるコンフリクトを検出するメカニズムを備えていることもあるが,Notation パッケージにはない.

できる限り既存の慣習に従う

可能な限り,Mathematica の標準の慣習や,その分野の慣習に従うべきである.独自の非標準的な表記法は,他のユーザが認識できないためお勧めしない.たとえ歴史的な起源がある表記法が,他の著者が考えうる表記法と比べて直観的でなかったとしても,できる限り歴史的な表記法を使う方がよいだろう.しかし,表記法によっては,存在する矛盾を解決するのが難しく,一貫した表記法が望まれる場合もあることも否めない.

可能な限り評価せずに構文解釈する

表記法の作成の際は,式を評価せずに正しい完全形に構文解釈できることが望ましい.これは外部形式と内部形式が一対一で対応しない複雑な表記法では不可能なこともある.しかし,可能な場合は,評価による2次的な作用はない.

次の表記法は正しく動作するために評価に依存しない.

In[70]:=

In[71]:=

Out[71]//FullForm=

望ましくない評価の一般的な例として,複雑なパターンとタグNotationPatternTagで使われているテスト関数がある.可能なら,テスト関数がその引数を維持するように設計すべきである.

関数StringNumericQを使って定義された表記法は引数を評価する.そのため,結果は予期できないものとなる.

In[72]:=

Out[72]=

構造が異なる内部表記と外部表記

従来の表記法がMathematica での内部構造に簡単には一致しない場合は,表記法が内部Mathematica 名の従来の形式に「Typeset」が後置した形を取るようにすることをお勧めする.例えば,MeijerG関数は次のTraditionalFormでなければならない.

しかしMathematica におけるMeijerG関数のFullFormは次の形式である.

従って,MeijerG関数の内部形式を構築することができるようになる前に,これらが正しい値をもつ数であることを確認しなければならない.従来の形式から内部形式へ評価せずに変換することはできない.

そのため,この場合は従来のMeijerGボックス形式をMeijerGTypeset[{{,},{,}},{,...,},{,...,}}]としなければならない.その後,構築が可能になったら評価して内部MeijerG関数にする.

また,別の可能性として,定義された「テンソル」をGridBoxを用いて式TensorTypesetにするというものがある.構造が有効である,つまりテンソルが同じ列内に反変および共変指数を持つなどの場合は,これを評価すると内部形式「Tensor」になる.

Jason Harris (jasonh@wolfram.com), April 2003.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information


 © 2008 Wolfram Research, Inc.  Terms of Use  Privacy Policy | [en] |
ニュースレターのご登録