(57)【要約】【課題】旧システムの通信モニター記録などに基づいて、旧システムのロジックを新システムでも再現するためのプログラム生成システム、およびそのプログラムを提供する【解決手段】システムのプロセッサが推論エンジンを実行し、通信モニター記録のデータ列にデータの繰り返しのパターンを見つけるループ発見プログラムを実行して、通信モニター記録を解析して中間データに変換し、中間データを元に新システムの動作を再現する再現プログラムを生成するプログラム生成システムとした。【選択図】図１
2020154421.tif 000002
【特許請求の範囲】
【請求項１】
旧システムの記録データより生成されたデータ列に基づいて、前記旧システムのロジックを新システムでも再現するためのプログラム生成システムであって、
推論アルゴリズムを実行する推論エンジンを備え、
前記推論エンジンが、前記データ列にデータの繰り返しなどのパターンを見つけるループ発見プログラムを実行して、前記データ列を解析して中間データに変換し、
前記中間データを元に前記旧システムの動作を前記新システムにおいて再現する再現プログラムを生成する
ことを特徴とするプログラム生成システム。
【請求項２】
前記ループ発見プログラムは、
前記データ列に含まれる複数のデータ項目のうちの、処理対象として着目する最初の部分区間の先頭のデータ項目を指し示す開始点ポインタを、データ列の先頭のデータ項目に位置づけ、
最初の部分区間と、同じ長さの後続の部分区間のデータ項目の値を比較して、同じではない場合は比較する部分区間の長さを１つ増やす動作を、後続の部分区間の末尾または開始点ポインタがデータ列の終わりに達するまで反復し、
後続の部分区間の末尾がデータ列の終わりに達した場合は、開始点ポインタの指すデータ項目を中間データに追記し、開始点ポインタを１つ進める
ことを特徴とする請求項１のプログラム生成システム。
【請求項３】
前記ループ発見プログラムは、さらに
前記最初の部分区間と、同じ長さの後続の部分区間のデータ項目の値を比較して、同じである場合は、前記後続の部分区間の次にさらに同じ長さの部分区間を追加して比較する動作を反復して、ループの繰り返し回数を確定し、
前記中間データにループの繰り返し回数とループ長さを追記する
ことを特徴とする請求項２のプログラム生成システム。
【請求項４】
前記ループ発見プログラムは、さらに
ループとして認識された部分区間のデータ列を処理対象のデータ列として、別の開始点ポインタを割り当て設定し、ループ検出の動作を再度行う
ことを特徴とする請求項３のプログラム生成システム。
【請求項５】
前記再現プログラムは前記中間データのパラメータを変更して再生する再現プログラムである
ことを特徴とする請求項１から４のいずれか１項に記載のプログラム生成システム。
【請求項６】
前記データ列は前記旧システムにおける記録データに、連長圧縮または文字列変換の少なくともいずれかを含む前処理を行ったデータ列であり、
前記中間データに前記前処理の逆変換に相当する後処理を行い、前記再現プログラムを生成する
ことを特徴とする請求項１から５のいずれか１項に記載のプログラム生成システム。
【請求項７】
請求項１から６のいずれか１項に記載のプログラム生成システムにおいて、
前記推論エンジンおよび前記ループ発見プログラムとして動作する
ことを特徴とするコンピュータプログラム。
【請求項８】
請求項７に記載のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム生成システム及びそのプログラムに関し、詳細には例えば、既存システムの実行記録や通信記録等の記録データ列から、その既存システムと同等の動作をするシステムを生成するためのプログラム生成システム及びそのシステムのプログラムに関する。
【背景技術】
【０００２】
従来、情報処理・通信技術の高度化に伴い、企業や工場等の制御システムにおいて、例えば制御システムのコントローラやＰＣの置き換えなどが必要となり、既存の制御プログラムがそのままでは動かないため、既存プログラムと同じ動作をする新たな制御プログラムの開発が必要となることがしばしば発生する。
【０００３】
このような際に、移行前の旧制御システムが長年にわたって使用されていた場合などには、当該旧制御システムの仕様書、設計ドキュメントやソースコードなどは、何らかの原因によって既に滅失または特定不能になっており、移行すべき新システムの開発が困難となることがしばしばある。
【０００４】
旧制御システムが現用のシステムであれば、その制御通信の内容をオンラインでモニターして記録することができる場合があり、あるいは、旧制御システムが既に廃止されている場合であっても、旧制御システムの制御出力などを含む通信の大量のモニター記録、通信ログなどの記録データなどが残されている場合もあり、これらのデータを元に同等な新システムを開発したい場合もある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１８−８８２１６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記のような、旧システムから新システムへの移行に際して、システムの仕様が不明な場合に、旧システムの通信モニター記録をそのまま再生するシステムとして対応することは可能だが、これではモニター記録に無い場合の対応や、部分的なシステム変更などへの対応が難しい。
【０００７】
従って、旧システムのロジックを新システムでも再現するためには、モニター記録やログデータの整理、解析が必要となるが、通常データ量が膨大となるため人力による処理には限界がある。
【０００８】
本発明は、このような問題に鑑みてなされたもので、その目的とするところは、旧システムの記録データ列に基づいて、旧システムのロジックを新システムでも再現するためのプログラム生成システム、およびそのプログラムを提供することにある。
【課題を解決するための手段】
【０００９】
本発明は、このような目的を達成するために、実施形態の一例として以下のような構成を備えることを特徴とする。
【００１０】
（構成１）
旧システムの記録データより生成されたデータ列に基づいて、前記旧システムのロジックを新システムでも再現するためのプログラム生成システムであって、
推論アルゴリズムを実行する推論エンジンを備え、
前記推論エンジンが、前記データ列にデータの繰り返しなどのパターンを見つけるループ発見プログラムを実行して、前記データ列を解析して中間データに変換し、
前記中間データを元に前記旧システムの動作を前記新システムにおいて再現する再現プログラムを生成する
ことを特徴とするプログラム生成システム。
【００１１】
（構成２）
前記ループ発見プログラムは、
前記データ列に含まれる複数のデータ項目のうちの、処理対象として着目する最初の部分区間の先頭のデータ項目を指し示す開始点ポインタを、データ列の先頭のデータ項目に位置づけ、
最初の部分区間と、同じ長さの後続の部分区間のデータ項目の値を比較して、同じではない場合は比較する部分区間の長さを１つ増やす動作を、後続の部分区間の末尾または開始点ポインタがデータ列の終わりに達するまで反復し、
後続の部分区間の末尾がデータ列の終わりに達した場合は、開始点ポインタの指すデータ項目を中間データに追記し、開始点ポインタを１つ進める
ことを特徴とする構成１のプログラム生成システム。
【００１２】
（構成３）
前記ループ発見プログラムは、さらに
前記最初の部分区間と、同じ長さの後続の部分区間のデータ項目の値を比較して、同じである場合は、前記後続の部分区間の次にさらに同じ長さの部分区間を追加して比較する動作を反復して、ループの繰り返し回数を確定し、
前記中間データにループの繰り返し回数とループ長さを追記する
ことを特徴とする構成２のプログラム生成システム。
【００１３】
（構成４）
前記ループ発見プログラムは、さらに
ループとして認識された部分区間のデータ列を処理対象のデータ列として、別の開始点ポインタを割り当て設定し、ループ検出の動作を再度行う
ことを特徴とする構成３のプログラム生成システム。
【００１４】
（構成５）
前記再現プログラムは前記中間データのパラメータを変更して再生する再現プログラムである
ことを特徴とする構成１から４のいずれか１項に記載のプログラム生成システム。
【００１５】
（構成６）
前記データ列は前記旧システムにおける記録データに、連長圧縮または文字列変換の少なくともいずれかを含む前処理を行ったデータ列であり、
前記中間データに前記前処理の逆変換に相当する後処理を行い、前記再現プログラムを生成する
ことを特徴とする構成１から５のいずれか１項に記載のプログラム生成システム。
【００１６】
（構成７）
構成１から６のいずれか１項に記載のプログラム生成システムにおいて、
前記推論エンジンおよび前記ループ発見プログラムとして動作する
ことを特徴とするコンピュータプログラム。
【００１７】
（構成８）
構成７に記載のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の効果】
【００１８】
以上記載したように、本発明によれば、旧システムの記録データ列に基づいて、旧システムのロジックを新システムでも再現するためのプログラム生成システム、およびプログラムを提供することが可能となる。
【図面の簡単な説明】
【００１９】
【図１】本発明のシステムの一実施形態にかかる全体を示す構成図である。
【図２】本発明のシステムの前処理および後処理の例を説明する図である。
【図３】本発明のプログラム生成システムのプログラムコードの一例を示す図である。
【図４】本発明のプログラム生成システムの実行過程を説明する図である。
【図５】本発明のプログラム生成システムの実行過程を説明する図である。
【図６】本発明のプログラム生成システムの実行過程を説明する図である。
【図７】本発明のプログラム生成システムの実行過程を説明する図である。
【図８】本発明のプログラム生成システムの実行過程を説明する図である。
【図９】本発明のプログラム生成システムの実行過程を説明する図である。
【図１０】本発明のプログラム生成システムの実行過程を説明する図である。
【図１１】本発明のプログラム生成システムの実行過程を説明する図である。
【図１２】本発明のプログラム生成システムの実行過程を説明する図である。
【図１３】本発明のプログラム生成システムの実行過程を説明する図である。
【図１４】本発明のプログラム生成システムの実行過程を説明する図である。
【図１５】本発明のプログラム生成システムの実行過程を説明する図である。
【図１６】本発明のプログラム生成システムの実行過程を説明する図である。
【図１７】本発明のプログラム生成システムの実行過程を説明する図である。
【図１８】本発明のプログラム生成システムの実行過程を説明する図である。
【図１９】本発明のプログラム生成システムの実行過程を説明する図である。
【図２０】本発明のプログラム生成システムの実行過程を説明する図である。
【図２１】本発明のプログラム生成システムの実行過程を説明する図である。
【図２２】本発明のプログラム生成システムの実行過程の別例を説明する図である。
【図２３】本発明のプログラム生成システムの実行過程の別例を説明する図である。
【図２４】本発明のプログラム生成システムの実行過程の別例を説明する図である。
【図２５】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図２６】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図２７】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図２８】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図２９】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図３０】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図３１】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図３２】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図３３】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図３４】本発明のプログラム生成システムの実行過程の更に別例を説明する図である。
【図３５】本発明のプログラム生成システムの実行過程のシーケンス図である。
【図３６】本発明のプログラム生成システムの推論エンジンの概略フローを説明する図である。
【図３７】本発明のプログラム生成システムの繰り返しを見つける処理の概略フローを説明する図である。
【発明を実施するための形態】
【００２０】
以下、図面を参照しながら本発明の実施形態について詳細に説明する。
【００２１】
（システムの全体構成）
図１は、本発明の一実施形態にかかるプログラム生成システム７を含む全体の構成を説明する概念図である。
【００２２】
図１において、ＰＣ１は旧制御システムのコントローラ、制御装置などであって、その上で既存プログラム２が動作して、制御対象物３を通信回線を介して制御する。既存プログラム２は旧システムのＰＣ１に内蔵されており、通信回線を介して制御対象物３（例えば制御可能な計測装置や電源装置などを想定しているが、これに限らない）へ制御コマンドやデータなどを送信するが、既存プログラム２の内容自体は、いわゆるリバースエンジニアリング（内容解析）が困難ないしは不可能な状況にあると仮定する。
【００２３】
ＰＣ１からの制御通信の内容は、例えば通信ログのような通信モニター記録として通信回線上の通信モニター４によりモニターされて、プログラム生成システム７のデータ列記憶再生部１０に記録され、データ列として再生される。通信モニター記録としては、例えばＰＣ１の発するコマンドやデータが記録され、データ項目（データ要素、例えば測定装置の測定項目、測定範囲、電源装置の設定電圧など）からなる時系列のデータ列として再生することができる。データ列記憶再生部１０は、データ量の削減のために通信モニター記録に後述のような前処理を行ったデータ列として記録することができる。
【００２４】
図１では、旧システムは現用システムとして表示されているが、旧システムが既に廃止されたシステムであっても、このような記録データ（通信ログ）があれば本発明は適用可能である。
【００２５】
図１のプログラム生成システム７は、本発明の一実施形態にかかるシステムであって、ハードウェアは通常のコンピュータシステムとして、プロセッサ、メモリ、入出力装置などを備えている。プログラム生成システム７は、そのプロセッサが後述のソフトウェアを実行することによって実装され、推論アルゴリズムを実行する推論エンジン５を有している。この推論エンジン５が、データ列記憶再生部１０から記録されたデータ列を受け取り、これを解析、変換処理する。
【００２６】
推論エンジン５は概略、データの繰り返しなどのパターンを見つけるループ発見プログラム８を実行してデータ列を解析して、中間データ９に変換する。この中間データ９を元に新システムの動作を再現する再現プログラム６が動作して、既存プログラム２と同じ動作を新システムにおいて再現する。データ列記憶再生部１０において、前述のような前処理を行っている場合には、後処理システム１１において、前処理に対応する後処理を中間データ９に行ってから再現プログラム６に渡す。
【００２７】
推論エンジン５が実行する推論アルゴリズムによる記録データ列のデータ解析の概要は、以下のような考え方によるものである。
・一般的なプログラムの制御構造は、「分岐」、「サブプログラム」、「ループ」などで構成されている。
・この内、「ループ」を使用することにより、プログラム行数を少なくできる。
・本システムは、通信モニターなどの通信ログの記録データ列から、データの繰り返しを発見して「ループ」を推論し、中間データ９を作成する。
【００２８】
ここで言う、データの繰り返しとは、通信モニター記録（通信ログ）のデータ列の中の、同じ値のデータ項目（データ要素）の単純な連続や反復のみでなく、異なる値を含む複数のデータ項目の列（パターン）の反復や、そのような反復パターンを構成要素として含む階層的な反復パターンを含むことに留意されたい。
【００２９】
（前処理と後処理）
なお、図２の（ａ）に示すように、以下に説明するデータ列の例では、データ列記憶再生部１０において生の通信ログの前処理として、同じ値のデータ要素の単純な反復は、データ要素の値と反復する長さ（いわゆる連長、ランレングス）の値を組にしたデータ項目に変換（連長圧縮）して、以後の反復パターン検出の演算量を節減している。
【００３０】
例えば、前処理する前の生の通信ログデータに「AAABBBBB」とあれば、「A3」、「B5」として変換し、これを２つのデータ項目「ＡＢ」のように推論エンジンの入力データ列においては表現する。このため、以下に説明するデータ列の例では、同じ値のデータ項目が連続することは無い。
【００３１】
また別の通信ログの前処理として、生の通信ログの中に例えば頻出する長いキーワードなどの文字列があれば、これを１つのデータ項目に変換（文字列変換）しておくことも可能である。あるいは前処理としては、このような文字列変換と前述の連長圧縮と組み合わせても良い。この様な前処理を行っておくと、後述のループ発見処理の効率を大幅に向上することができる。
【００３２】
なお、データ列記憶再生部１０においてこのような前処理を行っている場合には、前処理の逆変換に当たる後処理を行う必要があり、読み出した中間データ９に後処理システム１１において、図２（ｂ）に示すような処理を行っている。中間データ９の詳細については後述するが、図２（ｂ）においては、上図のたとえば２行目の
＜ＤＡＴＡ＞Ａ５＜／ＤＡＴＡ＞
とある行が、下図の２〜４行目の
＜ＬＯＯＰ  Ｃｏｕｎｔ＝５  Ｌｅｎｇｔｈ＝１＞
＜ＤＡＴＡ＞Ａ＜／ＤＡＴＡ＞
＜ＬＯＯＰ＞
のようにループに展開されて、連長圧縮の逆変換を表現している。
前処理が文字列変換の場合には、表引きなどにより単に文字列の逆変換を行えばよい。
【００３３】
確実な再現動作を可能とするためには、通信ログのデータ列の取得は、なるべくシステムの初期状態、すなわちＰＣ１や制御対象物３がリセットないし電源投入時の状態から開始されるのが望ましいが、必ずしもこれに限定されるものではない。
【００３４】
（プログラム実装例）
図３には、この様な推論アルゴリズムによるプログラム生成システム７のプログラム実装例、特にデータの繰り返しを見つけるループ発見プログラム８を含む推論エンジン５のプログラム言語Python（パイソン）による実装コードの一例を示し、以下の表１にその一部を示す。
【００３５】
［表１］
class プログラム生成システム:
def __init__(self):
self.中間データ = ET.Element('program')
def 推論開始(self,通信ログデータ列,前処理=False,後処理=False):
データ列 = []
if 前処理:
データ列 = self.前処理(通信ログデータ列)
else:
データ列 = 通信ログデータ列
self._推論エンジン(0,self.中間データ,データ列)
if 後処理:
self.後処理(self.中間データ)
def 前処理(self,通信ログデータ列):   # 省略
def _推論エンジン(self, 開始点,中間データ,通信ログデータ列):
def 次の開始点とループ回数(開始点,ループ長さ,通信ログデータ列):
for ループ回数 in range(1,int(len(通信ログデータ列)/2 + 1)):
if (通信ログデータ列[ 開始点 : 開始点 + ループ長さ]
!= 通信ログデータ列[ 開始点 + (ループ回数+1) * ループ長さ : 開始点 + (ループ回数+2) * ループ長さ]) :
return 開始点 + (ループ回数+1) * ループ長さ, ループ回数
return 開始点 + ループ長さ*2, ループ回数
次の開始点の一時保存 = 0
ループ長さの一時保存 = 0
ループ回数の一時保存 = 0
基の開始点 = 次の開始点の一時保存
while 開始点 < len(通信ログデータ列):
for ループ長さ in range(1,int(len(通信ログデータ列)/2 + 1)):
if (通信ログデータ列[ 開始点 : 開始点 + ループ長さ]
== 通信ログデータ列[ 開始点 + ループ長さ : 開始点 + 2 * ループ長さ]) :
次の開始点候補,ループ回数 = 次の開始点とループ回数(開始点,ループ長さ,通信ログデータ列)
if 次の開始点の一時保存 < 次の開始点候補:
次の開始点の一時保存 = 次の開始点候補
ループ長さの一時保存 = ループ長さ
ループ回数の一時保存 = ループ回数
if 基の開始点 == 次の開始点の一時保存:
単発データ = ET.SubElement(中間データ,'line')
単発データ.text = str(通信ログデータ列[ 開始点 ])
開始点 += 1
else:
if 開始点 + 1 < 次の開始点の一時保存:
ループデータ = ET.SubElement(中間データ,'loop')
ループデータ.set('count',str(ループ回数の一時保存 + 1))
ループデータ.set('length',str(ループ長さの一時保存))
self._推論エンジン(0,ループデータ,通信ログデータ列[ 開始点 : 開始点 + ループ長さの一時保存])
開始点 = 次の開始点の一時保存
基の開始点 = 次の開始点の一時保存
else:
開始点 += 1
def 後処理(self,中間データ):   # 省略
def 中間データ読み出し(self):   # 省略
def 再現プログラム生成(self, 中間データ, インデント, 変数採番):   # 省略
def main():
通信ログデータ列 =
["A","A","A","A","A","B","C","B","C","D","B","C","B","C","D","A","E","F","G"]
推論機 = プログラム生成システム()
推論機.推論開始(通信ログデータ列,前処理=True,後処理=True)
print(推論機.中間データ読み出し())
# 正誤チェック.
再現結果 = {}
exec(推論機.再現プログラム生成(推論機.中間データ,"",0),globals(),再現結果)
print(通信ログデータ列)
print(再現結果['ans'])
print( "verify OK") if 再現結果['ans'] == 通信ログデータ列 else print( "verify NG")
if "__main__" == __name__:
main()
【００３６】
（データ列１：基本繰り返しパターンの場合）
以下の図４〜２１に、通信ログデータ列の一例（ＡＢＣＤＢＣＤＢＣＤＡＥＦＧ：データ列１とする）について、上記のプログラム生成システムのプログラムコードにより、繰り返しを見つけるループ発見プログラム８を含む推論エンジン５を実行した場合の、中間データ９の状態の変化を順に説明する。なお、以下同様であるが、データ列の各アルファベットＡ〜Ｇは、前述のような前処理をした最小単位のデータ項目を表している。
【００３７】
図４は、本プログラム生成システムのプログラムコードを開始した初期状態を示す。
【００３８】
図４（ａ）は、本プログラム生成システムの入力データとして、解析対象となるデータ列であって、通信モニター４などで得られた既存プログラムの動作記録（通信モニター記録のログデータ）に基づくデータ列１が示されている。図４（ａ）の左端に「開始点」として示される下向き矢印は、現在の処理対象データとして着目するデータ列の、部分区間の先頭のデータ項目の位置を指し示すポインタ（開始点ポインタ）であって、図２および表１に示す「開始点」とある変数に相当し、初期状態においては、入力データ列の先頭（左端）のデータ項目「Ａ」に位置づけられている。
【００３９】
図４（ｂ）は、本プログラム生成システムの入力データ解析の途中結果を記録する、中間データ格納領域（図１の中間データ９）の状態を示しており、初期状態においては、中間データ格納領域が確保されて、最終的に出力される生成プログラムの空の初期状態として、
＜Ｐｒｏｇｒａｍ＞
＜／Ｐｒｏｇｒａｍ＞
の識別子（タグ）のみが記録されている。後述するように、本プログラム生成システムの入力データ解析の進行につれて、解析されたデータ構造が＜Ｐｒｏｇｒａｍ＞のタグと、＜／Ｐｒｏｇｒａｍ＞のタグの間に追記されていく。したがって、この中間データは、階層構造を表現できるデータ形式を用いる。
【００４０】
さて、本プログラム生成システムの入力データ解析の基本動作の一つは、データ列の中にある同じパターンの繰り返しを有するデータ項目の列、すなわちループの検出である。このため、部分区間の長さ（部分区間に含まれるデータ項目の数）が２の場合から始めて、同じ長さの後続の部分区間が同じ値かどうかを比較してゆく。前述のように前処理によって、同じ値のデータ項目の連続は取り除かれているので、部分区間の長さが２の場合から始めることでループ検出の処理を効率化できる。
【００４１】
図４（ａ）においては最初の部分区間（Ａ，Ｂ）と後続の（Ｃ，Ｄ）の２つの部分区間が比較されており、同じではないので、比較する部分区間の長さ（ループ長さ）を１つ増やして３として図５の状態に遷移する。
【００４２】
同様にして、図５〜９まで順次、比較する区間の幅を増やして繰り返してゆくが、同じ部分区間の反復パターンが見つからず、図９では比較する後続の部分区間の末尾が入力データ列の終わりまで達してしまう。この状態で、開始点ポインタが指すデータ項目Ａと同じデータ項目Ａは、入力データ列の終わりから３つ手前にもう一つ存在するが、後続の部分区間の先頭がそこまでは達する前に、後続の部分区間の末尾が入力データ列の終わりのデータ項目Ｇまで達してしまうので、認識されないことに留意されたい。
【００４３】
さて、この状態において、データ項目Ａから始まる繰り返しデータ列が入力データの中に無いことが確定するので、データ項目Ａを最初に認識された単独のデータ要素として、
＜ＤＡＴＡ＞Ａ＜／ＤＡＴＡ＞
のように中間データ格納領域にタグを追記する。（図８（ｂ））
【００４４】
つぎの、図１０においては、開始点を１つ進めて同じループ検出動作を行う。すると、図１１に示すように、データ項目Ｂから始まるループ長さ３の部分区間（Ｂ，Ｃ，Ｄ）に同じパターンの後続部分区間（Ｂ，Ｃ，Ｄ）が検出され、ループと認識される。
【００４５】
図１１に示す状態においては、今度はループの繰り返し回数（ループ回数）の検出動作に移行する。すなわち、ループパターンとして検出された後続の部分区間の次に、さらに同じ長さの部分区間を設定して比較する動作を反復する。すると、図１２に示すように、同じ長さ３の部分区間（Ｂ，Ｃ，Ｄ）は３つあることが判明する。
【００４６】
しかし、図１３に示すように４つ目の部分区間の値は（Ａ，Ｅ，Ｆ）であるので、（Ｂ，Ｃ，Ｄ）の４回目の繰り返しはないことが判明する。ここで検出されたループパターンの繰り返し回数（ループ回数）が確定し、ループ回数＝３、ループ長さ３として、
＜ＬＯＯＰ  Ｃｏｕｎｔ＝３  Ｌｅｎｇｔｈ＝３＞
＜／ＬＯＯＰ＞
のように中間データ格納領域にループのタグが挿入追記される。（図１３（ｂ））
【００４７】
但し、図１３のこの段階では、繰り返すループパターンの具体的な部分区間のデータの値（Ｂ，Ｃ，Ｄ）は、まだ確定しない。繰り返すパターンの部分区間中に、階層的に更に繰り返しが含まれる場合があるからである。このループの中にあるループを検出するステップは、本発明の実施形態のプログラムコードにおいては、いわゆる再帰呼び出しとして実装されている。具体的には、図３または表１のプログラムコードにおいて、推論エンジンの定義中にある
self._推論エンジン(0,ループデータ,通信ログデータ列[ 開始点 : 開始点 + ループ長さの一時保存])
とある推論エンジンの呼び出しが相当する。
【００４８】
次の図１４〜１６が、この繰り返すパターンの中にある繰り返しを検出するステップを説明する図である。繰り返すパターンのデータ列（Ｂ，Ｃ，Ｄ）を、図４における入力データ列とみなして、図４からと同様なループの検出動作を行う。
【００４９】
但し、図１４〜１６に示される開始点ポインタは、再帰呼び出しされる推論エンジンの手続の側で新たに割り当て設定される、別のインスタンスとしての開始点ポインタであって、最初に図４において設定される開始点ポインタとは別の値をもつ変数であることに留意が必要である。多重のループ構造が入れ子構造となっている場合は、多重に再帰呼び出しされたそれぞれのレベルの推論エンジンの手続きにおいて、それぞれ別のインスタンスとしての開始点ポインタが設定されることとなる。
【００５０】
さて、入力データ列として設定された（Ｂ，Ｃ，Ｄ）の中には繰り返しは存在しないので、図１４〜１６において後続データ列との同一判定はいずれも失敗し、繰り返すパターンのデータ列（Ｂ，Ｃ，Ｄ）を指し示す開始点ポインタが進められる毎に、繰り返すパターンのデータ列を構成するデータ項目の具体的な値が、Ｂ，Ｃ，Ｄの順に確定し、中間データ格納領域にある
＜ＬＯＯＰ  Ｃｏｕｎｔ＝３  Ｌｅｎｇｔｈ＝３＞＜／ＬＯＯＰ＞
タグの中に
＜ＤＡＴＡ＞Ｂ＜／ＤＡＴＡ＞
＜ＤＡＴＡ＞Ｃ＜／ＤＡＴＡ＞
＜ＤＡＴＡ＞Ｄ＜／ＤＡＴＡ＞
のように挿入追記されてゆく。（図１４（ｂ）〜図１６（ｂ））
【００５１】
図１６において、再帰呼び出しされた推論エンジンの手続きにおいて、開始ポインタがデータ列の最後に到達すると、再帰呼び出しされた推論エンジンの手続きは終了して、プログラムの制御は再帰呼び出しした側の推論エンジンの手続き処理に戻る。
【００５２】
図１７において、もとの処理に戻ると、図１７（ｂ）のように、中間データ格納領域にはループの具体的なデータ項目の値が確定した繰り返し処理が格納されている。もとの処理の開始点ポインタは図１８（ａ）に示すように、当初の入力データ列において繰り返しが終わった点の次の、データ項目Ａをさす位置へ移動される。
【００５３】
図１９〜２１に示すように、残った入力データ列（Ａ，Ｅ，Ｆ，Ｇ）について、図４からと同様なループ検出処理が実行される。残った入力データ列（Ａ，Ｅ，Ｆ，Ｇ）の中には繰り返しパターンは存在しないので、同一判定が失敗して開始点ポインタが進められる毎に、残ったデータ列の値が順に確定し、中間データ格納領域の
＜ＬＯＯＰ  Ｃｏｕｎｔ＝３  Ｌｅｎｇｔｈ＝３＞・・・＜／ＬＯＯＰ＞
タグの後ろに、データ項目Ａ，Ｅ，Ｆ，Ｇが順に格納されてゆく。（図２１（ｂ））
【００５４】
このようにして、データ列１についての推論エンジン５による処理が完了して、中間データ９が確定する。
【００５５】
（データ列２：異なる長さの複数のループを含む場合）
以下の図２２〜２４には、データ列処理の別例として、異なる長さの複数の繰り返し候補がある場合（ＡＢＣＢＣＢＣＢＣＢＣＤＡＥＦＧ：データ列２）について、上記のプログラム生成システムのコードにより、繰り返しを見つけるステップ８、推論エンジン５を実行した場合の中間データ９の状態の変化を順に説明する。データ列２では、ＢＣが５個連なったパターン（ＢＣＢＣＢＣＢＣＢＣ）を含んでいる。
【００５６】
図２２は、データ列１の図４と同じ初期状態であって、開始点Ａで始まるループはこの場合も存在しないので、途中の状態は省略するがデータ列１の図４〜９の場合と同様にデータ列２が処理されて、最終的にデータ列１の図１０と同様にデータ「Ａ」が最初に認識された単独のデータ項目となる。（図２３（ｂ））
【００５７】
図２３では、開始点が１つ進められて開始点ポインタは２番目のデータ項目Ｂをさしているが、このデータ列２の場合、データ列１の場合の図１０の状態と異なり、図２３（ａ１）と図２３（ａ２）に示すように、ループ長さ（部分区間の幅）が２と４で異なる、２通りの繰り返しパターンの認識が可能である。
【００５８】
この様な異なる長さのループ候補が検出される場合に、どちらの長さのループとして認識するのかを、図２４で説明する。
【００５９】
図２４（ａ１）は、データ列２の場合、ループ長さ２のパターン（Ｂ，Ｃ）が５回認識可能であることを示している。図２４（ｂ）には、この場合の中間データ格納領域の状態を
＜ＬＯＯＰ  Ｃｏｕｎｔ＝５  Ｌｅｎｇｔｈ＝２＞
＜ＤＡＴＡ＞Ｂ＜／ＤＡＴＡ＞
＜ＤＡＴＡ＞Ｃ＜／ＤＡＴＡ＞
＜／ＬＯＯＰ＞
として示している。
【００６０】
一方、図２４（ａ２）には、データ列２の場合、ループ長さ４のパターン（Ｂ，Ｃ，Ｂ，Ｃ）を２回認識することも可能であることが示されている。本実施例では、この２つの例では、長さ２の繰り返しの終了地点の方が長さ４の繰り返し終了地点より後ろにあるので、より後ろにある長さ２の方を採用する。
【００６１】
このようにすれば、より長いデータ列をループとして認識可能となり、生成プログラムが効率的となる。
【００６２】
（データ列３：繰り返しの中に繰り返しがある場合）
以下の図２５〜３４には、データ列処理の更に別例として、繰り返しの中に繰り返しがある場合（ＡＢＣＢＣＤＢＣＢＣＤＡＥＦＧ：データ列３）について、推論エンジン５を実行した場合の中間データ９の状態の変化を順に説明する。
【００６３】
このデータ列３の例では、２番目のデータ項目Ｂから始まる長さ５の２回のループ
（ＢＣＢＣＤＢＣＢＣＤ）
のループパターン（ＢＣＢＣＤ）中に更に、長さ２の２回のループ（ＢＣＢＣ）が含まれている。
【００６４】
以下の図２５〜３４に、このような場合の動作説明を補足する。
【００６５】
図２５は、データ列１の図４、データ列２の図２２と同様な、データ列３の初期状態である。
【００６６】
図２６では、開始点が一つ進められた結果、データ列３の場合、ループ長さの異なる２つのパターンが認識可能であることを示している。図２６（ａ１）では、ループ長さ２のパターン（ＢＣ）が２回、図２６（ａ２）では、ループ長さ５のパターン（ＢＣＢＣＤ）が２回、認識可能である。この例では、長さ５の繰り返しの終了地点の方が、長さ２の繰り返し終了地点より後ろにあるので、前述のようにより後ろにある図２６（ａ２）の長さ５の方を採用する。
【００６７】
図２６（ｂ）の３〜４行目には、この場合の中間データ格納領域の状態を
＜ＬＯＯＰ  Ｃｏｕｎｔ＝２  Ｌｅｎｇｔｈ＝５＞
＜／ＬＯＯＰ＞
として示している。
【００６８】
図２７では、この様にして認識された図２６（ａ２）のループ長さ５のパターン（ＢＣＢＣＤ）に対して、再帰的に呼び出された、繰り返しの中の繰り返しを検出する手続の動作を示している。長さ５のパターン（ＢＣＢＣＤ）の中には、長さ２のパターン（ＢＣ）の繰り返しが２回検出可能であるが、それ以上の長さのパターンは検出されない。そして、長さ２のパターン（ＢＣ）の中には、もはやループは無い。
【００６９】
従って図２８（ｂ）に示すように、長さ５のループの中に長さ２のループ（ＢＣ）が２回含まれていることが確定し、入れ子となったデータ構造が、以下の中間データとして確定する。
＜ＬＯＯＰ  Ｃｏｕｎｔ＝２  Ｌｅｎｇｔｈ＝５＞
＜ＬＯＯＰ  Ｃｏｕｎｔ＝２  Ｌｅｎｇｔｈ＝２＞
＜ＤＡＴＡ＞Ｂ＜／ＤＡＴＡ＞
＜ＤＡＴＡ＞Ｃ＜／ＤＡＴＡ＞
＜ＬＯＯＰ＞
【００７０】
図２９では、ループ長さ５のパターンの開始点ポインタが進められて、末尾のデータ要素Ｄが確定した状態が、図２９（ｂ）８行目の
＜ＤＡＴＡ＞Ｄ＜／ＤＡＴＡ＞）
として示されている。
【００７１】
図３０では、トップレベルのパターン認識の手続に戻り、開始点ポインタがループ長さ５の２回の繰り返しの後のデータ要素Ａを指している。
【００７２】
以下、図３１〜３４では残りのデータ要素の検査がトップレベルで行われるが、ループは含まれていないので、各々のデータ要素Ａ、Ｅ、Ｆ、Ｇが順次トップレベルの中間データに追加されて、データ列３の末尾に到達して、推論エンジン５の繰り返しを見つけるステップ８が終了する。
【００７３】
（全体のシーケンス図）
図３５には、本発明の実施形態のプログラム生成システムの全体のシーケンス図を示す。シーケンス図左のＡｃｔｏｒ１とあるフローは、図１のプログラム生成システム７の全体動作のための計算モデルにおけるＡｃｔｏｒと呼ばれるオブジェクトであって、推論する、ＸＭＬファイルプリント、検証、の各動作を実行する。
【００７４】
シーケンス図右の「繰り返し性」から始まる流れは、プログラムコードの実行する具体的手続の流れであって、例えばＡｃｔｏｒの推論する動作における、前処理、推論エンジン、次の開始点を探す、推論エンジン、後処理などの各動作を示している。
【００７５】
実施形態のプログラムコードでは動作の検証のため、推論エンジン５が作成した中間データ９をそのまま再生する、いわば雛形の再現プログラム６としており、これをプロセッサが実行して入力データ列（Ｉｎｐｕｔ）が再現されていることを検証している。
【００７６】
実際のシステムへの適用にあたっては、再現すべき新システムの変更要求などに合わせて、中間データのパラメータ（例えばループ回数、ループ長さやループを構成するデータ項目の値など）を変更して、新システムの要求仕様に適合したデータを再生する再現プログラム６とすることができる。
【００７７】
データ列が、前述のような生の通信ログデータに連長圧縮または文字列変換などの前処理を行ったものである場合には、後処理システム１１において中間データ９に、連長圧縮または文字列変換の逆変換に相当する後処理を行う必要がある。
【００７８】
図３６には、図４〜３４に説明した推論エンジンの動作フローとログデータ列の状態の全体の関係をまとめて示す。
【００７９】
図３７には、同様に図４〜３４に説明した繰り返しパターンを見つけるループ発見プログラム８のフローチャートの全体構造を示す。
【００８０】
以上のように本発明によれば、旧システムのログデータや通信モニター記録を解析して、階層的なループ構造を検出して中間データを作成し、これに基づいて旧システムのロジックを新システムでも再現するためのプログラムを生成することができる。
【産業上の利用可能性】
【００８１】
本発明によれば旧システムの通信モニター記録などに基づいて、旧システムのロジックを新システムでも再現するためのプログラム、およびそのプログラムをもちいたシステムを提供することができる。
【符号の説明】
【００８２】
１  旧システム（ＰＣ）
２  既存プログラム
３  制御対象物
４  通信モニター
５  推論エンジン
６  再現プログラム
７  プログラム生成システム
８  ループ発見プログラム
９  中間データ
１０  データ列記憶再生部
１１  後処理システム
【図１】
2020154421.tif 000003
【図２】
2020154421.tif 000004
【図３】
2020154421.tif 000005
【図４】
2020154421.tif 000006
【図５】
2020154421.tif 000007
【図６】
2020154421.tif 000008
【図７】
2020154421.tif 000009
【図８】
2020154421.tif 000010
【図９】
2020154421.tif 000011
【図１０】
2020154421.tif 000012
【図１１】
2020154421.tif 000013
【図１２】
2020154421.tif 000014
【図１３】
2020154421.tif 000015
【図１４】
2020154421.tif 000016
【図１５】
2020154421.tif 000017
【図１６】
2020154421.tif 000018
【図１７】
2020154421.tif 000019
【図１８】
2020154421.tif 000020
【図１９】
2020154421.tif 000021
【図２０】
2020154421.tif 000022
【図２１】
2020154421.tif 000023
【図２２】
2020154421.tif 000024
【図２３】
2020154421.tif 000025
【図２４】
2020154421.tif 000026
【図２５】
2020154421.tif 000027
【図２６】
2020154421.tif 000028
【図２７】
2020154421.tif 000029
【図２８】
2020154421.tif 000030
【図２９】
2020154421.tif 000031
【図３０】
2020154421.tif 000032
【図３１】
2020154421.tif 000033
【図３２】
2020154421.tif 000034
【図３３】
2020154421.tif 000035
【図３４】
2020154421.tif 000036
【図３５】
2020154421.tif 000037
【図３６】
2020154421.tif 000038
【図３７】
2020154421.tif 000039
【手続補正書】
【提出日】令和2年4月13日(2020.4.13)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
旧システムの記録データより生成されたデータ列に基づいて、前記旧システムのロジックを新システムでも再現するためのプログラム生成システムであって、
推論アルゴリズムを実行する推論エンジンを備え、
前記推論エンジンが、前記データ列にデータの繰り返しのパターンを見つけるループ発見プログラムを実行して、前記データ列を解析して中間データに変換し、
前記中間データを元に前記旧システムの動作を前記新システムにおいて再現する再現プログラムを生成する
ことを特徴とするプログラム生成システムにおいて、
前記ループ発見プログラムは、
前記データ列に含まれる複数のデータ項目のうちの、処理対象として着目する最初の部分区間の先頭のデータ項目を指し示す開始点ポインタを、データ列の先頭のデータ項目に位置づけ、
最初の部分区間と、同じ長さの後続の部分区間のデータ項目の値を比較して、同じではない場合は比較する部分区間の長さを１つ増やす動作を、後続の部分区間の末尾または開始点ポインタがデータ列の終わりに達するまで反復し、
後続の部分区間の末尾がデータ列の終わりに達した場合は、開始点ポインタの指すデータ項目を中間データに追記し、開始点ポインタを１つ進める
ことを特徴とするプログラム生成システム。
【請求項２】
前記ループ発見プログラムは、さらに
前記最初の部分区間と、同じ長さの後続の部分区間のデータ項目の値を比較して、同じである場合は、前記後続の部分区間の次にさらに同じ長さの部分区間を追加して比較する動作を反復して、ループの繰り返し回数を確定し、
前記中間データにループの繰り返し回数とループ長さを追記する
ことを特徴とする請求項１のプログラム生成システム。
【請求項３】
前記ループ発見プログラムは、さらに
ループとして認識された部分区間のデータ列を処理対象のデータ列として、別の開始点ポインタを割り当て設定し、ループ検出の動作を再度行う
ことを特徴とする請求項２のプログラム生成システム。
【請求項４】
前記再現プログラムは前記中間データのパラメータを変更して再生する再現プログラムである
ことを特徴とする請求項１から３のいずれか１項に記載のプログラム生成システム。
【請求項５】
前記データ列は前記旧システムにおける記録データに、連長圧縮または文字列変換の少なくともいずれかを含む前処理を行ったデータ列であり、
前記中間データに前記前処理の逆変換に相当する後処理を行い、前記再現プログラムを生成する
ことを特徴とする請求項１から４のいずれか１項に記載のプログラム生成システム。
【請求項６】
請求項１から５のいずれか１項に記載のプログラム生成システムにおいて、
前記推論エンジンおよび前記ループ発見プログラムとして動作する
ことを特徴とするコンピュータプログラム。
【請求項７】
請求項６に記載のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体。