説明

数式・数値計算向けプログラム・コードの前処理

【課題】理工学分野で広く使われている暗黙の前提を反映した数式/数値計算式の文字列を、数学ライブラリが豊富に備わっている C, Java(登録商標), Python などの既存言語で扱える数式/数値計算式の文字列に変換する。
【解決手段】暗黙の前提を反映させるユーザー変数を導入する。そして数式/数値計算式中の変数を、ユーザー変数と既存言語の変数のどちらであるかを判別できるようにする。ユーザー変数について既存言語の式または値を対応させる辞書テーブルを用意する。ユーザー変数を含む数式/数値計算式文字列を与えられた前処理プログラムは、この辞書テーブルの対応を既存言語上で実現させると同時に、既存言語で計算可能な数式/数値計算文字列に変換する。

【発明の詳細な説明】
【技術分野】
【0001】
本願発明は、既存プログラム言語で数式/数値計算式を記述するとき冗長になってしまう問題を解決し、数式/数値計算に特化した簡潔な記述を可能にするための前処理に関するものである。
【背景技術】
【0002】
C, Java(登録商標), Python などの既存言語には、すでに数多くの数式処理ライブラリ、数値計算ライブラリが蓄積されている。
【0003】
でもこれらは汎用の言語であり、できるだけ多くの分野で使えるように作られている。これらの言語を数式/数値計算に使ったとき、そのシンボリックな数式記述および数値計算式記述は冗長なものとなる欠点があった。
【0004】
たとえば、数学では「 a (b + c)」と書いたとき「a * (b + c)」の意味であり、「*」演算子は省略するのが普通である。一方で C, Java(登録商標), Python などの既存言語を記述するときには「*」演算子の省略は許されない。C, Java(登録商標), Python などの既存言語では「 a (b + c)」が「 b + c 」引数値で、関数 a を呼び出すとの意味になるからである。(たとえ「a」と 「(b + c)」の間にスペースが入っていても関数呼び出しとなる)。このように数学で慣れている数式/数値計算式記述のままでは Java(登録商標), Python などの既存言語ではエラーになってしまう。
【0005】
でも前処理プログラムを働かせて、「 a ( b + c )」と「a」と 「(b + c)」の間にスペースが入っている文字列を「a * (b + c)」文字列に変換して既存言語で扱えるようにしてやることで、数学で頻繁に使われる「*」を省略した数式を書きながら、C, Java(登録商標), Python などの既存言語には「*」を書いた数式を扱わせられる。

【先行技術文献】
【特許文献】
【0006】
G06F分類を中心に調べたが、類似特許は見つからなかった。本発明のような前処理により既存言語の数式/数値計算のための膨大なライブラリを使いやすくする発明は見つからなかった。
【非特許文献】
【0007】
非特許文献でも、本発明のような前処理により既存言語の数式/数値計算のための膨大なライブラリを使いやすくする発明は見つからない。近年まで、数式/数値計算のための膨大なライブラリの蓄積といえる状況になっていなかったためだと考える。
【0008】
あえて言えば、C言語のプリプロセッサ・マクロに文字列の置き換え機能があり、本発明に近いものと言える。でも、この文字列置き換えマクロでは積演算子「*」 を挿入することができない。C言語のプリプロセッサ・マクロは数式/数値計算式を扱うためのプリプロセッサではない。

