(57)【要約】【課題】入力項目のみの演算の組合せによって結果項目を記述する解関数を含むプログラムを生成する。【解決手段】結果項目の数値を算出するための関数を含むプログラムを生成するプログラム生成システムであって、記憶装置は、入力項目の数値と、結果項目の数値と、導出される関数の基礎となる候補関数とを格納し、プロセッサは、前記入力項目の数値および他の結果項目の試算値を引数として前記候補関数の各々を用いて前記結果項目の試算値を計算し、前記計算された試算値と前記結果項目の数値とが一致する候補関数を選択して、前記選択された候補関数および前記計算された試算値を推定関数として登録し、前記登録された推定関数の中から、全ての入力項目の数値および前記試算値を引数として計算した数値と前記結果項目の数値とが一致するものを解関数として決定し、前記決定された解関数を含むプログラムを生成する【選択図】図１
2018088216.tif 000002
【特許請求の範囲】
【請求項１】
入力項目の数値から結果項目の数値を算出するための関数を含むプログラムを生成するプログラム生成システムであって、
演算処理を実行するプロセッサと、前記プロセッサがアクセス可能な記憶装置とを備え、
前記記憶装置は、前記入力項目の数値と、前記結果項目の数値と、導出される関数の基礎となる候補関数とを格納し、
前記プロセッサは、
前記入力項目の数値および他の結果項目の試算値を引数として前記候補関数の各々を用いて前記結果項目の試算値を計算し、
前記計算された試算値と前記結果項目の数値とが一致する候補関数を選択して、
前記選択された候補関数および前記計算された試算値を推定関数として登録し、
前記登録された推定関数の中から、全ての入力項目の数値および前記試算値を引数として計算した数値と前記結果項目の数値とが一致するものを解関数として決定し、
前記決定された解関数を含むプログラムを生成することを特徴とするプログラム生成システム。
【請求項２】
請求項１に記載のプログラム生成システムであって、
前記プロセッサは、前記入力項目の名称と前記結果項目の名称とが同じである場合、前記入力項目の数値と等しい数値を算出する関数を推定関数として選択することを特徴とするプログラム生成システム。
【請求項３】
請求項１に記載のプログラム生成システムであって、
前記決定された推定関数を前記候補関数として登録し、
ある結果項目について、いずれの前記候補関数を用いた試算によっても推定関数が決定できない場合、他の結果項目の候補関数が登録された後、再度、当該結果項目の試算値が前記結果項目の数値と一致するかを判定して、候補関数を選択することを特徴とするプログラム生成システム。
【請求項４】
請求項１に記載のプログラム生成システムであって、
全ての入力項目および出力項目の組について、選択された推定関数が同じであれば、当該推定関数を解関数として決定し、
全ての入力項目および出力項目の組について、当該入力項目の数値および前記試算値を引数とした推定関数の計算結果と前記結果項目の数値とが一致すれば、当該推定関数を解関数として決定することを特徴とするプログラム生成システム。
【請求項５】
請求項１に記載のプログラム生成システムであって、
導出される関数が引数を条件とした分岐を含む場合、
当該関数によって計算される数値と前記分岐の条件となる引数との大小関係を用いて前記引数の閾値を探索し、前記分岐を含む推定関数を求めることを特徴とするプログラム生成システム。
【請求項６】
請求項１に記載のプログラム生成システムであって、
各々が、演算処理を実行するプロセッサと、前記プロセッサがアクセス可能な記憶装置とを備える複数の計算機によって構成され、
前記記憶装置は、他の前記計算機によっても参照可能であり、
前記複数の計算機の少なくとも一つは、他の計算機が参照可能なように前記候補関数を前記複数の記憶装置の少なくとも一つに格納し、
前記複数の計算機の各々は、前記記憶装置に格納された候補関数を参照して、候補関数を選択することを特徴とするプログラム生成システム。
【請求項７】
請求項１に記載のプログラム生成システムであって、
前記解関数は、前記入力項目を引数として記述されることを特徴とするプログラム生成システム。
【請求項８】
請求項１に記載のプログラム生成システムであって、
前記解関数は、前記入力項目および他の解関数の計算結果を引数として記述されることを特徴とするプログラム生成システム。
【請求項９】
計算機にプログラムを生成させる生成プログラムであって、
前記生成されるプログラムは、入力項目の数値から結果項目の数値を算出するための関数を含み、
前記計算機は、演算処理を実行するプロセッサと、前記プロセッサがアクセス可能な記憶装置とを有し、
前記記憶装置は、前記入力項目の数値と、前記結果項目の数値と、導出される関数の基礎となる候補関数とを格納し、
前記プログラムは、
前記プロセッサに、前記入力項目の数値および他の結果項目の試算値を引数として前記候補関数の各々を用いて前記結果項目の試算値を計算させ、
前記プロセッサに、前記計算された試算値と前記結果項目の数値とが一致する候補関数を選択させ、
前記プロセッサに、前記選択された候補関数および前記計算された試算値を推定関数として登録させ、
前記プロセッサに、前記登録された推定関数の中から、全ての入力項目の数値および前記試算値を引数として計算した数値と前記結果項目の数値とが一致するものを解関数として決定させ、
前記プロセッサに、前記決定された解関数を含むプログラムを生成させることを特徴とする生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを生成するプログラム生成システムに関する。
【背景技術】
【０００２】
企業等の業務において、例えば、メインフレームからオープンシステムへの移行など、異なるシステムや装置間におけるシステム移行がしばしば発生する。この際、移行前の旧システムが長年にわたって使用されていた場合など、一部の業務システムにおいては、業務システムの最近の入出力データは残っていても、当該業務システムの設計ドキュメントやソースコードが、何らかの原因によって滅失または特定不能になっていることがある。
【０００３】
従って、旧システムのロジックを新システムでも再現するためのプログラムの作成が必要となる。コンピュータによりプログラムを自動生成する先行技術として、例えば特許文献１がある。
【０００４】
特許文献１に開示されているプログラム生成装置は、機能の構成要素に対応付くプログラム部品とデータを、パーツと呼ぶ単位で管理し、フレームワークと呼ぶプログラムの共通的な枠組みを用意し、パーツをフレームワークに挿入することでプログラムを作成し、人手により機能項目が選択された時、その機能項目に対応するプログラム部品を自動的に選択し、フレームワークに挿入し、また、パーツをフレームワークに挿入する時、人手による入出力データの対応付けに基づきパーツ接続用のコードを自動生成する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１７６０７６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１に記載された技術ではプログラム自動生成を行うためには、少なくとも機能の構成要素に対応付くプログラム部品というまとまった素材が必要であり、旧システムの機能仕様書やソースコード等が滅失している状況では、新システムにおけるプログラムを自動的に生成できない。
【０００７】
一方、財務関係の帳票を扱うシステムでは、所定の期間、入出力データの保存が義務付けられることが多く、旧システムの設計仕様書やソースコード等が残っていない状況でも、旧システムで最近作成した多量の入出力データが残っていることが多い。
【０００８】
この点、業務システム（例えば、帳票システム）では、入力データ（項目、数値）と出力データ（結果データの項目、数値）の項目数は多いものの、入力データから出力データの計算は、四則演算などの比較的単純な演算の複数回の組合せ、または比較的単純な分岐ロジックの組合せで求まることが多い。特に、帳票システムにおいては、出力項目（結果項目）の数値は、ユーザによる帳票の内容の理解（検証）を容易にするため、入力項目の数値から一段階ずつ演算した項目の連続であることが多い。このため、帳票の出力項目を自動的に作成する場合、複数の入出力データの組合せについて、一段階の演算を試算し、演算方法を推定することによって、すべての出力項目について、入力項目のみの演算の組合せによって記述する演算関数を求めることが可能と考えられる。
【０００９】
本発明は、このように、出力項目（結果項目）か入力項目からの一段階ずつの演算の組合せにとって求まる場合に、既存の入出力データに基づいて、一段階ずつ出力項目を試算することによって、入力項目を変数とした演算の組合せによって記述され、出力項目を計算する演算ロジックを求めるプログラムを生成するためのプログラム生成装置を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、入力項目の数値から結果項目の数値を算出するための関数を含むプログラムを生成するプログラム生成システムであって、演算処理を実行するプロセッサと、前記プロセッサがアクセス可能な記憶装置とを備え、前記記憶装置は、前記入力項目の数値と、前記結果項目の数値と、導出される関数の基礎となる候補関数とを格納し、前記プロセッサは、前記入力項目の数値および他の結果項目の試算値を引数として前記候補関数の各々を用いて前記結果項目の試算値を計算し、前記計算された試算値と前記結果項目の数値とが一致する候補関数を選択して、前記選択された候補関数および前記計算された試算値を推定関数として登録し、前記登録された推定関数の中から、全ての入力項目の数値および前記試算値を引数として計算した数値と前記結果項目の数値とが一致するものを解関数として決定し、前記決定された解関数を含むプログラムを生成する。
【発明の効果】
【００１１】
本発明の代表的な実施の形態によれば、入力項目のみの演算の組合せによって結果項目を記述する解関数を含むプログラムを生成できる。前述した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
【図面の簡単な説明】
【００１２】
【図１】プログラム生成装置の構成を示す図である。
【図２】入出力データの例を示す図である。
【図３】要素関数ファイルに格納される要素関数リストの例を示す図である。
【図４】解関数群生成処理の全体フローチャートである。
【図５】候補関数リストの例を示す図である。
【図６】試算関数リストの例を示す図である。
【図７】推定関数導出処理のフローチャートである。
【図８】試算関数リストの例を示す図である。
【図９】推定関数登録処理のフローチャートである。
【図１０】推定関数マトリクスの例を示す図である。
【図１１】解関数決定処理のフローチャートである。
【図１２】入力項目によって記述された解関数群の例を示す図である。
【図１３】整理後の解関数群の例を示す図である。
【図１４】実施例２の要素関数リストの例を示す図である。
【図１５】実施例３、４の補助データファイルの例を示す図である。
【図１６】実施例４の入出力データの例を示す図である。
【図１７】実施例４の推定関数マトリクスの例を示す図である。
【図１８】実施例４における分岐原因項目および閾値を求める処理を示す図である。
【図１９】実施例４の入力項目によって記述された解関数群の例を示す図である。
【図２０】実施例４の整理後の解関数群の例を示す図である。
【図２１】実施例５のプログラム生成システムの構成を示す図である。
【発明を実施するための形態】
【００１３】
以下、添付図面を参照しながら、本発明のプログラム生成装置を実施するための形態を説明する。
【００１４】
＜実施例１＞
実施例１のプログラム生成システムは、図１に示す単一のプログラム生成装置によって構成される。図１は、本実施例のプログラム生成装置１の全体構成を示す図である。
【００１５】
プログラム生成装置１は、プロセッサ（ＣＰＵ）１１、メモリ１２等を備えるコンピュータであり、本発明を実現するためのプログラム生成処理部１３を備えている。また、通常は、入出力インタフェースとして入力装置１４、ディスプレイ装置１５等を備えている。
【００１６】
プログラム生成装置１は、既存システム（旧システム）等で算出され、予め与えられている入力データ、結果データ（出力データ）の組を格納した入出力データファイル１６、及び後述する要素関数ファイル１７を入力とし、生成プログラムファイル１８を出力する。
【００１７】
本実施例においてプログラム生成とは、入出力データファイル１６の中の入出力データごとに、各結果項目を算出するための関数（推定関数）を推定し、その後、全入出力データを通じて推定関数を突き合わせ、最終的に結果項目ごとの正しい算出関数である解関数群を生成することである。
【００１８】
関数推定の手順を説明するに当たって、まず、本発明における既存の入出力データについて説明する。
【００１９】
図２は、本実施例のプログラム生成装置の入力となる、入出力データの例を示す図である。
【００２０】
入出力データは入出力データファイル１６に格納され、一対の入出力データ２１の複数個の組により構成されている。入出力データ２１中の入力データ、結果データは、それぞれ複数個の項目から構成されているが、すべての入出力データ２１について、入力データと結果データは、基本的には同一の項目群によって構成されているものとする（例えば、ある入出力データ２１だけ、特定の結果項目（「金額」等）が欠落している等のことはないものとする）。
【００２１】
ただし、所定の項目が揃っていれば、項目の配列は自由であり、例えば、一部または全部のデータについて、結果項目「合計」が最後ではなく途中の位置にあってもよい。
【００２２】
なお、入出力データファイル１６が多数の入出力データ２１から構成されている場合、仮に、一部の入出力データ２１について、他の入出力データ２１と構成項目群が異なるデータが混入していたことが途中で判明した場合は、当該入出力データ２１を入出力データファイル１６から削除し、以後のプログラム生成過程に影響を与えないようにすることが望ましい。
【００２３】
本実施例におけるプログラム生成は、図２の例で説明すると、結果データの各項目「単価」「数量」「金額」「消費税率」「消費税額」「合計」について、特に、入力項目に含まれていない「金額」「消費税額」「合計」のそれぞれの数値を求めるための解関数群を生成することである。
【００２４】
前述した単純な例では、図中に示したように、「金額＝単価×数量」「消費税額＝金額×消費税率」「合計＝金額＋消費税額」であることは、ユーザがこれまでに得ている経験、予備知識を利用すれば、ユーザ（人間）は容易に推定できる。しかし、コンピュータは予備知識を有さないため、「手がかり」となる予備知識を与える必要がある。本発明においては、図３に示す要素関数ファイル１７に予め登録された要素関数リスト３１に含まれる要素関数を、プログラム生成装置１が解関数を推定するための「手がかり」としている。
【００２５】
逆に、結果項目数が多い場合、または、解の算出に多数段階の演算が必要な場合、人間の経験や予備知識等から全ての解関数を正確に求めることは容易ではなく、このような場合に、プログラム生成装置１による関数自動生成が有効となる。
【００２６】
図３は、本実施例のプログラム生成装置の入力となる、要素関数ファイル１７に格納される要素関数リスト３１の例を示す図である。
【００２７】
図３に示す例は、正負記号も含めたすべてのパターンの四則演算を行う上で、最低限必要となる関数である。なお、要素関数リスト３１として登録する順序は、図３（Ａ）のように加算、乗算、除算の順に登録しても、図３（Ｂ）のように負記号を含む関数を後半にまとめて登録してもよい。要素関数を登録する順序は、最終的に生成される解関数群には影響しないが、後述するように、先に登録された要素関数から順に試算に用いられるため、導出までの処理効率等に影響を与える可能性がある。仮に、既存の入出力データの性質から、解関数に負記号はほとんど登場しないと予想される場合、図３（Ｂ）のような登録順序の方が、処理効率上、有利だと考えられる。
【００２８】
要素関数リスト３１には、図３に示す単純四則演算の基本的な関数以外に、入出力データファイル１６のデータの性質等を考慮して、ユーザが必要と考える関数を、入力装置１４などを介して予め追加登録しておいてもよい。これについては後述する。
【００２９】
次に、プログラム生成装置１のプログラム生成処理部１３が実行する解関数群生成処理について説明する。図４に示す解関数群生成処理は、プログラム生成装置１が実行するプログラム生成処理から呼び出されて、プログラム生成処理の一部として実行される。プログラム生成処理では、解関数群生成処理で生成された解関数を含むプログラムを生成する。
【００３０】
図４は、実施例１における、解関数群生成処理の全体フローチャートである。
【００３１】
まず、要素関数ファイル１７から要素関数を入力し、図５に示すような候補関数リスト５１をメモリ１２に初期登録する（４０１）。
【００３２】
図５（Ａ）は、図３（Ａ）に例示した要素関数を候補関数リスト５１に初期登録した状態を示す。本実施例では、複数種類の入出力データに使用される同一の候補関数が登録されているが、入出力データの種類ごとに異なる候補関数リスト５１を登録してもよい。
【００３３】
次に、入出力データファイル１６から入出力データを順次入力し、当該入出力データに対する推定関数を導出する（４０２〜４１０）。ここで推定関数とは、入出力データの各々について各結果項目を算出する関数として推定された関数である。
【００３４】
入出力データが入力されると、まず、入力データと候補関数の全ての組み合わせ作成し、試算関数６０１と試算値６０２を共に図６に示す試算関数リスト６１に初期登録し、メモリ１２に格納する（４０３）。試算値６０２は、入力データと試算関数６０１を用いて計算する。図６（Ａ）は、図５（Ａ）に例示する候補関数リストを用いて図２に例示する入力データから生成された試算関数６０１と試算値６０２を試算関数リスト６１に初期登録した状態を示す。試算関数６０１は、関数部分（例えば、ｙ＝ａ）と、関数の各変数の項目名部分（例えば、［ａ＝単価］）から構成され、「ｙ＝ａ  ［ａ＝単価］」というように表記する。推定関数や解関数も同様に表記する。
【００３５】
なお、試算値６０２は入力データを用いて計算される固有の数値なので、入出力データごとに試算関数リスト６１が初期設定される。
【００３６】
次に、当該入出力データの結果項目ごとに、推定関数を導出する（４０４〜４１０）。
【００３７】
まず、結果項目と同一の項目名が入力項目の中にあるか否かを判定する（４０５）。同一の項目名がある場合、当該結果項目の数値は入力項目の数値そのものであると考えられるので、ｙ＝ａ  ［ａ＝入力項目名］を推定関数として登録する（４０６）。推定関数登録処理の詳細は後述するが、推定関数が求まると、当該関数を候補関数リスト５１及び試算関数リスト６１に追加登録する。これによって、本発明の特徴である、一段階ずつ段階を追った解関数の生成を実現できる。
【００３８】
結果項目と同一の項目名が入力項目の中に無い場合、推定関数導出処理を実行する（４０７）。なお、ステップ４０５の判定を行わずに、すべての結果項目についてステップ４０７の推定関数導出処理を実行してもよい。
【００３９】
図７は、推定関数導出処理４０７のフローチャートである。
【００４０】
推定関数導出処理４０７では、試算関数リスト６１の試算値６０２と結果項目の数値とが一致する試算関数を見つけ、推定関数とする。
【００４１】
まず、試算関数リスト６１から所定の順序（例えば、上から一つずつ）で試算関数と試算値との組を選択し（７０１）、選択された試算値と結果項目の数値が一致するかを判定する（７０２）。そして、試算値と結果項目の数値が一致すれば、当該試算関数を当該結果項目を導出するための推定関数として（７０３）、推定関数導出処理を終了する。
【００４２】
なお、予め所定の許容誤差を設けておき、試算結果の数値と結果項目の数値が許容誤差範囲内にあれば、一致すると判定してもよい。所定の許容誤差を設けることによって、結果項目の数値が小数点以下の数値を含む実数で表現されている場合にも、一致するかを判定できる。
【００４３】
推定関数導出処理の具体例について、図２に例示した入出力データ１について、図８を参照して説明する。
【００４４】
まず、結果項目「単価」８１１及び結果項目「数量」８１２と同一の項目が入力項目にあるので、ステップ４０６において、それぞれ、ｙ＝ａ  ［ａ＝単価］、ｙ＝ａ  ［ａ＝数量］を推定関数として登録する。
【００４５】
結果項目「金額」８１３については、同一の項目が入力項目にないので、図７の推定関数導出処理を実行し、試算関数リスト６１の試算値が結果項目の数値と一致するかを判定する。
【００４６】
例えば、図５（Ａ）の候補関数リスト５１の「ｙ＝ａ＊ｂ」を試算関数６０１として、引数ａに単価２８０、引数ｂに数量２を代入したときの試算値６０２である５６０は、結果項目「金額」８１３の数値「５６０」に一致するので、「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」を推定関数として（７０３）、推定関数導出処理を終了する。
【００４７】
なお、本実施例では試算回数を少なくするために、最初に試算値と結果項目の数値が一致した時点で、他の推定関数の候補を探すことなく推定関数の導出を中止する。このため、誤った推定関数が導出される場合もありうる。
【００４８】
例えば、入出力データ＃２では、候補関数リスト５１に最初に登場する候補関数「ｙ＝ａ」を試算関数６０１として、引数ａに単価４５０、引数ｂに数量１を代入したときの試算値６０２である４５０は、結果項目「金額」８１４の数値「４５０」に一致するので、試算関数「ｙ＝ａ  ［ａ＝単価］」を結果項目「金額」の推定関数として、推定関数導出処理を終了する。本実施例では、ある入出力データについて誤った推定関数が導出されても、最初に見つかった推定関数を登録する。
【００４９】
推定関数が一つ見つかった時点で、推定関数候補の探索を中止せずに、結果項目の数値と全ての試算値との一致を判定すれば、「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」も結果項目「金額」の推定関数候補となる。しかし、複数の推定関数候補が見つかっても、推定関数候補の探索に用いた入出力データだけでは、どちらの推定関数候補が真の解関数であるかを決定できない。結果項目の数値と全ての試算値との一致を判定しても、最初に試算値と結果項目の数値が一致した時点で推定関数の導出を中止しても、後述する、他の入出力データを用いた判定が必要になる。このため、このため、結果項目の数値と全ての試算値との一致を判定すると、計算リソースを無駄に消費することになる。
【００５０】
図４に戻って説明を続ける。推定関数導出処理４０７の結果、推定関数が求まったか否かを判定し（４０８）、何らかの推定関数が求まった場合、推定関数登録処理によって推定関数を登録する（４０９）。
【００５１】
図９は、推定関数登録処理４０９のフローチャートである。推定関数登録処理４０９では、入出力データと結果項目の組み合わせについて見つかった推定関数を、図１０に示す推定関数マトリクス１０１に登録する。
【００５２】
まず、当該結果項目名が推定関数マトリクス１０１にあるか否かを判定する（９０１）。そして、当該結果項目名が推定関数マトリクス１０１に無い場合、当該結果項目を推定関数マトリクス１０１に追加する（９０２）。
【００５３】
次に、求めた推定関数及び導出に用いた試算値を、推定関数マトリクス１０１の該当箇所に登録する（９０３）。
【００５４】
そして、求まった推定関数が候補関数リスト５１及び試算関数リスト６１に登録されていなければ、それぞれ追加登録する（９０４）。これによって、本発明の特徴である、一段階ずつ段階を追って、全ての出力項目について、順次、解関数（推定関数）の生成を実現できる。例えば、前述した入出力データ１の推定関数「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」では、候補関数リスト５１には関数部分のみを登録すべきだが、関数「ｙ＝ａ＊ｂ」は既に登録されているため、候補関数リスト５１への追加登録は行わない。一方、試算関数リスト６１には関数「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」は登録されていないため、試算関数６０１に追加登録し、試算に使用された数値である「５６０」を試算値６０２に登録する。
【００５５】
入出力データ１の例で演算を繰り返し、結果項目「消費税額」８１５について推定関数を試算すると、引数ａに試算関数「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］（数値５６０）」、引数ｂに試算関数「ｙ＝ａ  ［ａ＝消費税率］（数値０．１）」を代入したときの候補関数「ｙ＝ａ＊ｂ」の値が、結果項目「消費税額」８１５の数値「５６」に一致するので、これらを合成した推定関数「ｙ＝（ａ＊ｂ）＊ｃ  ［ａ＝単価，ｂ＝数量，ｃ＝消費税率］」及び試算値「５６」を推定関数マトリクス１０１に登録する。関数「ｙ＝（ａ＊ｂ）＊ｃ」は候補関数リスト５１に登録されていないため、関数「ｙ＝（ａ＊ｂ）＊ｃ」を候補関数リスト５１に追加登録する。図５（Ｂ）は、関数「ｙ＝（ａ＊ｂ）＊ｃ」が追加登録された後の候補関数リスト５１を示す。また、関数「ｙ＝（ａ＊ｂ）＊ｃ  ［ａ＝単価，ｂ＝数量，ｃ＝消費税率］」は試算関数リスト６１に登録されていないため、試算関数６０１に追加登録し、試算に使用した数値である「５６」を試算値６０２に登録する。
【００５６】
同様に、入出力データ１の例で演算を繰り返し、結果項目「合計」８１６について試算すると、引数ａに試算関数「ｙ＝ａ＊ｂ［ａ＝単価，ｂ＝数量］（数値５６０）」、引数ｂに試算関数「ｙ＝（ａ＊ｂ）＊ｃ［ａ＝単価，ｂ＝数量，ｃ＝消費税率］（数値５６）」を代入したときの候補関数「ｙ＝ａ＋ｂ」の値が、結果項目「合計」８１５の数値「６１６」に一致するので、これらを合成した推定関数「ｙ＝（ａ＊ｂ）＋（（ｃ＊ｄ）＊ｅ）［ａ＝単価，ｂ＝数量，ｃ＝単価，ｄ＝数量，ｅ＝消費税率］」及び試算値「６１６」を推定関数マトリクス１０１および試算関数６０１に追加登録し、関数部分の「ｙ＝（ａ＊ｂ）＋（（ｃ＊ｄ）＊ｅ）」を候補関数リスト５１に追加登録する。また、数値「６１６」を試算関数リスト６１の数値６０２に追加登録する。図６（Ｂ）は、関数「ｙ＝（ａ＊ｂ）＋（（ｃ＊ｄ）＊ｅ）［ａ＝単価，ｂ＝数量，ｃ＝単価，ｄ＝数量，ｅ＝消費税率］」が追加登録された後の試算関数リスト６１を示す。
【００５７】
ところで、図２に示す入出力データのように、結果項目が演算の段階の順に並んでいる場合には、前述したように、すべての結果項目に対して一段階ずつ段階を追って推定関数を生成できる。しかし、仮に図２に示す例で、結果項目「合計」が「数量」と「金額」の間に位置している場合、「金額」の推定関数を求める前に「合計」の推定関数を求めることができない。具体的には、結果項目「合計」の推定関数「ｙ＝（ａ＊ｂ）＋（（ｃ＊ｄ）＊ｅ）［ａ＝単価，ｂ＝数量，ｃ＝単価，ｄ＝数量，ｅ＝消費税率］」が求まるためには、前述したように、結果項目「金額」や「消費税額」の推定関数が試算関数リスト６１に登録されている必要があり、これらが登録されていなければ、既登録の候補関数を既登録の試算関数に対して総当たりで代入しても、結果項目数値「６１６」に一致する試算結果を得ることはできず、推定関数が求まらない。
【００５８】
図４に戻って説明を続ける。このように途中の結果項目に対する推定関数が求まらない場合には、結果項目が推定関数の試算に適する順序で並んでおらず、後の段階で求めるべき結果項目が先に配置されているということである。このような場合、求まらなかった結果項目の推定関数の導出を後回しにし、当該結果項目を結果項目リストの最後に移動する（４１０）。このようにして、段階を追って推定関数が求まる配列に並び替えることによって、最終的に全ての結果項目に対する推定関数を求めることができる。
【００５９】
ただし、入出力データが不完全だったり、誤っている場合等には、ステップ４１０の並べ替えを何度か行っても当該結果項目に対する推定関数は求まらない。このため、同一結果項目に対する試算を所定回数以上行っても推定関数が求まらない場合は、ステップ４０４から４１０のループを抜け出し、当該入出力データを除外し、当該入出力データの行を推定関数マトリクス１０１から削除して、以後の処理を実行するとよい。
【００６０】
なお、本実施例において、入出力データごとのループ（４０２〜）の中で結果項目ごとの処理（４０４〜）を実行するが、逆に、結果項目ごとのループの中で入出力データごとの処理を実行してもよい。
【００６１】
このようにして、すべての入出力データと結果項目との組み合わせについて、推定関数が推定関数マトリクス１０１に登録された後、結果項目単位で真の解関数を決定する処理を実行する。
【００６２】
図１１は、解関数決定処理のフローチャートである。
【００６３】
まず、当該結果項目について、推定関数マトリクス１０１の同一列内の全ての推定関数が同じか否か判定する（１１０１）。全ての推定関数が同じである場合、当該推定関数を、当該結果項目に対する解関数として決定する（１１０９）。図１０に示す例では、結果項目「単価」１００１、結果項目「数量」１００２、結果項目「消費税率」１００４の各列では、全ての推定関数が一致するので、当該推定関数をそれぞれの結果項目に対する解関数として決定する。
【００６４】
同一列内で推定関数が異なる場合、入出力データごとに推定関数の適否を判定する（１１０２）。まず、推定関数マトリクス１０１から、対応する推定関数を抽出する（１１０３）。図１０に示す例では、例えば結果項目「金額」１００３の列は入出力データによって推定関数が異なるので、まず、「入力データ１」に対する推定関数「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」を抽出する。
【００６５】
次に、他の全ての入出力データを用いて、抽出した推定関数の適否を試算する（１１０４）。具体的には、抽出した推定関数の引数に対応する試算値を代入し（１１０５）、試算値の計算結果が当該入出力データの結果項目の数値と一致しているか否かを判定する（１１０６）。なお、数値が実数の場合、所定の許容誤差を考慮して一致を判定するとよい。
【００６６】
一方、計算結果と結果項目の数値とが一致しない場合、抽出した推定関数は解関数としては不適切なので、他の入出力データによる試算をせずに、当該入出力データに対する処理を終了し（１１０７）、次の入出力データに対する推定関数を試算する。
【００６７】
計算結果と結果項目の数値とが一致する場合、他の入出力データを用いて試算を続け、全ての入出力データについて計算結果と結果項目の数値とが一致する場合、抽出した推定関数は正しい解関数なので、当該推定関数を解関数として決定する（１１０８、１１０９）。
【００６８】
結果項目「金額」に対応する推定関数「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」の例で説明すると、「入力データ２」については、「単価」の試算値「４５０」と「数量」の試算値「１」とを抽出した推定関数に代入すると、試算結果が「４５０」となり、結果項目「金額」の数値「４５０」と一致する。
【００６９】
同様に、「入力データ３」についても、「単価」の試算値「３０」と「数量」の試算値「１０」を抽出した推定関数に代入すると、試算結果が「３００」となり、結果項目「金額」の数値「３００」と一致する。他に入出力データがない場合には、他の入出力データすべてについて試算結果が一致するので、抽出推定関数「ｙ＝ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」を、結果項目「金額」の解関数として決定し、解関数決定処理を終了する。
【００７０】
これに対して、仮に「入力データ２」に対応する推定関数「ｙ＝ａ  ［ａ＝単価］」を抽出した場合、「入力データ１」に対する試算で、「単価」の試算値「２８０」を代入すると試算結果が「２８０」となり、結果項目数値「５６０」と一致しないので、抽出された推定関数は不適切と判定して、「入力データ２」に対する処理を終了する。
【００７１】
いずれの推定関数についても適切な解関数となり得なかった場合、当該結果項目に関する限り、入出力データが誤っていると考えられるので、エラーメッセージをディスプレイ装置１５に表示する等して、ユーザに注意喚起を促す（１１１０）。
【００７２】
このようにして、結果項目「消費税額」１００５と結果項目「合計」１００６についても解関数決定処理を行うと、「消費税額」は推定関数「ｙ＝（ａ＊ｂ）＊ｃ  ［ａ＝単価，ｂ＝数量，ｃ＝消費税率］」が、「合計」は推定関数「ｙ＝（ａ＊ｂ）＋（（ｃ＊ｄ）＊ｅ）［ａ＝単価，ｂ＝数量，ｃ＝単価，ｄ＝数量，ｅ＝消費税率］」が、他の入出力データを用いた試算結果が一致するので、それぞれの推定関数を解関数として決定する。
【００７３】
図１２は、解関数決定処理によって求まった解関数群の例を示す図である。図１２から分かるように、解関数群は、入出力データの入力項目のみを変数として記述された関数である。
【００７４】
なお、図１０では、簡略化のために入出力データが３件のみの例について説明したが、実際には、入出力データは多数件存在することが通例である。
【００７５】
また、特に入出力データが多数件存在する場合、中には誤った入出力データが混入していて、推定関数が求まらない場合（例えば、推定関数マトリクスの当該項目が空白の場合）がある。そのような場合、当該入出力データは無視して、他の入出力データのみを使用して解関数決定処理を行うとよい。
【００７６】
図４に戻って説明を続ける。全ての出力項目に対して解関数が求まった後、入力データの組み合わせのみではなく、結果データも使用して、より整理された形式で解関数を記述する処理（４１４）について説明する。このような形式で解関数を記述することによって、演算効率を上げることができる。なお、解関数整理処理（４１４）はオプショナルな処理ステップである。
【００７７】
図１３に、図１２の解関数群を、より整理された形式で記述した関数群を示す。
【００７８】
出力項目「単価」「数量」「消費税率」については、入力データそのままであるため、整理が必要ではない。出力項目「金額」については、入力データを１回積算しているだけなので、整理が必要ではない。
【００７９】
しかし、出力項目「消費税額」については、既に結果項目「金額」に出現している演算結果を利用した方が演算効率が良いことから、「ｕ＝ａ＊ｂ」を利用して、「ｗ＝ｕ＊ｃ」という記述形式に整理する。また、出力項目「合計」についても、「金額」と「消費税額」の演算結果を利用して、「ｘ＝ｕ＋ｗ」という記述形式に整理する。
【００８０】
以上説明したように、本発明の実施例１によれば、入力項目と、四則演算のみからなる要素関数を出発点として入力データを用いて段階的に試算することによって、各出力データについて入力項目を用いた四則演算で記述する解関数を生成できる。また、生成された解関数の出力項目を段階的に利用することによって、より整理された形式で記述された解関数を生成できる。
【００８１】
＜実施例２＞
本実施例では、種々の「丸め」処理が発生するなど、四則演算以外の関数が含まれる場合に、正しい解関数を求める例を説明する。
【００８２】
実施例１では、推定関数を導出する際の試算において、出力項目などが実数である場合に、所定の（小さい値の）許容誤差を考量して一致を判定するが、実際の帳票処理等においては、特に金額の処理においては、演算結果として小数点以下の数値を四捨五入、切上げ、切捨て等の丸め処理を行う場合がある。また、例えば、税額計算においては、「１００円以下の端数切捨て」等の丸め処理も行われる。
【００８３】
このような場合、要素関数ファイルに単純に正負記号の組み合わせによる四則演算を登録しても、試算結果が結果項目数値を一致せず、推定関数や解関数が求まらない可能性がある。このため、本発明のプログラム生成装置は、ユーザが、種々の丸め処理を想定した要素関数を予め要素関数ファイルに登録することによって、丸め処理を実現可能とする。
【００８４】
本実施例において、前述した実施例と同じ構成の説明は省略する。例えば、実施例２のシステムの全体構成は、図１に示すものと同じである。ただし、図３に示す要素関数リスト３１に代わって、図１４に示す要素関数リスト３１が要素関数ファイル１７に登録される。具体的には、図１４（Ａ）に示すように、予めユーザが入出力データファイル１６のデータの傾向を見て、入力装置１４等を介して、必要と思われる丸め関数を要素関数ファイル１７に追加登録する。
【００８５】
丸め関数１４０１は、小数点以下の部分を持つ実数を、整数値に丸める関数群である。ここで、ｒｏｕｎｄ（ｆ，ｎ）は、引数ｆ（ｆは関数の計算値でもよい）を小数第ｎ位の数値になるように下位の桁を四捨五入する関数である。例えば、ｒｏｕｎｄ（ａ＊ｂ，０）は、ａ＊ｂの計算値を小数第０位に四捨五入するので、小数点以下の数値は丸められて整数値となる。同様に、ｒｏｕｎｄｕｐ（ｆ，ｎ）は、引数ｆを小数第ｎ位の数値になるように下位の桁を切り上げる関数であり、ｒｏｕｎｄｄｏｗｎ（ｆ，ｎ）は、引数ｆ（ｆは関数の計算値でもよい）を小数第ｎ位の数値になるように下位の桁を切り捨てる関数である。なお、ｒｏｕｎｄ（ａ＊−ｂ，０）等も登録してもよい。
【００８６】
また、税額計算等で、例えば「１００円以下の端数切捨て」などの処理が発生する可能性がある場合、丸め関数１４０２のように、「ｙ＝ｒｏｕｎｄｄｏｗｎ（ａ＊ｂ，−２）」「ｙ＝ｒｏｕｎｄｄｏｗｎ（ａ／ｂ，−２）」も追加登録しておく。ｎ＝−２の場合、小数第−２位未満を切捨てる、すなわち、１００の位未満が切り捨てられる。
【００８７】
他の処理（図４以降のフローチャート）は、実施例２でも、実施例１と同じである。ただし、本実施例で、図２に示す例のような入出力データに対して、すべての入出力データに対する試算の結果、例えば結果項目「消費税額」は整数値になるように四捨五入されている場合、結果項目「消費税額」の解関数は「ｙ＝ｒｏｕｎｄ（（ａ＊ｂ）＊ｃ，０）［ａ＝単価，ｂ＝数量，ｃ＝消費税率］」となり、結果項目「合計」の解関数は「（ａ＊ｂ）＋ｒｏｕｎｄ（（ｃ＊ｄ）＊ｅ，０）［ａ＝単価，ｂ＝数量，ｃ＝単価，ｄ＝数量，ｅ＝消費税］」となる。
【００８８】
また、例えば距離計算など、四則演算のみでは求まらず、平方根計算等が必要になる場合もある。数値ａに対する平方根を求める関数をｙ＝Ｍａｔｈ．ｓｑｒｔ（Ａ）で表すと、図１４（Ｂ）に示すように、平方根関数１４０３を要素関数リスト３１に登録しておけば、平方根計算を含む場合にも対応できる。さらに、結果項目に２点間の距離計算が含まれる場合、Ｘ軸方向の変位をａ、Ｙ軸方向の変位をｂとして、平方根関数１４０４（ｙ＝Ｍａｔｈ．ｓｑｒｔ（ａ＊ａ＋ｂ＊ｂ））を要素関数リスト３１に登録することによって、距離計算に直接対応できる。
【００８９】
その他、三角関数、指数関数等の任意の関数についても、必要に応じて、要素関数リスト３１に登録することによって、本実施例のシステムで処理可能となる。
【００９０】
＜実施例３＞
本実施例では、入出力データの一部の入力項目や出力項目が省略されている場合でも、解関数を正しく求める例を説明する。
【００９１】
図２の例示する入出力データでは、入力項目「消費税率」の数値は、すべての入力データに対して共通の値である「０．１」なので、実際の帳票システムなどにおいては、「消費税率」は「既知の数値」として、入力データから省略されることがある。また、結果項目についても、例えば、演算の中間過程で求められる結果項目「金額」などは、結果データから省略されることがある。
【００９２】
このような場合、ユーザ（人間）にとっては何が省略された項目であるか、経験等により容易に推測できるが、本発明のプログラム生成装置にとっては、途中の段階で飛躍があると解関数を生成できない。
【００９３】
従って、本実施例では、所定の入力項目、結果項目が入出力データから省略されている場合に、ユーザが予め追加情報を与える方法について説明する。
【００９４】
まず、図２に示す例において、入力項目のうち、定数である「消費税率」が省略されているときは、図１に示すシステム構成に入力データとして補助データファイル１９（図示省略）を追加する。補助データファイル１９は、図１５（Ａ）に示すように、入力項目１５０１および固定数値１５０２で構成され、図４の入力項目登録処理（４０３）において、試算関数リスト６１に初期登録する。結果として、図６（Ａ）に示すような「消費税率」を含む試算関数リスト６１が作成されるので、その後は、実施例１と全く同じ手順で推定関数や解関数を求めることができる。
【００９５】
次に、図２に示す入出力データのうち、結果データから、中間演算結果である「消費税額」が省略されている場合について説明する。
【００９６】
実施例１で説明した通り、図７の推定関数導出処理において、最終的な演算結果である「合計」の推定関数を求めるためには、前段階として試算関数リスト６１に「ｙ＝（ａ＊ｂ）＊ｃ［ａ＝単価，ｂ＝数量，ｃ＝消費税率］」が登録されている必要があるが、実施例１のように、結果項目が推定関数が導出される順序で並んでおらず、結果項目「消費税額」が省略されている場合、結果項目「消費税率」の試算関数が登録されず、結果項目「合計」の推定関数を求めることができない。
【００９７】
このような場合に対処するため、実施例３では、図１５（Ｂ）に示すように、補助データファイル１９の固定結果項目部に、結果項目１５０３および固定関数１５０４を予めユーザが登録しておく。具体的には、図４の入力項目登録処理（４０３）において、固定関数１５０４を試算関数リスト６１に初期登録する。この際、試算値６０２は入出力データごとに異なるので、他の入力項目の数値から計算して登録する。図６（Ａ）に示す例では、「単価」が「２８０」、「数量」が「２」、「消費税率」が「０．１」なので、試算関数「ｙ＝（ａ＊ｂ）＊ｃ  ［ａ＝単価，ｂ＝数量，ｃ＝消費税率］」の試算値は「５６」となる。
【００９８】
＜実施例４＞
これまで説明した実施例のプログラム生成装置では、ロジック中に分岐がなく、結果項目が常に単一の解関数で求まる場合について説明したが、本実施例では、生成されるプログラムに分岐が含まれる場合でも、解関数を正しく求める例を説明する。具体的には、実施例４においては、所定の入力項目の所定の閾値との大小によって場合分けされ、結果データが別の数値となる（別の関数で計算される）、という分岐が含まれる。
【００９９】
図１６に示す入出力データでは、結果項目のうち、「単価」「数量」「金額」「割引額」「合計」は、入出力データによって一つの数式によって計算される値となるが、結果項目「割引率」は、「０．１」と「０．２」の二値のうち、いずれかの値となる。そして、「割引額」と「合計」は「割引率」に依存する数値であると推測される。
【０１００】
ここで、「分岐項目である『割引率』の数値は、『割引率』に依存しない他の結果項目『単価』『数量』『金額』のうちいずれかの項目（以下、分岐条件項目という）の閾値を境に『０．１』と『０．２』に分岐するが、どの項目のどの閾値で分岐するかは分からない。」という前提条件がある場合に、分岐項目「割引率」を正しく求めるための手順を説明する。
【０１０１】
まず、図１５（Ｃ）に示すように、補助データファイル１９の分岐項目部に、「割引率Ａ」が定数「０．１」、「割引率Ｂ」が定数「０．２」と定めを、項目名「割引率」の後に区切り記号（スペース等）を設け、その後に「Ａ」「Ｂ」等の一意な識別子を付けて、予め登録する。
【０１０２】
実施例４における解関数群生成処理も、基本的には図４のフローチャートと同じであるが、入力項目登録処理（４０３）では、分岐入力項目１５０５のうち、矛盾のない試算値が得られる定数１５０６を選択して、試算関数６０１に登録する。図１６に示す入出力データの例では、「割引率」が「０．２」なので、「割引率  Ｂ」を選択し、試算値６０２には「０．２」を登録する。
【０１０３】
実施例４では、入力項目の中に結果項目と同じ項目名があるかの判定（４０５）においては、区切り記号の前までの部分で判定する。そうすると、結果項目「割引率」は、「割引率  Ａ」または「割引率  Ｂ」であると判定されるので、推定関数マトリクスの出力項目「割引率」に、「ｙ＝ａ  ［ａ＝割引率  Ａ］」または「ｙ＝ａ  ［ａ＝割引率  Ｂ］」が登録される（図１７の１７０４参照）。結果項目「割引額」「合計」に対する関数は、いずれも変数として「割引率」を含むが、推定関数導出処理においては、実施例１と全く同じ処理を行ってよい。実施例４において、図１６の入出力データに対して生成された推定関数マトリクス１０１を図１７に示す。
【０１０４】
次に、解関数決定処理４０６において、分岐項目「割引率」に対する解関数を求めるロジックを生成する処理を説明する。
【０１０５】
前提が「『単価』『数量』『金額』のうちいずれかの分岐条件項目の閾値を境に『０．１』と『０．２』に分岐する」だったので、まず、分岐条件項目を特定するために、推定関数マトリクス１０１の中の「単価」１７０１、「数量」１７０２、「金額」１７０３のそれぞれを試算値が昇順（または、降順）にソートし、ソートされた試算値に「割引率」１７０４を対応させる。この結果を、図１８に示す。図１８（Ａ）〜（Ｃ）によると、「割引率」の試算値がきれいに二分割されるのは「金額」であり、他の分岐条件項目では、「割引率」の試算値が混在するので、この入出力データについての分岐条件項目は「金額」であり、金額が５６０未満の場合は割引率０．１が、５６０以上の場合は割引率０．２が適用されることがわかる。この分岐ロジックを図１８（Ｄ）に示す。
【０１０６】
なお、「５６０」と「４５０」との間に入出力データがないので、閾値「５６０」は推定値であり、例えば、閾値が「５００」であることが予め分かっている場合、補助データファイル１９に閾値の候補を登録してもよい。
【０１０７】
例えば、入出力データの件数が非常に多い場合、各データの数値の間隔が狭まるので、閾値の候補が予め分かっていなくても、実施例４の処理によって、ほぼ正確な閾値を求めることができる。
【０１０８】
本実施例においても、他の結果項目については、実施例１と同じ手順で解関数を決定できる。
【０１０９】
図１６に示す例について、求まった解関数群を、入力項目のみを使用して表現したものを図１９に、出力項目も使用して整理したものを図２０に示す。入力項目のみを使用すると、出力項目のみに出現する「割引率」（総称）は使用できず、補助データファイル１９に登録されている「割引率  Ａ」「割引率  Ｂ」しか使用できない。このため、出力項目「割引率」の他に「割引額」「合計」も分岐形式で表現される。また、分岐条件である「金額」を入力項目のみを使用して表現する場合には、「ａ＊ｂ  ［ａ＝単価，ｂ＝数量］」となる。
【０１１０】
これに対して、図２０に示すように、出力項目も使用して順次整理した記述形式とすれば、分岐に無関係に「割引率」を「ｖ」と記述できるので、「割引額」「合計」は分岐を含まない単一の関数で記述できる。
【０１１１】
なお、分岐項目が「割引率  Ａ」「割引率  Ｂ」「割引率  Ｃ」と三つ以上に分岐しても（分岐条件項目の閾値が複数存在しても）よい。
【０１１２】
また、本実施例の説明において、分岐条件項目を「『単価』『数量』『金額』のうちいずれか」と具体的に限定したが、図１７の推定関数マトリクス等を見ればわかるように、分岐項目「割引率」に依存しない（「割引率」を推定関数の要素として含まない）項目であれば、いずれの入力項目、結果項目も、分岐条件項目の候補となりうる。
【０１１３】
また、図１８に示すようにソートした場合、分岐項目がきれいに分割される分岐条件項目が複数ある場合（例えば、「数量」「金額」のいずれについても、きれいにグルーピングされる）、さらに分岐条件を明確化するために、「数量」「金額」の両分岐条件項目をマージしてソートを行い、「ｉｆ（  数量＜１０ａｎｄ金額＜５６０）ｔｈｅｎ」というような、複合的な分岐条件を求めることができる。
【０１１４】
さらに、本実施例のように、「金額」によって「割引率」が単純に別の値となる例では、閾値の前後で「割引額」の大小と「合計」の大小とが逆になるという不自然な現象が発生するが（閾値の直前より閾値の直後の方が「合計」が安くなる）、閾値において「割引額」および「合計」が連続するように、補助データファイル１９において「閾値での割引額」等のデータを適宜与えれば、「割引額」および「合計」が閾値で折れ線グラフのように連続する関数を生成することもできる。
【０１１５】
＜実施例５＞
これまで説明した実施例では、単一のプログラム生成装置で解関数群を生成するものであるが、実施例５のプログラム生成システムは、複数のプログラム生成装置が解関数の導出に使用する情報を共有する。
【０１１６】
例えば、別の組織（別企業、同一企業内の別部門等）の計算機が、類似の業務に対ついて、本発明の方法によってプログラムを生成する場合、それぞれのプログラム生成装置で最終的に生成される候補関数リスト５１は、それぞれ類似のものになることが予想される。そこで、本実施例では、図２１に示すように、あるプログラム生成装置１Ａで最終的に生成した候補関数リスト５１（すなわち、プログラム生成装置１Ａの学習成果）を、要素関数ファイル１７に記録し、後にプログラムを生成するプログラム生成装置１Ｂがネットワーク経由等で、記録された要素関数ファイル１７を共有できるようにする。要素関数ファイル１７には、例えば、「ｙ＝（ａ＊ｂ）＊ｃ」等は最初から登録されているので、効率的にプログラムを生成できる。これによって、プログラム生成装置間の累積的な学習効果が期待できる。
【０１１７】
また、業務種別等によって、演算の特徴が異なることが予め分かっている場合、複数種類の要素関数ファイル１７を記録しておき、業務種別によって使い分けてもよい。例えば、距離計算を頻繁に使用する業務と、四則演算の組み合わせしか使用しない業務とで、要素関数ファイル１７を分ける。
【０１１８】
共有される要素関数ファイル１７は、いずれかのプログラム生成装置に実装される記憶装置に格納されても、プログラム生成装置の外部に設置され、各プログラム生成装置がアクセス可能な記憶装置に格納されてもよい。
【０１１９】
＜まとめ＞
以上説明したように、本発明の実施例によれば、旧システム等における既存の入出力データしか与えられていない場合でも、各結果項目を、入力項目を引数とする基本的な関数（例えば、四則演算等）の組み合わせによって記述する解関数群を生成できる。また、所定の分岐を含む解関数導出プログラムを生成できる。なお、既存の入出力データは、各入出力項目の関係が正しく作成されていれば、システム的に作成されたものでなく、手入力等によって作成されたものでもよい。
【０１２０】
また、生成された候補関数等を要素関数ファイル１７に記録して複数のプログラム生成装置で共有することによって、類似業務におけるプログラム生成の学習効果を活用できる。
【０１２１】
以上に説明したように、本実施例のプログラム生成システムは、入力項目の数値および他の試算値を引数として候補関数を用いて試算値を計算し、前記計算された試算値が結果項目の数値と一致する候補関数を選択して、前記選択された候補関数および試算値を推定関数として登録し、前記登録された推定関数の中から、全ての入力項目の数値および試算値を引数として計算した数値が結果項目の数値と矛盾しないものを解関数として決定し、前記決定された解関数を含むプログラムを生成するので、旧システムにおける入出力データしか与えられない場合でも、基本的な関数（例えば、四則演算）の組み合わせによって結果項目を記述する解関数を含むプログラムを生成できる。
【０１２２】
また、本実施例のプログラム生成システムは、入力項目の名称と結果項目の名称とが同じである場合、結果項目の数値が入力項目の数値と同じとなる関数を推定関数として選択するので、効率的かつ正確にプログラムを生成できる。
【０１２３】
また、本実施例のプログラム生成システムは、前記決定された推定関数を候補関数に登録するので、一段階ずつ段階を追って（段階の飛躍なく）、解関数を生成できる。
【０１２４】
また、ある結果項目について、いずれの候補関数を用いた試算によっても推定関数が決定できない場合、他の結果項目の候補関数が登録された後、再度、当該結果項目について、試算値が結果項目の数値と一致するかを判定して、候補関数を選択するので、他の入出力項目で選択された候補関数を利用して、効率的かつ正確にプログラムを生成できる。
【０１２５】
また、本実施例のプログラム生成システムは、全ての入力項目および出力項目の組について、選択された推定関数が同じであれば、当該推定関数を解関数として決定し、全ての入力項目と出力項目の組について、当該入力項目の数値および前記試算値を引数とした推定関数の計算結果が当該結果項目の数値と同じであれば、当該推定関数を解関数として決定するので、効率的かつ正確にプログラムを生成できる。
【０１２６】
また、本実施例のプログラム生成システムは、導出される関数が引数を条件とした分岐を含む場合、当該関数によって計算される数値と前記分岐の条件となる引数との大小関係を用いて前記引数の閾値を探索し、前記分岐を含む推定関数を求めることを特徴とするので、分岐を含む関数でも、効率的かつ正確にプログラムを生成できる。
【０１２７】
また、本実施例のプログラム生成システムは、各々が、演算処理を実行するプロセッサと、前記プロセッサがアクセス可能な記憶装置とを備える複数の計算機によって構成され、前記記憶装置は、他の前記計算機によっても参照可能であり、前記複数の計算機の少なくとも一つは、他の計算機が参照可能なように前記候補関数を前記複数の記憶装置の少なくとも一つに格納し、前記複数の計算機の各々は、前記記憶装置に格納された候補関数を参照して、候補関数を選択するので、他の計算機で選択された候補関数を利用して、効率的かつ正確にプログラムを生成できる。
【０１２８】
また、本実施例のプログラム生成システムでは、入力項目を引数として前記解関数が記述されるので、入力項目の数値のみで結果項目の数値が計算できる。
【０１２９】
また、本実施例のプログラム生成システムは、入力項目および他の解関数による計算結果を引数として前記解関数が記述されるので、解関数を簡易に記述でき、解関数を用いた計算を高速に実行できる。
【０１３０】
なお、本発明は前述した実施例に限定されるものではなく、添付した特許請求の範囲の趣旨内における様々な変形例及び同等の構成が含まれる。例えば、前述した実施例は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに本発明は限定されない。また、ある実施例の構成の一部を他の実施例の構成に置き換えてもよい。また、ある実施例の構成に他の実施例の構成を加えてもよい。また、各実施例の構成の一部について、他の構成の追加・削除・置換をしてもよい。
【０１３１】
また、前述した各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等により、ハードウェアで実現してもよく、プロセッサがそれぞれの機能を実現するプログラムを解釈し実行することにより、ソフトウェアで実現してもよい。
【０１３２】
各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリ、ハードディスク、ＳＳＤ（ｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶装置、又は、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に格納することができる。
【０１３３】
また、制御線や情報線は説明上必要と考えられるものを示しており、実装上必要な全ての制御線や情報線を示しているとは限らない。実際には、ほとんど全ての構成が相互に接続されていると考えてよい。
【符号の説明】
【０１３４】
１、１Ａ、１Ｂ  プログラム生成装置
１２  メモリ
１３  プログラム生成処理部
１４  入力装置
１５  ディスプレイ装置
１６  入出力データファイル
１７  要素関数ファイル
１８  生成プログラムファイル
１９  補助データファイル
２１  入出力データ
３１  要素関数リスト
５１  候補関数リスト
６１  試算関数リスト
１０１  推定関数マトリクス
【図１】
2018088216.tif 000003
【図２】
2018088216.tif 000004
【図３】
2018088216.tif 000005
【図４】
2018088216.tif 000006
【図５】
2018088216.tif 000007
【図６】
2018088216.tif 000008
【図７】
2018088216.tif 000009
【図８】
2018088216.tif 000010
【図９】
2018088216.tif 000011
【図１０】
2018088216.tif 000012
【図１１】
2018088216.tif 000013
【図１２】
2018088216.tif 000014
【図１３】
2018088216.tif 000015
【図１４】
2018088216.tif 000016
【図１５】
2018088216.tif 000017
【図１６】
2018088216.tif 000018
【図１７】
2018088216.tif 000019
【図１８】
2018088216.tif 000020
【図１９】
2018088216.tif 000021
【図２０】
2018088216.tif 000022
【図２１】
2018088216.tif 000023