【発明の概要】
【発明が解決しようとする課題】
【0009】
でも前処理プログラムが積演算子:「*」を補間するだけでは、まだ多くの数式/数値計算式が数学の記述と既存言語との間で乖離したままである。ユーザーが記述する数式/数値計算式記述には、C, Java(登録商標), Python などの既存言語では許されない暗黙の前提が多くある。
【0010】
例えば、物理で扱う数式では特定の文字/文字列に物理定数が割り振られている。相対性理論を扱うときには小文字の「c」は光定数を意味すること、量子力学を扱うときには小文字の「h}はプランク定数を意味することが暗黙の共通了解事項である。数式/数値計算式では c や h が光速度やプランク定数の意味だとしても、 C, Java(登録商標), Python などの既存言語では、c や h の変数にはカウント値や高さなどの別の意味を与えることの方が普通である。このため「c」や「h」のような短い一文字を光速度やプランク定数の値に限定してしまうことと、C, Java(登録商標), Python などの既存言語で、c や h を別の意味の変数として使うことは共存できない。
【0011】
また、コンピュータ言語 python では虚数は文字 j で表現する。数学での複素数「2+i」は python では「2 + 1j」と表現される。数学での「exp(i 2π/3 )」は、python では「exp(1j* 2 * pi/3 )」と記述せねばならない。数学での虚数 i と python の虚数 j の違いは、違和感が伴う。python など既存言語での複素数の入った数値計算式は、どうしても数学での数値計算式より書きにくく/読みにくくなる。
【0012】
また、数学では「x^3 + 2x^2 + 3x + 4」と書けば多項式を意味する。「x は多項式を表すためのシンボル変数である」ことが多くの場合に暗黙の共通了解事項となっている。x がシンボル変数であることを前提に、多項式の加減乗算や微分演算などがなされる。でも C, Java(登録商標), Python などの既存言語では「x は多項式を表すための記号変数である」とはなっていない。たとえ「*」を補完して「x^3 + 2*x^2 + 3*x + 4」の文字列に変換しても、まだ C, Java(登録商標), Python などの既存言語では、この多項式での加減乗除や微分演算を扱えない。通常、既存言語では x はローカル変数まはた引数で使われることが普通である。何らかの方法で x がシンボル変数であることを既存言語に明示してやる必要がある。
【0013】
さらに嫌らしいことに、「暗黙の共通了解事項」は分野によって異なる。例えば、回路系では虚数を「j」で表すことが多い。電流を「i」で表すことが多いためである。でも回路系を除けば、虚数は i で表すことのほうが普通である。
【0014】
「暗黙の共通了解事項」によって「x」「c」「h」「i」「j」などのシンボル変数、光定数や虚数などの特定の意味を持たせた変数名を含んでいる数式/数値計算式を、前処理によって、C, Java(登録商標), Python などの既存言語で扱えるように変換するソフトウェアが望まれる。その変換の仕方はユーザーに合わせてカスタマイズできねばならない。

【課題を解決するための手段】
【0015】
物理定数「c」「h}シンボル変数「x」 など数式/数値計算式中の特定の意味を持ったユーザー変数と、既存プログラム言語の変数を区別して入力することで、各変数がユーザー変数と既存プログラム言語の変数の何れであるかをコンピュータにも人間にも判るようしてやり、そのユーザー変数を既存言語で計算できる文字列に変換してやれば問題は解決する。c,h,x,i,j などのユーザー変数に光速度、プランク定数、シンボル変数、虚数などの意味を持たせることは、それらのユーザー変数に対応する意味を持つ、C, Java(登録商標), Python などの既存言語での式や値を対応させた辞書テーブルを用意することで実現できる。

【発明の効果】
【0016】
前処理プログラムが、ユーザーから入力された数式/数値計算式中の変数のうち、ユーザー変数だと判別された文字列については、前記の辞書テーブルの式または値を持つように変換することで、C, Java(登録商標), Python などの既存言語で扱え、同時にユーザーが望んでいた式や値を持つ文字列にできる。このように前処理をしてやることで、「ユーザーが読み書きしやすい数式/数値計算式の文字列」を入力した後に、「その数式/数値計算式の意味を的確に反映した既存言語で扱える数式/数値計算式の文字列」に変換できる。

【0017】
C, Java(登録商標), Python といった既存言語には、数式/数値計算のための膨大なライブラリの蓄積がある。このライブラリを活用すれば、単純な加減乗除算だけではなく、行列の加減乗除算やべき乗、ベクトル演算、数多くの関数の計算、数式のシンボル処理、グラフ表示などが可能だ。でも C, Java(登録商標), Python といった言語は汎用言語でもあり、数式/数値計算式の記述が冗長になってしまう。そのため高価な Mathematica/Matlab といった数式/数値計算専用のソフトを使う必要があった。
【0018】
前処理プログラムによる変換を使えば、積演算子「*」の補完など、数学や理工学分野で使われている数式/数値計算式に近い文字列による数式/数値計算式の記述を、C, Java(登録商標), Python などの既存言語で扱える式に変換できるようになる。でも、ユーザーごとに異なる、数式/数値計算式を記述する上での暗黙の前提:「c が光定数を表す」などは、その数式/数値計算式の補完だけでは実現できなかった。別途に冗長なプログラム・コードとして記述する必要があった。
【0019】
本発明の前処理により、暗黙の前提を定義する、ユーザー変数と既存言語での式/値を対応させる辞書テーブルをユーザーごとに作っておき、そのテーブルを使ってユーザー変数を既存言語での式/値に対応させる。これにより暗黙の前提を反映した簡潔な数式/数値計算式を記述するだけで、数式/数値計算のための膨大なライブラリの蓄積がある既存言語での計算が可能になる。高価な数式/数値計算のための専用ソフトを使わなくて済むようになる。

【図面の簡単な説明】
【0020】
【図1】本発明に係る数式/数値計算式中のユーザー変数を、辞書テーブルにある値を持ち、かつ既存言語で扱えるように変換する要部のブロック図である
【図2】実施例1でのユーザー変数入力の説明図である
【図3】実施例2でのユーザー変数入力の説明図である
【発明を実施するための形態】
【0021】
本発明に係る、理数系の各分野での暗黙の前提を反映した数式/数値計算式文字列が、前処理プログラム/装置によって C, Java(登録商標), Python などの既存言語で計算させられるようになる形態を図1の図面に基づいて説明する。
【0022】
請求項1、請求項、請求項3にある前処理装置/プログラムが11である。請求項1、請求項、請求項3の(イ)にある「ユーザーの望む特別な式または値を持つユーザー変数であるか、それとも既存プログラム言語の変数であるかを判別する手段」が12である。請求項1、請求項、請求項3の(ロ)にある「ユーザー変数を既存プログラム言語での式または値に対応させる辞書テーブル記憶手段」が14である。請求項1、請求項、請求項3の(ハ)にある「該ユーザー変数名を該辞書テーブルの式または値を持つ既存プログラム言語での変数名へと変換する手段」が13である。
【0023】
理数系の各分野での暗黙の前提を反映した数式/数値計算式文字列が前処理装置/プログラムに与えられると、数値/数式計算式文字列より演算子/数値/変数などの要素が取り出され、既存言語で扱える文字列に変換されていく。図1では、積演算子:* の挿入などの文字列変換の機能については省略してある。ユーザー変数を既存言語で扱える文字列に変換する部分だけに限定している。
【0024】
前処理装置/プログラムに与えられた数式/数値計算式文字列よりユーザー変数部分を取り出し、辞書テーブル14に対応させながら既存言語で計算させられる文字列に変換していく。ここで「ユーザー変数であるか、それとも既存プログラム言語の変数であるかを判別する」方法として最も単純に思いつくのが、実施例1にある、GUIインターフェースを使い、「ユーザー変数を含んだ数式/数値計算式の文字列の入力」の段階でユーザ変数であることをボタン操作でコンピュータに指示する方法である。数式/数値計算式文字列のうち、ユーザー変数の始まる位置と終わる位置を記録しておけば、前処理装置/プログラムの12ステップ:「要素がユーザー変数?」の判別ができる。ユーザー変数文字列を取り出せれば、辞書テーブル14より、その文字列に対応する既存言語での式または値に入れ替えていけば、「理数系の各分野での暗黙の前提を反映した、既存言語で計算させられる」文字列になる。でも、この方法は単純な場合にしか使えない。「理数系の各分野での暗黙の前提を反映した数式/数値計算式」を記述するためには、既存言語で既に蓄積されている膨大な数式/数値計算ライブラリのうちの何れをどのように使うのかを、辞書テーブル14の内容に反映させねばならない。それを反映した既存言語で計算できる文字列に変換せねばならない。この変換ステップは複雑なものになってしまうからだ。
【0025】
実施例2で示すように、辞書テーブルに既存言語の代入文の羅列を使うことで、「既に蓄積されている膨大な数式/数値計算ライブラリのうちの何れをどのように使うのか」を簡便・明白に記述できる。このときは、辞書テーブルすなわち既存言語の代入文の羅列全部を既存言語で事前に実行することを前提に、ユーザー変数文字列を、既存言語で計算できる文字列に変換する。このときの「ユーザー変数であるか、それとも既存プログラム言語の変数であるかを判別する」手段として、ユーザー変数の前または後ろに特殊記号を付加する方法を実施例2では使っている。この詳細については実施例2で述べる。
【実施例1】
【0026】
実施例を図2に示す。数式/数値計算式を入力するとき、その式に含まれる変数がユーザー変数であるか、既存言語での変数であるかを区別するためのアイコンを設け、そのアイコンが押しこまれた状態のときはユーザー変数を入力するものとし、入力されるユーザー変数は赤い文字で表示してやる。そのアイコンが押し込まれていない状態では、入力される変数は既存言語の変数として黒い文字で表示してやる。(図2では、白黒印刷されることを前提に、数式/数値計算式のうちユーザー変数を意味させる赤い文字は太字「c」で表している。)
【0027】
【表1】

【0028】
ユーザー変数を含んだ数式/数値計算式は、前処理プログラムが表1にある辞書テーブルを参照しながら、ユーザー変数を既存言語での値文字列に置き換える。例えば「t = 1.2; v = c t」数値計算式の「c」がユーザー変数のとき、前処理プログラムは「c」を既存言語での光速度の値の文字列に置き換える。この式を「t = 1.2; v = 2.99792458e+8 * t」と変換する。
【0029】
ここで辞書テーブルはユーザーごとに作成される。物理分野のユーザーならばユーザー変数の c に光速度を対応させ、またユーザー変数の h にプランク定数を対応させるだろう。これにより、ユーザーごとに異なる、数式/数地計算式を記述する上での暗黙の前提を反映した、既存プログラム言語への変換の前処理が可能になる。

【実施例2】
【0030】
実施例2を図3に示す。ここではユーザー変数を表すのに、既存プログラム言語で使われない特殊記号を変数名の前または後に付加する手段を使う。辞書テーブルは代入文の羅列で記述する。その代入文の羅列が事前に実行されることを前提に、ユーザー変数の文字列変換を辞書テーブル参照なしで行う。
【0031】
例えば逆シングル・クォート記号「`」は C, Java(登録商標), Python などの既存言語では殆ど使われない。「`」記号を変数の前または後ろに付けた変数をユーザー変数と決めてやれば、マウスを使うことなくキーボード操作だけで、ユーザー変数と既存プログラム言語を区別して数式/数地計算式を入力していける。図3のように、光速度を意味するユーザー変数を「c`」文字列で入力できる。前処理装置/プログラムがユーザー変数か既存プログラム言語の変数かを判別するには、変数の前または後ろに「`」記号が有るか無いかを調べる。
【0032】
辞書テーブルとして、表1と同様なテキスト・ファイルも使えるが、コンピュータに慣れたユーザーには、既存言語でのアサイン文の羅列を使った表2・表3のような辞書テーブルの方が便利だ。ユーザーが使いたい既存言語のライブラリと、ユーザー変数と、対応させたい既存言語での式/値の三つを直接に対応付けられるからだ。具体例を「Python 言語代入文の羅列によるテーブル」、「C 言語代入文の羅列による辞書テーブル」に示す。
【0033】
【表2】

【0034】
【表3】

【0035】
この辞書テーブルを使って、ユーザー変数を含む数式/数値計算式の文字列を C, Java(登録商標), Python などの既存プログラム言語で扱える数式/数地計算式の文字列に変換することでは実施例1と同じだ。でも代入文の羅列が事前に実行されることを前提に、前処理プログラムはユーザー変数の文字列を既存プログラム言語で扱える文字列に変換すればよい。このため実施例1とは異なり、辞書テーブルを参照することなく、単純なアルゴリズムの適用だけで、ユーザー変数を、辞書テーブルの式または値を持ち同時に既存言語で扱える変数文字列に変換できる。単純なアルゴリズムによって、ユーザー変数文字列を辞書テーブル代入文の左値文字列に置き換えるだけだ。
【0036】
前処理プログラムは、特殊記号「`」が前または後ろに付加された変数を見つけたとき、その変数を "__" で始まり、変数名文字列の後に "_converted__" で終わる変数名に変換する。"___" で始まり "_converted___" で終わる変数名は既存言語のプログラムやライブラリで使われることはないので、このような単純なアルゴリズムによる変換でも、変換された変数名が既存言語のプログラムやライブラリの変数名と衝突することはない。
【0037】
例えば「L = c` t」の数式文字列を与えられたとき、変数「c`」の文字列を見つけた前処理プログラムは、特殊記号「`」が変数の後に付いていることより、これがユーザー変数であると判別する。そして与えられた数式文字列のうち c` 変数名文字列の前に "___" を追加し、「`」記号文字を取った後に "_converted__" を追加する。積の "*" 記号を挿入して、最終的には「L = ___c_converted_ * t」の文字列に変換する。「___c_converted_」変数は、は代入文「___c_converted__ = 2.99792458e+8 # m/s: light speed」によって光速度に対応させられているので、「L = ___c_converted_ * t」の文字列は「左辺値変数 L には 光速度*時間の距離が入る」の意味を持つ、既存言語で扱える文字列式に変換される。このようにすることで、物理分野での暗黙の前提「小文字の c は光速度をあらわす」を反映した数式文字列「L = c` t」を前処理した後に既存言語で計算させられる。
【0038】
代入文の羅列による辞書テーブルには、ユーザー変数と既存言語での式または値の複雑な対応を単純に記述できるメリットがある。たとえば、多項式の加減算や微分などを扱おうとするとき、多項式:「`x^3 + 2`x^2 + 3`x + 4」の `x はシンボル変数でなければならない。C, Java(登録商標), Python などの既存言語でシンボル変数を表現するときは、「`x」は何らかのシンボル変数クラスのインスタンスにしてやらねばならない。整数や浮動小数点を保持する変数とは異なり、何らかの具体的なライブラリに属するクラスのインスタンスとして表現せねばならない。表1の辞書テーブルでは:「x, ClassSymbol('x') # symbol variable x」と単純に書いてあるが、「ClassSymbol」がどのライブラリに属するのか詳細に指示せねばならない。そのための規則を設なければならない。ユーザーに余分な規則を理解してもらわねばならない。
【0039】
でも、既存言語の代入文を使った辞書テーブルを実行させることを前提にすれば、この余分な規則を新たに設ける必要がない。表3「Python 言語代入文の羅列によるテーブル」の「import sympy」と「___x_converted__ = sympy.Smbol('x') # symbol variable x」のように、ユーザーが慣れ親しんでいる既存言語で、「使いたいライブラリ:sympy」と「ユーザー変数:`x」と「対応させたい既存言語での式/値:sympy.Smbol('x')」の三つを直接に対応付ければよいからだ。そこに、どのライブラリを使うかは、代入文の羅列の直前に「import sympy」などとユーザーが既存言語の文法に従って自由に記述できる。ユーザー変数の初めに"___" が付加され、最後に"_converted__" が付加されるという単純な規則:アルゴリズムを覚えるだけで、どんな複雑なユーザー変数と既存言語の式/値との対応でも記述できてしまう。

【符号の説明】
【0040】
11 前処理ブロック
12 ユーザー変数判別ブロック
13 ユーザー変数変換ブロック
14 ユーザー変数を既存プログラム言語での式または値に対応させる辞書テーブル
21 押された状態のアイコン
22 押されていない状態のアイコン

【特許請求の範囲】
【請求項1】
下記の用件を備えてなることを特徴とする、数式および数値の計算処理を既存のプログラム言語に行わせるための前処理装置
(イ)前処理される前の数式または数値計算式中に記述された変数名が、ユーザーの望む特別な式または値を持つユーザー変数であるか、それとも既存プログラム言語の変数であるかを判別する手段を備ること
(ロ)ユーザー変数を既存プログラム言語での式または値に対応させる辞書テーブル記憶手段を備えること
(ハ)該ユーザー変数名を該辞書テーブルの式または値を持つ既存プログラム言語での変数名へと変換する手段を備ること
【請求項2】
下記の用件を備えてなることを特徴とする数式および数値の計算処理を既存のプログラム言語に行わせるための前処理プログラム
(イ)前処理される前の数式または数値計算式中に記述された変数名が、ユーザーの望む特別な式または値を持つユーザー変数であるか、それとも既存プログラム言語の変数であるかを判別する手段を備ること
(ロ)ユーザー変数を既存プログラム言語での式または値に対応させる辞書テーブル記憶手段を備えること
(ハ)該ユーザー変数名を該辞書テーブルの式または値を持つ既存プログラム言語での変数名へと変換する手段を備ること
【請求項3】
下記の用件を備えてなることを特徴とする数式および数値の計算処理を既存のプログラム言語に行わせるための前処理プログラムを記録したコンピュータ読み取り可能な記録媒体
(イ)前処理される前の数式または数値計算式中に記述された変数名が、ユーザーの望む特別な式または値を持つユーザー変数であるか、それとも既存プログラム言語の変数であるかを判別する手段を備ること
(ロ)ユーザー変数を既存プログラム言語での式または値に対応させる辞書テーブル記憶手段を備えること
(ハ)該ユーザー変数名を該辞書テーブルの式または値を持つ既存プログラム言語での変数名へと変換する手段を備ること

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate


【公開番号】特開2010−181933(P2010−181933A)
【公開日】平成22年8月19日(2010.8.19)
【国際特許分類】
【出願番号】特願2009−22444(P2009−22444)
【出願日】平成21年2月3日(2009.2.3)
【出願人】(709000284)
【Fターム(参考)】