(57)【要約】単語の状態を定義している単語単位をベースにするプログラムの数学的な構造モデルを作成する。より具体的には、単語単位のプログラム群間の半順序関係をもとに有向グラフを作成する。この有向グラフをもとに隣接行列を得る。こうして得られた隣接行列に深さ優先探索を基調にするトポロジカル・ソートを行う。その結果できる順序に沿って単語単位のプログラム群を並び替える。これにより、例えば繰返しを回避することができる。
2004068342.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表し、
前記表された有向グラフに対して探索を施し、
前記探索の結果をもとに前記単語単位プログラム群を並び替える
ことを特徴とするソフトウェア開発前処理方法。
【請求項２】
ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、
前記生成された隣接行列に対して探索を施し、
前記探索の結果をもとに前記単語単位プログラム群を並び替える
ことを特徴とするソフトウェア開発前処理方法。
【請求項３】
前記探索はトポロジカル・ソートによることを特徴とする請求の範囲第２項記載のソフトウェア開発前処理方法。
【請求項４】
ソフトウェア開発のユーザ要件中の単語についての有意性規定関係から隣接行列及び状態ベクトルを生成し、
前記隣接行列と前記状態ベクトルとを所定の公理に基づき計算し、
前記計算の結果から、単語の状態を把握する
ことを特徴とするソフトウェア開発前処理方法。
【請求項５】
前記単語単位プログラム相互の順序関係に係る集合が閉じる単位である基本構造が複数ある場合には、１の基本構造の出力の最終値を境界エリアに出力することを特徴とする請求の範囲第１項または第２項記載のソフトウェア開発前処理方法。
【請求項６】
前記単語単位プログラム相互の順序関係に係る集合が閉じる単位である基本構造が複数あって、当該基本構造同士が閉じられたループを形成する場合には、当該ループ中のノード（基本構造）を結合することを特徴とする請求の範囲第１項または第２項記載のソフトウェア開発前処理方法。
【請求項７】
ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表すことを特徴とするソフトウェア制御方法。
【請求項８】
ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係に係る集合が閉じる単位で基本構造単位を構成し、
前記構成された基本構造単位をノードとして捉えた有向グラフで表すことを特徴とするソフトウェア制御方法。
【請求項９】
ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、
前記生成された隣接行列に対して探索を施し該探索の結果をもとに前記単語単位プログラム群を並び替え、
前記並び替えられた前記単語単位プログラム群をＬｙｅｅ方法論に適用してコードを生成する
ことを特徴とするソフトウェア開発方法。
【請求項１０】
ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成する隣接行列計算部と、
前記生成された隣接行列に対して探索を施し該探索の結果をもとに前記単語単位プログラム群を並び替える探索部と、
前記並び替えられた前記単語単位プログラム群をＬｙｅｅ方法論に適用してコードを生成する生成部と
を具備することを特徴とするソフトウェア開発装置。
【発明の詳細な説明】
【技術分野】  本発明は、ソフトウェア開発に係り、特に、数学的考え方にたったソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置に関する。
【背景技術】  一般にプログラムは、次のような３つの部分によって構成される。
（１）領域の宣言、メモリの割り当てとそれに関連した定数及び変数のアドレス
（２）制御の順序を表す文
（３）メモリ割り当て領域に与えられる値を決定するための実行条件文と計算実行文
ソフトウェアが開発されるとき、ユーザは、主に（３）にのみ関係する。他の部分については、システムエンジニア及びプログラマが責任をもつ。人間は、コンピュータそれ自身を制御しているプログラムによって、画面及びキーボードからデータを入力し、ファイル中のデータを読み、またファイルにデータを書きこむ。この部分に使用する装置を動かすプログラムも要件に依存せず、システムエンジニア及びプログラマが責任をもつ。このうち、特に、（２）の部分には要件に依存しない固定の（一定の）構造が存在する。したがって、要件に依存する（３）を決定する（すなわち、定義する）だけで、自動的にプログラムを生成することができる。この構造体はＬｙｅｅ（登録商標）の方法論の上では「プログラムの構造」といわれる（特許文献１乃至６、非特許文献３及び４参照）。
我々は通常、ホーア論理（Ｈｏａｒ  Ｌｏｇｉｃ）やλ計算のような論理的な関係を用いてプログラム構造を表現する（非特許文献１及び２参照）。このスタイルのプログラム構造の表現は、それらのプログラムの行動的構造を理解することの助けになる。これにより、特に宣言型（スタイル）プログラムの場合に、プログラムを理解し、分析することが可能になる。しかしながらこのようなアプローチを通してされた分析は、論理表現の持つ複雑さゆえに、意味論を検証したり、そして／あるいは、意味論を修正したりすることの困難さを顕在化する。
【特許文献１】        国際公開第９７／１６７８４号パンフレット
【特許文献２】        国際公開第９８／１９２３２号パンフレット
【特許文献３】        国際公開第９９／４９３８７号パンフレット
【特許文献４】        国際公開第００／７９３８５号パンフレット
【特許文献５】        国際公開第０２／４２９０４号パンフレット
【特許文献６】        特開２００２−２０２８８３号公報
【非特許文献１】      グリン・ウィンスケル著、「プログラミング言語の公式意味論」、ＭＩＴプレス、１９９３年
【非特許文献２】      ハンネ・リース・ニールソン、フレミング・ニールソン著、「アプリケーションについての意味論  公式紹介」、ジョン・ワイリー・アンド・サンズ、１９９２年
【非特許文献３】      根来  文生著、「Ｌｙｅｅソフトウェアの原理」、２１世紀（ＩＳ２０００）における情報社会についての国際会議会報、日本、会津、２０００年１１月５日−８日、ｐｐ４４１−４４６
【非特許文献４】      根来  文生著、「ソースコード生成についての高密度処理方法」、システミクス、サイバネティクス及びインフォマティクスについての第５回世界多極会議会報、（ＳＣＩ２００１）、米国、オーランド、２００１年７月２２日−２５日
このように、従来の論理的な関係を用いたプログラム構造についての表現は、特に宣言型（スタイル）プログラムの場合に、プログラムを理解し、分析することが可能になる。しかしながらこのようなアプローチを通してされた分析は、論理表現の持つ複雑さゆえに、意味論を検証したり、そして／あるいは、意味論を修正したりすることの困難さを顕在化するものであった。
本発明は、前述のような従来の技術が有していた諸問題点を解決しようとするものであって、当該プログラムが複雑な論理表現を持っていても、意味論を容易に検証し、修正し得る方法論を提供することを目的とするものである。
本発明は、これにより、Ｌｙｅｅ（登録商標）方法論によるソフトウェア開発において、より高効率、高速、高パフォーマンスを実現することを目的とする。
さらに本発明は、上記のような目的を達成できるソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置を提供することを目的とする。
また、本発明は上記と併せて、Ｌｙｅｅ（登録商標）方法論に係るプログラム構造を数学的に表現し、その正当性を示すこと、及び、その順序性のない性質を示すことを目的とする。
【発明の開示】
本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表し、該表された有向グラフに対して探索を施し、該探索の結果をもとに当該単語単位プログラム群を並び替えることを特徴とする。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、該生成された隣接行列に対して探索を施し、該探索の結果をもとに当該単語単位プログラム群を並び替えることを特徴とする。
ここで、「探索」とは、（後述する）トポロジカル・ソート、（Ｔｏｐｏｌｏｇｉｃａｌ  Ｓｏｒｔ）、（後述する）深さ優先探索（Ｄｅｐｔｈ−Ｆｉｒｓｔ  Ｓｅａｒｃｈ）、幅優先探索（Ｂｒｅａｄｔｈ−Ｆｉｒｓｔ  Ｓｅａｒｃｈ）、反復深化法（Ｉｔｅｒａｔｉｖｅ  Ｄｅｅｐｉｎｇ）、発見的探索（Ｈｅｕｒｉｓｔｉｃ  Ｓｅａｒｃｈ）、ヒル・クライミング（Ｈｉｌｌ  Ｃｌｉｍｂｉｎｇ）、最適優先探索（Ｂｅｓｔ−Ｆｉｒｓｔ  Ｓｅａｒｃｈ）、オイラー（Ｅｕｌｅｒ）の一筆書き、ダイクストラ（Ｄｉｊｋｓｔｒａ）法等を含む各種アルゴリズムをいう。
また本発明は、ソフトウェア開発のユーザ要件中の単語についての有意性規定関係から隣接行列及び状態ベクトルを生成し、当該隣接行列と状態ベクトルとを所定の公理に基づき計算し、該計算の結果から、単語の状態を把握することを特徴とする。
さらに本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表すことを特徴とする。
ここで、順序関係としては半順序及び全順序が考えられる。
また、ここで用いる「ソフトウェア」とは広義の意である。即ち、ユーザからの開発要望及び当該要望にあった目的プログラムの双方を包含する概念である。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係に係る集合が閉じる単位で基本構造単位を構成し、該構成された基本構造単位をノードとして捉えた有向グラフで表すことを特徴とする。
さらに本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、該生成された隣接行列に対して探索を施し該探索の結果をもとに当該単語単位プログラム群を並び替え、該並び替えられた当該単語単位プログラム群をＬｙｅｅ方法論に適用してコードを生成することで求めるソフトウェアを得ることを特徴とする。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成する隣接行列計算部と、該生成された隣接行列に対して探索を施し該探索の結果をもとに当該単語単位プログラム群を並び替える探索部と、該並び替えられた当該単語単位プログラム群をＬｙｅｅ方法論に適用してコードを生成する生成部とを具備することを特徴とする。これら各部は総て自動化できるので、結局繰返し処理の排除→ソフトウェア生成まで一貫して自動処理が可能となり、ソフトウェア生産速度、効率は各段に向上する。
ここで、（後述する）「有向グラフ作成部」とは、ソフトウェア開発要望者であるユーザの発する要件に含まれるそれぞれの単語をノードによって表し、入力単語と状態単語とを区別しつつａ≦ｂ（ａからｂが作られることを意味する記号として「≦」を定義する。以下同じ。）という始点と終点の間の半順序関係（または全順序関係）を矢印によって表した有向グラフを作成する機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをＲＯＭ（ＲｅａｄＯｎｌｙＭｅｍｏｒｙ）に書きこんだものであってもよい。
ここで、「入力単語」とは（後述の）数式１におけるｆｉを持っていない最終の終点単語をいい、「状態単語」とは入力単語でない単語をいう。
また、「隣接行列計算部」とは、単語単位のプログラム相互の関係を（後述の）数式１形式で表現し、それを行列の形式で再表現した形態である隣接行列を計算して得る機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをＲＯＭ（ＲｅａｄＯｎｌｙＭｅｍｏｒｙ）に書きこんだものであってもよい。
さらに、「探索部」とは、前述の各種手法を包含するアルゴリズムである探索を一般に実現する機能を有する。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをＲＯＭ（ＲｅａｄＯｎｌｙＭｅｍｏｒｙ）に書きこんだものであってもよい。
また、（後述の）「トポロジカル・ソート部」とは、上記で得られた有向グラフに対して（後述の）深さ優先探索を行い、行きついたところから探索経路を戻るときにノードを取得してゆくことでノード列（数列）を整列する機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをＲＯＭ（ＲｅａｄＯｎｌｙＭｅｍｏｒｙ）に書きこんだものであってもよい。
ここで、「深さ優先探索」とは、
（１）始点であるノードを出発してノード間の連結がとれているノードを訪問が重複しないように進み、
（２）行く場所がなくなったら行く場所のあるノードまで戻り（再帰）、
（３）戻ったノードから再び（１）の要領で進み、
（４）進むところがなくなったら終了する、
というアルゴリズムをいう。
上記で規定される本願に係る発明では、繰返しを回避するので、より高効率、高速、高パフォーマンスを備えたソフトウェア開発を実現することが可能となる。
さらに上記で規定される本発明では、繰返しをなくす前処理を自動で行い、こうして得られた前処理済の単語単位のプログラムをもとにＬｙｅｅ（登録商標）方法論により自動的に目的プログラム生成を行う。つまり、ユーザ要件の洗練化（整列）から目的プログラムの生成に至るまで自動化することが可能となる。これにより、ソフトウェア生産の大幅な効率向上、生産性向上、品質向上等、ソフトウェア産業上に大きな効果をもたらす。
【図面の簡単な説明】  第１図は、状態単語αについての数式１を計算するプログラムの構造を示したフローチャートである。
第２図は、ａ≦ｂ（ａからｂが作られる）という関係をもつ順序を説明するための有向グラフの例である。
第３図は、有向グラフの例である。
第４図は、あるノード１乃至８が形成する特定の半順序関係を表した有向グラフである。
第５図は、トポロジカル・ソートの動作を説明するためのフローチャートである。
第６図は、Ｌｙｅｅ（登録商標）方法論における単語単位の論理要素をノードとした場合にトポロジカル・ソートを用いて繰り返しをなくすための自動制御の動作を説明するためのフローチャートである。
第７図は、本発明をソフトウェア開発装置として実現する場合の機能構成を示したブロック図である。
発明の概要
本発明は、「有向グラフ」技術から生まれる、従来とは別のアプローチを用いることで上記の従来技術上の問題点を解決するものである。
以下、図面を参照しながら、本願の発明の具体的な実施形態について説明する。
第Ｉ章で、本発明の前提となる、本発明が改良を施す対象であるＬｙｅｅ（登録商標）方法論によるソフトウェア構造（単語単位のプログラム構造）と、Ｌｙｅｅ（登録商標）の特徴的な概念である「状態」の概念について概略を述べる。第ＩＩ章では、単語単位のプログラムを数学的構造モデルによって説明する。第ＩＩＩ章で、本発明の具体的な実施形態であるトポロジカルソートについて述べる。
Ｉ．単語単位のプログラムとは何か
（Ｉ−１）単語単位のプログラムとは
Ｌｙｅｅ（登録商標）方法論によるソフトウェアは、単語単位のプログラムを基本にして構成されている。単語単位のプログラミングでは、要件は単語の集合によって表され、単語は宣言文を使って定義される。単語単位のプログラムは、２種類の主なコンポーネントで構成されている。１つのコンポーネントは単語のコンポーネントである。単語単位のプログラミングでは、要件は、単語の名前、単語の計算式の定義、単語の計算式の条件、単語の属性（入出力、データタイプ、その他の属性）を含んだ単語の集合とし、代入文ではなく宣言文の形式で定義される。
たとえば、Ｓｗが単語ｗを定義する宣言文であるとすると、その要件の例は表１のようになる。
2004068342.tif 000003
もう１つのコンポーネントは制御プログラムのコンポーネントである。制御プログラムは、それ以上実行を繰返しても、いかなる単語の値も変化しない状態になるまで、単純に単語単位プログラムの実行の繰り返しを行う。単語ａの定義は単語ｂを使用しており、単語ｂは単語ａの後に与えられているが、ユーザはこれらの定義が実行される順序（制御ロジック）を指定する必要がない。一方、手続き型プログラミングの場合は当然ながら、宣言型プログラムミングの一種であるロジカルプログラミングの場合でも、プログラムの一行の実行順序は実行結果に影響を与える。
表１の例を使って、この処理の動きを説明する。
最初に、単語ａが実行される。単語ｄ、ｂ、ｃはまだ実行されておらず、従って単語ａは値を決定することができない。次に、入力単語ｃが実行される。単語ｃは実行条件がないので、値が決定される。例えば、単語ｃの値が＋３だとすると、単語ｂは、実行条件ｃ＞０が真となるので、定義２×ｃ＋５が実行可能になり、単語ｂの値は＋１１と計算され、値の出力が可能となる。単語ｄは入力単語であり、実行条件がないので、ｄ＝真である。これですべての単語が処理されたが、単語ａの値は未決定のままである。結果として、プログラムは最初に戻って再び処理を実行する。
２回目の実行時、ｄ＝真、単語ｂと単語ｃはそれぞれ値が＋１１と＋３に決定しているので、単語ａは値＋１４を得て、その値が適切な装置に出力される。単語ｃ、ｂとｄの値は前に計算されているので、これらの単語の値のすべては決定済みである。従って、２回目の実行で、４つの単語の総ての値が決定したことになる。
次に、「状態」概念について説明する。単語のデータタイプは、コンピュータ上で扱い可能な、数、ブール（ｂｏｏｌｅａｎ）、文字、その他である。論理的順序を制御するためには、それぞれの単語に存在する「状態」の概念の導入が必要となる。実際、単語の状態とは、複数の状態：すなわち、真、偽、そして未決定のいずれか１つとなる。それぞれの意味は次の通りである。
真：値が決定され、かつユーザ要件を満たす。
偽：値が決定されるが、それはユーザ要件を満たさない。
未決定（又は空）：値が決定されていない。
単語の最初の状態は常に未決定で、それは単語の値がまだ転送（ｍｏｖｅ）されていないか、あるいは計算されていなかったことを意味している。名前によって定義された単語を終点単語、そして、別の単語を定義するために、計算条件や計算式に使われている単語群を始点単語と呼ぶ。要件中の総ての単語が１回実行されることを一巡処理と呼ぶ。
単語の値が決定され、その状態が真となるのは、その単語の始点単語の状態がすべて真となったときである。始点単語として使われていない単語の状態は、終点単語の状態に関与しない。一巡処理が繰り返されることを、繰返し処理（又は、繰返しプロセス）と呼ぶ。単語の状態に変化がなくなるまで繰り返し処理を続けることにより、単語を出力に用いることが可能となる。各単語の状態は、真、偽になるか、あるいは未決定のまま残るか、のいずれかである。もし未決定の単語があるなら、そのシステムに入力単語が存在するかどうか、閉じたループがあるかどうかをチェックする必要がある。
閉じたループは、単語が直接的または間接的に自身で自身を定義しているか、要件が完全でないことを意味する。実行条件は排他的でなければならず、また否定は明示的に定義されていなくてはならない。すなわち、条件の総和が重なりのない全体を構成（言い換えれば、条件の総和が１となり、１以上でも１以下でもない）しなければならない。
このように、単語単位のプログラミングは、ソフトウェアの制御ロジック部分を自動的に生成する。
（Ｉ−２）個々の単語のプログラム構造
図１は、前述した単語単位のプログラムの構造を示したフローチャートである。同図をもとにプログラムの構造及び動作について説明する。図１のαは、単語名を示す。
（１）ボックス１
まず、ｓｔａｔｅｍｅｎｔ（宣言文）を遂行するべきかどうか判断する。もし単語αの状態が空でないなら、以下を実行せず終了し（３０１）、空ならボックス２へ進む。
（２）ボックス２
もし始点単語の状態が総て真であるときは、単語の定義式（計算式）を遂行して、その結果を一時的な領域に記憶する。従って、一時的な領域が必要となる。始点のいずれかが真以外の場合は、定義式を遂行しない。
（３）ボックス３
定義式を実行した、または不実行の結果、単語αに有意な（ユーザ要件に適合する）値が決定されたかどうかを判断する。総ての始点単語が真であるとき、単語の値は決定される。しかし、たとえ総ての始点単語が真であるとしても、ユーザの要求条件によっては単語の値は偽とされるかもしれない。単語に有意な値が決定されるときはボックス４へ、単語に値が決定されない、又は決定された値が偽とされるときはボックス５へ移行する。
（４）ボックス４
決定された単語αの値がユーザの要求条件に適合するときには、通常領域に結果を記録する。従って、通常領域が必要となる。この場合には、単語αの状態は真である（３０３）。
（５）ボックス５
ボックス３で単語の値が未決定、又は決定された値が偽とされた場合はここに至る。ボックス５では、単語がこのうちどちらであるかを判断する。単語の値がユーザ要求条件によって偽となるか、あるいは始点の値が偽の場合は、単語の状態は偽である。単語の状態が偽となる場合はボックス６へ、単語の値が偽でない場合はボックス７へ移行する。
（６）ボックス６
値が偽であることを示すフラグをセットする。このようなフラグは偽のプロセスとしてすべての単語に必要である。または、状態が偽であることを意味する値を通常領域に記憶する。このとき単語の状態は偽となる（３０５）。
（７）ボックス７
繰り返し処理を実行するかどうかを判断するために再帰（繰返し）カウンタに１を加える。従って、再帰カウンタが必要となる（非特許文献３参照）。このとき単語の状態は空となる（３０７）。
（Ｉ−３）全体のシステムを制御するプログラムとその構造
システム全体を制御するプログラムがパレット連鎖関数と呼ばれる（非特許文献３参照）。適切に繰り返し処理をする制御プログラムはこのプログラムの中に入れられる。図１で説明したように、もし１つの始点単語の状態が偽であるなら、終点単語の状態が確実に偽になる。たとえ始点単語のすべての状態が真であるとしても、ユーザ要求条件について偽があるときには、終点単語の状態が偽になる。したがって、繰り返しがなされるかどうかを判断するためには、ただ空（未決定）の始点単語が定義式に含まれるか否かを判断すればよい。
もし空の始点単語が１つでもあれば、繰り返し処理は実行される。しかしながら、有向グラフによってそれを表現するならば、閉じられたループが含まれるときには、終点単語の状態が空から変化しない。また、このシステムが始点単語を持っていないとき、終点単語は空から変化しない。そのために、このような場合には、繰り返しプロセスは終了せず永久のループに入る。このような状況を回避するために、プログラムのすべての単語Ｌ（α）を制御するパレット連鎖関数のプログラム（Φ）にある再帰カウンタを制御するために用いられるプログラムコードがある。
単語が空になるたびに、それぞれの単語のプログラムが再帰カウンタに１を加える。一連の繰り返しプロセスを終了する条件として、この再帰カウンタの値が前回の繰り返し処理での値と同じであるということを用いる。この状態を「状態変化はない」という。
ロジカルプログラミングでは、特に非手続き型プログラミング言語の一種である標準的なプロログ（Ｐｒｏｌｏｇ：非手続き型プログラミング言語）では、バックトラック（再実行）が永久ループに陥る。他の改良型プロログは、待機（ｗａｉｔ）やフリーズを使って永久ループを回避する。単語単位のプログラムでは、前述のメカニズムを使ってこのようなループを回避する。
Ｌｙｅｅ（登録商標）方法論で用いるパレット連鎖関数プログラム（Φ）の例を以下に示す。「Ｃｒｔの値は状態が未決定（空）である単語Ｌ（α）の数である」をループの変数プロパティとするというプロパティを用いる、ことによって、このプログラムはホア（Ｈｏａｒｅ）の理論で証明することができる。下記の例はｘ、ｙ及びｚの３つの単語がある場合である。
［Φのプログラムコード］
ＰＣｔｒ＝１    ／＊ＰＣｔｒ＝前回の繰り返し処理の再起カウンタ＊／
Ｃｔｒ＝０      ／＊Ｃｔｒ＝再起カウンタ＊／
Ｗｈｉｌｅ  ＰＣｔｒ≠Ｃｔｒ  ｄｏ
ＰＣｔｒ＝Ｃｔｒ
Ｃｔｒ＝０
Ｌ（ｘ）      ／＊各単語プログラムは状態と繰り返しの制御を行う
以下のような関数（機能）を持っている；
もし始点単語が空なら、単語Ｌ（α）の状態は未決
定でＣｔｒ＝Ｃｔｒ＋１
そうでないなら、単語Ｌ（α）の状態は決定済＊／
Ｌ（ｙ）
Ｌ（ｚ）
Ｅｎｄ
／＊Ｃｔｒの値は状態が未決定である単語Ｌ（α）の数＊／
このプログラムは以下の意味になる：
１）プログラムが終了する。
２）終了したとき、変数Ｃｔｒの値は、状態が未決定である単語Ｌ（α）の数である。
プログラムが停止したとき、単語の定義式に従って、このシステム中に始点単語を持つ単語Ｌ（α）の状態は、通常の場合真か偽が割り当てられる。単語αの状態は、次のような場合は、未決定（空）である：
１）単語αが閉じたループの中か、閉じたループの後にある場合。
２）単語αが排他的条件を持っていない場合。
排他的とは、もし「（（ｘ＞ｙ）ｏｒ（ｘ＜ｙ））」が常に真であり、かつ、「（（ｘ＞ｙａｎｄ（ｘ＜ｙ））」が常に偽であれば、ｘとｙは排他的である、として定義される。
３）単語αの始点単語が同じシステムにない場合。
ＩＩ．単語単位のプログラムの数学的考察
単語単位のプログラムのプログラム構造はホアの定理によって証明できる。しかしながら、そのようなホアの定理のアプローチを通しての分析では、その論理表現のスタイルの複雑性のために、単語単位プログラムの意味論を検証し、改良を加えることが困難である。そこで、有向グラフ技術に起源したもう１つのアプローチである隣接行列を用いて、単語単位プログラムによるプログラム構造を数学的構造モデル化し、本発明を説明する。この章では、まず単語単位のプログラムによるプログラム構造を、数学的構造モデルによって表し、その特徴を述べる。すなわち、有向グラフモデルと隣接行列モデルである。
１．
Ｌｙｅｅ要件の仕様をより形式的に扱うと、関数ｘを、１、２、…ｎの点における定数とその他の点のｘの値によって定義した方程式のシステムに表すことができる。
2004068342.tif 000004
数式１は、単語がｎ個あるシステムにおける、ｉ番目の単語ｘの定義式を表す関数である。ｘ（ｉ）は終点単語であるｉ番目の単語ｘを表す。ｆｉ（ｘ（１），ｘ（２），…，ｘ（ｎ））は、終点単語ｘ（ｉ）の定義式を表す関数で、定義式がシステム内の１からｎ番目の単語のいずれかによって構成されていることを示す。
数式１のＬｙｅｅ（登録商標）仕様は次のように書き直すことができる：
2004068342.tif 000005
さらに簡易な形式では、
ｘ＝Ｆ（ｘ）
（ＩＩ−１）本発明の原理：有向グラフ（ｄｉｒｅｃｔｅｄ  ｇｒａｐｈ）とその隣接行列
始点単語と終点単語の関係は、有向グラフによって表すことができる。有向グラフでは、各単語はノードによって、単語間の関係は矢印によって表される。矢印の出発点となるノードが始点単語、終着点となるノードが終点単語を表す。さらに、それはａ≦ｂ（単語ａから単語ｂが作られる）という関係をもつ順序を定義する。
図２は、ａ≦ｂ（ａからｂが作られる）という関係（ｆ）をもつ順序を説明するための有向グラフの例を示した図である。
同図に示すように、単語はａ≦ｂという関係を持つ半順序づけられた集合（セット）を構成する。即ち、同図の有向グラフは単語ａ及び単語ｂという要素及びこれらの要素間を関係付ける半順序関係（矢印）を構成要素とする集合とみることができる。
有向グラフは隣接行列によって表現することができる。ｎ個の単語の関係を表す隣接行列は、ｎ個×ｎ個のマトリックスで表され、これを隣接行列Ｆと呼ぶ。この隣接行列において、行見出しと列見出しには、それぞれｎ個の単語名が置かれる。行の見出しとなるときｎ個の単語はそれぞれ終点単語であり、列の見出しとなるときｎ個の単語はそれぞれ始点単語である。
ｉ番目の単語の式（つまり、数式１によれば、単語ｘ（ｉ）を生成するプログラムｆｉ（ｘ（ｉ）））が、始点単語としてｘｊを使うとき、隣接行列のｉ行目と始点単語ｘｊ列の交点を表す隣接行列Ｆの要素ｆｉｊ（ｉ＝１，．．．，ｎ；ｊ＝１，．．．，ｎ）は１である。そうでないなら、０である。終点単語ｘｉを生成する式において、始点単語ｘｊが使用されているか否かを１か０で表すのである。（※「ｆｉｊ（ｉ＝１，．．．，ｎ；ｊ＝１，．．．，ｎ）」は、単語ｘ（ｉ）を生成するプログラムｆｉ（ｘ（ｉ））を構成する単語のうちの単語ｘ（ｊ）を指し、このときはｉは１からｎ、ｊは１からｎのいずれかである、ことを示している。）
各単語が数式１の形式で、下記の数式３のように定義される例１の単語の関係を、有向グラフ、隣接行列の２つの形態で表して具体的に説明する。
（例１）
入力単語（ｆｉ（ｘ（ｉ））を持っていない最終の終点単語）をｘ１及びｘ２と置き、状態単語（入力単語でない単語、すなわちプログラムによって値を生成する単語）をｘ３、ｘ４、ｘ５、ｘ６及びｘ７と置く。これらの関係を数式１の形式で表すと下記の数式３のようになる。
2004068342.tif 000006
図３は、上記の例１の状態を表した有向グラフの例である。
即ち、同図に示す例においては、ｘ１及びｘ２はｆｉ（ｘ（ｉ））を持っていない入力単語である。よって、いずれの矢印の終着点にもなっていない。ｘ３はｘ４及びｘ５から生成される。よって、ｘ３はｘ４及びｘ５から出発する矢印の終着点になっている。同様に、ｘ４はｘ２及びｘ５から、ｘ５はｘ１から、ｘ６はｘ３及びｘ７から、ｘ７はｘ４及びｘ６から生成されることを表すように矢印が出発点と終着点が表されている。つまり、数式３で規定される状態と図３の有向グラフで表される状態とは等価である。
このとき例１の隣接行列は数式４のように表現される。
2004068342.tif 000007
先に述べたように、隣接行列Ｆの行見出しは終点単語であり、列見出しは始点単語である。各行または列がどの終点単語または始点単語を示すかをわかりやすくし、説明を簡便にするために、隣接行列には見出しを付した。
数式４の隣接行列Ｆを各行について展開して説明する。第１行目の終点単語ｘ１の行は、いずれの始点単語列との交点も０になっており、終点単語ｘ１は始点を持たないこと（すなわち入力単語であること）が示されている。終点単語ｘ２についても同様である。第３行目の終点単語ｘ３の行は始点単語ｘ４とｘ５の列との交点が１、その他の始点単語列との交点が０になっており、終点単語ｘ３はｘ４とｘ５を始点単語として持つことが示されている。以下、終点単語ｘ４から終点単語ｘ７の終点単語についても、同様に、どの単語を始点単語として持つか（あるいは持たないか）が示されている。
数式４の隣接行列の各行は、以下のような数式でも表すことができる。左辺が行見出しとなる終点単語、右辺は、交点の値が１となった列見出しの始点単語を表す。右辺の「０」は、いずれの交点の交点の値も「０」であることを表す。
ｘ１＝０
ｘ２＝０
ｘ３＝ｘ４＋ｘ５
ｘ４＝ｘ２＋ｘ５
ｘ５＝ｘ１
ｘ６＝ｘ３＋ｘ７
ｘ７＝ｘ４＋ｘ６
ここで、「＋」は、後述するように、通常の四則演算における「加える」の意味でなく、本明細書中の単語の関係を表す数式においては、左辺の状態単語（終点単語）を決める半順序集合の始点単語が複数あるときにこれらを付加して左辺の単語を規定することを示す演算子（以下、「付加演算子」と呼ぶ）として用いている。
以上より、したがって、数式３で定義される単語の関係は、図３の有向グラフで表される関係及び数式４の隣接行列による数学的表現で記述される関係と等価であるということがいえる。
（ＩＩ−２）隣接行列Ｆと状態ベクトルＸで表す終点単語のための状態モデル
前述の（ＩＩ−１）項では、ｎ個の単語の「終点単語の他の単語との関係」を表すためのモデルとして、有向グラフと隣接行列を考察した。次に、ｎ個の単語の「終点単語の値の状態」を表すためのモデルについて述べる。まず、ｎ個の単語の始点単語としての状態を縦列のベクトルＸに記録する（ベクトルとは１つの列あるいは行しか持たないマトリックスである）。数式４の隣接行列に表された単語の例で説明すると、始点単語が表示される順序、ｘ１からｘ７の順序に各始点単語の状態を表したベクトルＸは、たとえば下記の数式５のように表すことができる。各行がどの始点単語を示すかをわかりやすくし、説明を簡便にするために、ベクトルには見出しを付した。
2004068342.tif 000008
このとき、ベクトルＸは、始点単語ｘ１とｘ２の状態は「＋１」、始点単語ｘ３の状態は「−１」、ｘ４からｘ７の始点単語の状態は「ｎｕｌｌ」であることを示している。
単語を生成し得る値の状態は次のように３種類に設定される。
＋１：値は真であるとして決定済みである。
−１：値）は偽であるとして決定済みである。
空（ｎｕｌｌ）：値は未決定である。
入力単語の初期値は以下の通りである。
１：値は真であるとして決定済みである。
（適切に入力されている状態）
−１：値は偽であるとして決定済みである。
（適切に入力されていない状態）
従って、たとえ数式１が実行されるとしても、状態は変化しない。
状態単語の初期値は空である：
空：値はまだ決定済みでない。
（移動していない、あるいはまだ計算されていない状態）
状態単語について考察するに、単語の関係を表す隣接行列Ｆの上に単語の状態を表す状態ベクトルＸを作用させるということは当該単語の順序で数式１を横列で実行することである。順番にｎ個の式を使う処理は順序処理と呼ばれる。その始点単語のすべての状態が＋１であるとき、状態単語の状態が＋１（真）になり、状態単語の値は決定済みとなる。
始点単語ではない単語の状態はその式の終点単語の状態とは関係していない。順序処理が繰り返されることは繰り返し処理と呼ばれる。たとえそれが繰り返されるとしても、「真」であるとして決定が済んでいない単語は、偽の状態（−１）になるか、あるいは空のままである。上記のことが「有向グラフ」で表現されると以下のようになる。
（１）もしノードが閉じられたループに含まれなかったなら、そして、もしいずれかの始点単語に係るノードから次々に始点単語を探索した際に当該始点単語の値が偽であるなら、ノード（単語）の値は決定されない。もし単語の値がユーザの必要条件を満たさなかったならノードの値は決定されない。たとえ値が成功裏に計算されるとしても、ノード（単語）の値が偽と決定される。
（２）もしノードが閉じられたループに含まれなかったなら、そして、もしすべての始点単語が、そのノードから次々に始点単語を探索したとき真であるなら、ノードの値は真として決定される。
（３）ノードが閉じられたループに含まれるときであって、ノードの始点単語がシステムに存在しないとき、ノード（単語）の値は空のまま残る。
（例２）
例１の場合、図３において、ｘ３、ｘ４、ｘ５、ｘ６及びｘ７の状態は、この場合における終端の始点単語であるｘ１及びｘ２の状態に依存する。同図から明らかなように、終端の始点単語であるｘ１が真になるとき、ｘ５は真である。終端の始点単語であるｘ１及びｘ２が真であるとき、ｘ４及びｘ５が真になる。ｘ６及びｘ７はループにあるので空のままである。
（ＩＩ−３）隣接行列Ｆと状態ベクトルＸの計算操作
ｎ個の単語の状態はベクトルＸ（列１つからなる行列）に、単語の順序に従って記録される。隣接行列Ｆと状態ベクトルＸを用いて繰り返し処理を実行して計算した状態と同じ状態を表すように、算術演算子が定義される。言い換えれば、ＦとＸの乗算は以下のようになる。
2004068342.tif 000009
ｍ回目の隣接行列Ｆと状態ベクトルＸの積である、状態ベクトルＸｍの要素ｘｍ，ｉ（ｍ回目の繰り返し処理後の単語ｘｉ）は以下のような式で表せる。
2004068342.tif 000010
乗算演算子（・）の左側のｆＩｊには、隣接行列Ｆのｉ行目の終点単語においてｊ列の始点単語Ｘｊが使われているか否かを表す指数１か０（始点単語となる場合が１、始点単語とならない場合が０）が与えられる。乗算演算子（・）の右側のｘｍ，ｉには、ｍ回目の繰返し処理中のベクトルＸのｉ行目に表された始点単語ｘｉの状態を示す３種類の指数＋１（真）、−１（偽）、ｎｕｌｌ（ここでｎｕｌｌは空を意味する）が与えられる。
数式４の隣接行列Ｆと数式５のベクトルＸを例にして、終点単語ｘ３の３回目の繰返し処理を数式７で表すと以下のようになる。
2004068342.tif 000011
数式４のｙ３行と始点単語ｘ１列との交点は「０」、数式５で示されたｘ１の状態を表す列の第１行は「＋１」、よって、ｆ３，１・ｘ３，１は「０・（＋１）」となっている。数式４のｙ３行と始点単語列との交点総てについて、その指数と数式５に示された対応する状態指数を乗算演算子で結び、付加演算を用いて列記していくと上記の式となる。
ここで、乗算演算子（・）の演算結果を次のように定義する。
（公理１）
2004068342.tif 000012
数式８の公理は以下のことを示している。始点単語指数が０であれば、始点単語の状態が何であれ、始点単語の状態は真（＋１）となり、終点単語の状態に影響を与えない。始点単語指数が１の場合は、始点単語の状態はそのまま変化せず、始点単語の状態が終点単語の状態に営業を与える。
次に、付加演算子（＋）の演算結果を次のように定義する。付加演算子に用いる値は、公理１の演算結果である。
（公理２）
2004068342.tif 000013
上記の公理２は、さらに右辺によって類別してみると、
2004068342.tif 000014
数式９乃至１０から明らかなように、付加演算子（＋）の意味については、例えばもし、左辺に（−１）が１個でもあれば右辺は（−１）となる。もし左辺に（−１）がなく、かつ空（ｎｕｌｌ）が１個でもあれば、右辺は空である。もし左辺のすべてが（＋１）であるなら、右辺の状態は、終点である右辺の値がユーザ要件を満たす場合は（＋１）、ユーザ要件を満たさない場合は（−１）である。
公理１及び２を使うことによって、次の定理が証明される。
（定理１）
終点単語の状態が（＋１）（真）になるのは、始点単語の総ての状態が（＋１）（真）であり、かつ終点単語の値がユーザ要件を満たす場合である＜公理２第１群＞。
（証明）
もし単語の状態が（＋１）（真）であるなら、それは公理１によって、その単語が始点単語として用いられるとき、１・（＋１）＝（＋１）であるから始点単語は（＋１）（真）になる。その単語が始点単語として用いられない場合については、それは０・＊＝（＋１）（＊は３つの状態のいずれかを表す）であるから、単語の状態がいずれであっても、公理２に用いる始点は（＋１）（真）となる。付加演算が実行された結果が（＋１）（真）になるのは、公理２によって、定理１の場合以外には考えられない。
（定理２）
終点単語の状態が（−１）（偽）になるのは、始点単語の状態が１つでも（−１）であるときか、あるいはすべての始点単語が（＋１）（真）であってかつ終点単語の値がユーザ要件を満たさない場合である＜公理２第２群＞。
（証明）
もしいずれかの始点単語として用いられる単語の状態が（−１）であるなら、公理１によって１・（−１）＝（−１）であるから、始点単語の状態は（−１）（偽）になる。そのために、結果が公理２によって（−１）（偽）になる。すべての始点単語が（＋１）（真）であるときは、定理１及び＜公理２第２群＞によって、（−１）（偽）になると証明される。
（定理３）
終点単語の状態が（未決定である）空になるのは、１個以上の始点単語の状態が空であり、かつ始点単語の残りの状態が（＋１）（真）である場合である＜公理２第３群＞。
（証明）
もし１個以上の始点単語の状態が空であって、残りの始点単語の総てが（＋１）（真）あるなら、公理２によって終点単語の状態は空になる。
一巡処理はＸｍ＝ＦＸｍ−１によって表せる。繰り返し処理が継続されると以下のようになる。
2004068342.tif 000015
Ｆｍは通常のマトリックスの積として定義される。Ｆｍの要素（ｉ，ｊ）はマイナスでない整数である。
終点単語の状態は一巡処理を繰り返す繰り返し処理によって空から（＋１）または（−１）に変化する。その状態については、たとえ（＋１）（真）のものと（−１）（偽）のものとが繰り返しプロセスを実行するとしても、終点の状態は変化しない。有向グラフによって表現した際、グラフに閉じられたループが存在し、終点が閉じられたループ内にあるとき、あるいは、このシステムが始点を持っていないとき、何度もそれを繰り返すとしても、終点単語の状態は空のままである。「状態に変化がない（すなわち、固定点ｆｉｘｅｄ  ｐｏｉｎｔに達した）」ことはＸｍ＋１＝Ｘｍで表わされ、数式６を用いると、次のようになる。
Ｆｍ＋１Ｘ０＝ＦｍＸ０
この時
Ｆ：    隣接行列
Ｘ：    状態ベクトル（単語の状態を列で示す）
Ｘ０：  初期状態、すなわち全ての要素がｎｕｌｌ
ｍ：    繰り返しの数
この方程式が有効なとき、プログラムは停止する。
ＩＩＩ．不要な繰り返しを回避する方法（実行順序の並び替え）
（ＩＩＩ−１）隣接行列の性質
（ＩＩ−２）で、数学的構造モデルが確立された。ユーザ要件のすべての特性が隣接行列のみで示される。したがって、この隣接行列の特性を調べるのは非常に重要であって、有用である。
隣接行列Ｆの特性を利用して、不要な反復を避けるための方法を示す。どんなプログラム（アルゴリズム）も、再帰的な方法のみを用いて説明することができる。手続的には、再帰はｗｈｉｌｅループ（繰り返しの終了条件をｗｈｉｌｅで指定したループ）によって実現される。
数式６を使用して、「いかなる状態変化もない」（すなわち、「定点に達する」）という状態は、以下のように示される：
2004068342.tif 000016
この公式が有効になるとき、プログラムは止まることになる。
このとき、行列Ｆには、どんな特性があるか？行列Ｆｍの特性は何であるか？これらの疑問に答えるために、定理４を導入することが必要である。
空でない有限集合Ｖの組Ｇ＝（Ｖ、Ｅ）とＶ×Ｖの部分集合Ｅは有向グラフと呼ばれる。Ｖの要素は頂点もしくはポイント（点）と呼ばれ、Ｅの要素（ｕ，ｖ）は縁もしくは矢と呼ばれる。Ｇのポイントの有限系列Ｐ、Ｐ＝＜ｖ１，ｖ２，．．．，ｖｎ＞はｖ０からｖ１に至るパスと呼ばれ、各ｉ（１≦Ｉ≦ｎ）について、（ｖｉ−Ｉ，ｖｉ）∈Ｅが成り立つときには、ｎはこのパスの長さと呼ばれる。ｖ０はＰの始点、ｖｎは終点と呼ばれる。＜ｖ０＞は長さゼロのパスである。パスは隣接している矢の方向と共にＧのポイントを追従する道筋である。
（定理４）
有向グラフＶの隣接行列をＡと定義する。Ａｎの（ｉ、ｊ）要素は、互いに異なるＧのｖｉからｖｊまでの長さｎのパスの数である。
ｍ＝１、ｍ＝２、…と連続して計算しＦｍ＋１Ｘ０＝ＦｍＸ０が成立するときにはプログラムが停止する。ＦとＦｍのプロパティを検証する。Ｘ０の全要素が常にヌル（空）なので、Ｆはシステムの全プロパティを表す。
１）Ｆｍ＝０である場合  （ｍ≦ｎ）
Ｆｍのすべての要素が０である。定理４を用いれば、閉鎖ループがこの隣接行列の有向グラフに存在しないことが証明される。変数ｍはその有向グラフの最も長いパスの長さを表す。Ｆの固有値はすべて０である。零べき行列（Ｆｍ＝０）のプロパティから、対角に要素０を持つ下三角形のマトリクスＦに再配列することができる。即ち、
Ｆ’＝Ｐ−１ＦＰ、ここでＰは正方行列もしくは長方形行列。
理由は、Ｆ（ＦｍＸ０）＝ＦｍＸ０，Ｆｍ＋１Ｘ０＝ＦｍＸ０
が有効であるからである。Ｘｍのすべての要素は（＋１）か（−１）である。
２）Ｆｍ≠０である場合  （ｍ≦ｎ）
もし、閉じたループがこの隣接行列の有向グラフに存在した場合、対角の要素ｆｉｉ（ｒ）：ｉ＝１，…，ｎ  ｏｆ  Ｆｒに１つ以上の整数が現れることが、定理４を使って証明される。このとき、変数ｒは最も短い閉じたループである。Ｆの固有値は、総てが０ではない。言い換えれば、固有値の１つは０と等しくない。総てのＸ０値が空（ｎｕｌｌ）なので、Ｆｍ＋１Ｘ０＝ＦｍＸ０は有効である。変数ｍは、その有向グラフのループの前の最も長いパスの長さを表す。Ｘｍの例では、Ｘｍ＝ｔ［（＋１），（＋１），（ｎｕｌｌ），（ｎｕｌｌ），（ｎｕｌｌ），（ｎｕｌｌ）］。
もし、閉じたループが有向グラフに存在しなければ、その隣接行列は零冪行列（Ｆｍ＝０）となる。この特性は重要である。
（ＩＩＩ−２）繰り返しプロセスを不必要にする単語の並べ方
「有向グラフ」で表現する際に、前述の第ＩＩＩ章１項で示したように、閉じられたループ内で始点単語・終点単語である関係がないときには、隣接行列が下三角行列になり、対角の三角形が０になるような一巡処理順序に単語を並べることによって、繰り返しプロセスを避けることができる。
分析的に規則正しい行列Ｐを得るのは困難である。Ｆ’＝Ｐ−１ＦＰを用いる代わりに、トポロジカル・ソートを用いる。半順序関係が与えられているとき、最初にするべき仕事から終わりにするべき仕事まで、データを一列に並べることをトポロジカル・ソート（ｔｏｐｏｌｏｇｉｃａｌ  ｓｏｒｔ）と呼ぶ。半順序関係（ｐａｒｔｉａｌ  ｏｒｄｅｒ）であるから、答えが常に唯一的に決定されるわけではない。
有向グラフに深さ優先探索（ｄｅｐｔｈ  ｆｉｒｓｔ  ｓｅａｒｃｈ：縦型検索ともいう）をしつつ、戻るときにノードを拾い上げるという方法によって、トポロジカル・ソートを実行することができる。各ノードからこれを行い結果を逆順にならべる。順序処理（一巡処理）における単語を並べるには、この方法によって単語を並べさえすればよい。
図４は、あるノード１乃至８が形成する特定の順序関係を表した有向グラフである。
即ち、同図に示す例においては、先に定義した始点単語と終点単語との関係を用いて次のように規定できる。
ノード２≦ノード１
ノード１≦ノード３
ノード３≦ノード４、ノード５≦ノード４
ノード２≦ノード５
ノード５≦ノード６
ノード３≦ノード７、ノード６≦ノード７、ノード８≦ノード７
ノード６≦ノード８
（例４）
図４に示される有向グラフの隣接行列は次の数式１３の通りである。
2004068342.tif 000017
図４の有向グラフでは閉じられたループ内で始点単語・終点単語の関係がない。そこで、この半順序関係に係る隣接行列が下三角行列になるように、トポロジカル・ソートを行う。具体的には次のように行う。
（１）有向グラフに対する深さ優先探索を実行する。即ち、一例として、ノード１を始点とすると、ノード１を出発して連結されている未訪問のノードを半順序関係を守って探索（即ち、連結される未訪問のノードまで進み、行き場所がなくなったら、行ける場所があるノードまで戻って（再帰）再び進めるだけ進み、行き場所がなくなったら終了（再帰からリターン）：これを「再帰的に進む」ともいう）する。これにより、ノード１→ノード３→ノード４（＊）→ノード３→ノード７（＊）→ノード３（＊）→ノード１（＊）を得る。但し、（＊）は再帰の時点を示す。
（２）次に、始点をノード２に移し、上記と同様の探索を行う。すでに訪問したところは進まない。これにより、ノード２→ノード５→ノード６→ノード８（＊）→ノード６（＊）→ノード５（＊）→ノード２（＊）を得る。
（３）その他のノードを始点として探索をするところ、すでに全ノードを訪問済みなので探索は終了する。
（４）戻る（再帰の）ときのノードを拾い上げる。具体的には、（１）（２）で（＊）の時点のノードを拾い上げる。上の例では、ノード４（＊）→ノード７（＊）→ノード３（＊）→ノード１（＊）→ノード８（＊）→ノード６（＊）→ノード５（＊）→ノード２（＊）を得る。
（５）順序処理（一巡処理）における単語を逆順に並べる。即ち、（４）で拾い上げたノードの列を逆に並べたものを一つの解として得る。上の例では、ノード２→ノード５→ノード６→ノード８→ノード１→ノード３→ノード７→ノード４が求める一つの解である。
以上より、トポロジカル・ソートの結果は（１，２，３，４，５，６，７，８）→（２，５，６，８，１，３，７，４）である。（「ノード」の表記は省略する。）
このトポロジカル・ソートの具体的な方法についてフローチャートを用いて説明すると次のようになる。図５はトポロジカル・ソートの動作を説明するためのフローチャートである。
まず、初期値を、ａ＝１，Ｉ＝１と設定する（ステップ５０１）。
次に、ａ＝ａ＋１とし、始点をノードａに設定する（ステップ５０２）。
ここから探索を開始する。具体的には、訪問可能な連結されているノードで未訪問のところがないかを判定する（ステップ５０３）。これについては、例えば、各ノードに訪問フラグを設定、初期値に０（未訪問を示す）を入れておき、当該ノードが訪問されたときには訪問フラグを１にするなどの方法により自動判定させることができる。
ここで未訪問ノードが存在するときには、１ノード進み（ステップ５０４）、ステップ５０３に戻る。
未訪問ノードが存在しないときには、１ノード戻り（再帰）、Ｉ＝Ｉ＋１とする（ステップ５０５）。このとき、再帰に係るノードを再帰ノード列Ｉ番目の要素として退避する（ステップ５０６）。
次に、再帰の結果ノードａに戻ったかを判定し（ステップ５０７）、まだ戻っていなければステップ５０３に戻る。ノードａに戻った場合には始点をノードａとする探索は終了する。即ち、再帰からリターンし、Ｉ＝Ｉ＋１とし（ステップ５０８）、再帰点を先の再帰ノード列Ｉ番目の要素として退避する（ステップ５０９）。
ここで全ノードが探索済みかどうかをチェックする（ステップ５１０）。まだ探索を行っていないノードが存在する場合には、始点を替えて再度探索を始めるため、ステップ５０２に戻る。全ノードの探索が終了しているときには、探索は終了し、退避してあった再帰ノード列を逆順に並べる（ステップ５１１）ことで、並び替えの１候補を得て、一連のトポロジカル・ソートの動作を終了する（ステップ５１２）。
このように、トポロジカル・ソートのアルゴリズム自体を上記で説明したフローチャートに沿ってプログラム化すれば、トポロジカル・ソートの自動プログラムを得ることができる。
さて、上記によりＦをトポロジカル・ソートした。その結果、Ｆ’（トポロジカル・ソートされたＦ）は次の数式１４のようになる。
2004068342.tif 000018
トポロジカル・ソートの結果、一巡処理の順序は、「１，２，３，４，５，６，７，８」から「２，５，６，８，１，３，７，４」となった。
このようにＦ’が得られるが、このＦ’はその形から明らかなように上三角形に当たる総ての項が０である下三角行列になっている。この（ソート済み隣接行列である）Ｆ’は（上三角形部分には０しかないため）その構造上、あるノード（終点単語）を求めるための始点単語は当該ノードより（ソート済み隣接行列における）上の行のノードにしかない。従って、Ｆ’の行の上位から順番に値を求めていけば、Ｆで同じことを行う場合に比べて、繰り返しや遡りを行うことなくスムーズに総てのノードについて値が求まる。
さて、次に、上記で説明したトポロジカル・ソートをＬｙｅｅ（登録商標）方法論において応用する方法の一つを説明する。
図６は、Ｌｙｅｅ（登録商標）方法論における単語単位の論理要素をノードとして上記のトポロジカル・ソートを用いて繰り返しをなくすための自動制御の動作を説明するためのフローチャートである。
同図に示すように、まず、単語ごとの論理要素（これらをノードと考える）間の関係を規定する（ステップ６０１）。
このためには例えば有向グラフの作成（ステップ６０２）を行っても良いが、これに限定されるものではない。
次に、ノードについての（上記説明した）隣接行列を定義する（ステップ６０３）。
この隣接行列に対して上述のトポロジカル・ソートを実行する（ステップ６０４）。トポロジカル・ソートの詳しいアルゴリズムについては図５及び対応する説明で詳述したので、ここでは割愛する。また、ここでは探索技法の一例としてトポロジカル・ソートとして説明したが、このステップ６０４では前述の他の探索の実行を行っても良いのはもとよりである。
最後に、トポロジカル・ソートの結果得られた１解に基づき、当該単語単位の論理要素（ノード）を並び替え（ステップ６０５）、当該動作を終了する（ステップ６０６）。
なお、隣接行列定義のステップ（ステップ６０３）については、本稿では理解の容易さを助けるために入れたが、本質的には必須のステップではない。つまり、隣接行列を定義することなく、単語ごとの論理要素間関係の規定（ステップ６０１）から、直接に、或いは有向グラフ作成（ステップ６０２）を介して、トポロジカル・ソート等の探索のステップ（ステップ６０４）に至ることも本発明の思想の範囲内であり、本発明の目的とするところを実現し得る。
このように、Ｌｙｅｅ（登録商標）のソフトウェア生成自動プログラムにかける前の段階で、Ｌｙｅｅ（登録商標）方法論によるユーザ要件から抽出した単語ごとの論理要素に対してトポロジカル・ソートをかけることで繰返しの省かれたＬｙｅｅ（登録商標）方法論によるソフトウェア生成が可能となる。
換言すれば、上記のノードをＬｙｅｅ（登録商標）方法論における単語ごとの論理要素と考えれば、上記の方法でＦ’を求めることで、ある単語について値を求める（有意性を決定する）に当たって、何回も繰り返し処理を行うことなく１回のＲＵＮのみで目的を達することが可能となる。
さらに、上記のようなトポロジカル・ソートのアルゴリズムは、上記の説明から明らかなように、それ自体をソフトウェアとしてプログラミングして自動化することが可能である。
従って、Ｌｙｅｅ（登録商標）方法論によるソフトウェア自動生成方法についてそれをさらに効率化・高品質化するのにも自動化を図れることになる。
なお、上記の説明においては、有向グラフに表される単語の順序関係として主として半順序関係を持つ場合について説明したが、半順序関係のみならず、全順序関係について、或いは全順序関係及び半順序関係が混在する場合についても上記の説明が該当することはもとよりである。
また上記の説明においては、理解のしやすさの観点から、有向グラフの作成を行った後に隣接行列を作成する点を説明したが、有向グラフの作成を介さずに、単語単位のプログラム相互の関係から直接隣接行列を作成するようにしても本発明は実現できる。
すべての単語で作るべきプログラムの構造と当該プログラムを制御するのに用いるパレット連鎖関数のプログラムの構造は、上記の記述で明確になった。そして、それらが数学上適切に動くことが証明された。
ＩＶ．むすび
以上詳細に説明したように、本発明では、単語の状態を定義している単語単位をベースにするプログラムの数学的な構造モデルを作成し、それをＬｙｅｅ（登録商標）方法論によるソフトウェア開発に適用することで、より高効率、高速、高パフォーマンスの開発を実現した。
単語の状態は完全な半順序を構成する。それは単語の最小要素（極小点）として  空を持っている。有向グラフとその隣接行列とを使って、この構造モデルは数学的な面からも正しいといえる。
さらに、本発明ではパレットの一般的な考えと基本構造の正当性を考察した。それらは実務上、プログラムを作るために必要である。また、順次読込（ｓｅｑｕｅｎｔｉａｌ  ｒｅａｄ）のようなアルゴリズム、合計値算出を実現するための構造について説明した。これらの一般的な考えはＬｙｅｅ（登録商標）のシステム開発方法論で使われる。それは多くの産業的な応用分野ですでに実用的に有効とされた多くの結果をもたらしている。
人間であるユーザと、外の装置とのインタフェース及びコミュニケーションについても論じられている。これは、このようなシステムのタイプのために、単語単位をベースとするプログラムとして設計する（モデリング）ことの、実際の作業を正当化する。
以上を要するに、本発明によれば、数学的な考え方、手法、解析法をＬｙｅｅ（登録商標）のソフトウェア開発論、開発技術に適用・応用するので、ソフトウェア開発をより効率良く、高速に、精密に実現することができる。
本発明は当該技術分野における通常の知識を有する者にとって修正および改変が容易に数多くなし得るので、図示および記述されたものと寸分違わぬ構成および動作に本発明を限定することは望ましくないことであり、従って、あらゆる適切な改変体および等価体は本発明の範囲に含まれるものと見なされうる。前述の本発明に係る実施の具体的形態の説明および例示によって詳細に記述されたが、本願の特許請求の範囲のみならず本発明に係る開示事項全体に定義された本発明の範囲から逸脱することなしに、修正、置換、および、変更が数多く可能である。
また、本願に係る発明は、その適用において、上記の記述において説明されるか、或いは、図面に示された要素の詳細な解釈及び組み合わせに限定されるものではない。本発明は、他の実施形態が可能であり、種々の方法で実用および実施可能である。また、ここで用いられた語法および用語は記述を目的とするものであり、限定的に働くものとみなされてはならない。
従って、当該技術分野における通常の知識を有する者は、本開示の基調となる概念は、本発明の幾つかの目的を実施するための他の構造、方法、及び、システムを設計するための基礎として容易に利用され得ることを理解するはずである。従って、本発明の趣旨および範囲から逸脱しない限り、本願の特許請求の範囲にはそのような等価な解釈が含まれるものと見なされるものである。
上記の詳細な説明では、有向グラフ表記、隣接行列算出、トポロジカル・ソート、並び替えという順序で本発明の思想を実現する方法について述べた。しかしこれらはどれも絶対不可欠な要素というものではなく、例えば、有向グラフ表記の表記を経ないで直接隣接行列算出→トポロジカル・ソート→並び替えという順序で本発明の思想を実現してもよい。
さらに、有向グラフに対して、例えば幅優先探索（Ｂｒｅａｄｔｈ−Ｆｉｒｓｔ  Ｓｅａｒｃｈ）、反復深化法（Ｉｔｅｒａｔｉｖｅ  Ｄｅｅｐｉｎｇ）、発見的探索（Ｈｅｕｒｉｓｔｉｃ  Ｓｅａｒｃｈ）、ヒル・クライミング（Ｈｉｌｌ  Ｃｌｉｍｂｉｎｇ）、最適優先探索（Ｂｅｓｔ−Ｆｉｒｓｔ  Ｓｅａｒｃｈ）、オイラー（Ｅｕｌｅｒ）の一筆書き、ダイクストラ（Ｄｉｊｋｓｔｒａ）法等の各種探索技法を組み合わせることで並び替えてもよい。
或いは、隣接行列算出のあとを、これらの各種探索技法を組み合わせることで本発明の根本思想を実現してもよい。
また、本発明に係る技術思想は、例えばコンピュータソフトウェアの自動開発装置、自動開発プログラム、自動開発プログラムを記録した記録媒体、伝送媒体、紙媒体としても、また、自動開発プログラムを登載したコンピュータ・装置、自動開発プログラムを実行するクライアント・サーバ形式等といったカテゴリーにおいても実現、利用可能であることはいうまでもない。
図７は、本発明をソフトウェア開発装置として実現する場合の機能構成を示したブロック図である。即ち、同図に示す一例においては、ソフトウェア開発装置１０００として、次の要素を備えさせる。
制御部１０１０は全体の制御及びＬｙｅｅ（登録商標）方法論に基づいたソフトウェア開発を自動的に行う機能を有する。即ち、後述する（有向グラフ作成部１０５０、）隣接行列計算部１０６０及びトポロジカルソート部１０７０により並び替えられた単語単位プログラム群をＬｙｅｅ方法論に自動的に適用して生成コードを得る機能を有している。
情報入力部１０２０は（図示しない）画面等を通じて、Ｌｙｅｅ（登録商標）に係るユーザ要件を初めとする人間の意思をコンピュータに入力するインターフェースとしての機能を果たす。情報取得部／通信部１０３０は外部との通信や（ソフトウェア開発装置１０００にある場合の）データベース１０４０、１０４１等との情報の授受を行う。なお、この例ではデータベース１０４０、１０４１はソフトウェア開発装置１０００内に持っていてもよいことはもとよりである。
有向グラフ作成部１０５０は、制御部１０１０の制御に基づき、上記で説明したように、Ｌｙｅｅ（登録商標）に係るユーザ要件から半順序関係を割り出し、それを有向グラフとして作成する機能を有する。隣接行列計算部１０６０は、制御部１０１０の制御に基づき、有向グラフ作成部１０５０で作成された有向グラフについて、上記で説明したような隣接行列を計算・作成する。トポロジカルソート部１０７０は、制御部１０１０の制御に基づき、隣接行列計算部１０６０で計算・作成された隣接行列に対して、上記で説明したようなトポロジカルソートを実行する機能を有する。
なお、上記トポロジカルソート部１０７０は探索を行う機能を持つ一例であって、上述のように、他の探索手法を実現する機能を有する探索部（一般）としても本発明の思想は実現される。
このように構成することにより、これら各部（１０１０〜１０７０、従って１０００）は総て自動化できるので、結局繰返し処理の排除→ソフトウェア生成まで一貫して自動処理が可能となり、ソフトウェア生産速度、効率は各段に向上する。
このように、各機能を、それを実現するようにプログラムとして組んだソフトウェアとして、或いはそのようなソフトウェアを例えばＲＯＭ（ＲｅａｄＯｎｌｙＭｅｍｏｒｙ）に書きこみ、かかるＲＯＭを組み込んだ全体システム（装置）とすることで、前述した本発明に係る各要素をソフトウェアとして、或いはそのようなソフトウェアが組み込まれたソフトウェア開発装置として実現している。
さらに本発明は、単一プロセッサ、単一ハードディスクドライブ、及び、単一ローカルメモリを備えたコンピュータシステムに限らず、当該システムのオプションとして、任意の複数または組み合わせプロセッサ又は記憶デバイスを装備するにも適している。コンピュータシステムは、精巧な計算器、掌タイプコンピュータ、ラップトップ／ノートブックコンピュータ、ミニコンピュータ、メインフレームコンピュータ、及び、スーパーコンピュータ、ならびに、これらの処理システムネットワーク組合わせを含む。本発明の原理に従って作動する任意の適切な処理システムによって代替されうるし、また、これらと組合せて用いることも可能である。
また、本発明に係る技術思想は、もとよりあらゆる種類のプログラミング言語に対応可能である。さらに本発明に係る技術思想は、あらゆる種類・機能のアプリケーションソフトウェアに対しても適用可能である。
またさらに本願発明は、その技術思想の同一及び等価に及ぶ範囲において様々な変形、追加、置換、拡大、縮小等を許容するものである。また、本願発明を用いて生産されるソフトウェアが、その２次的生産品に登載されて商品化された場合であっても、本願発明の価値は何ら減ずるものではない。
以上、詳細に説明したように、本発明によれば、Ｌｙｅｅ（登録商標）方法論によるソフトウェア開発において、より高効率、高速、高パフォーマンスを実現することができる。
【産業上の利用可能性】  本発明では、繰返しをなくす前処理を自動で行い、こうして得られた前処理済の単語単位のプログラムをもとにＬｙｅｅ（登録商標）方法論により自動的に目的プログラム生成を行うことで、ソフトウェア生産の大幅な効率向上、生産性向上、品質向上等、ソフトウェア産業上に大きな効果をもたらす。
【図１】
2004068342.tif 000019
【図２】
2004068342.tif 000020
【図３】
2004068342.tif 000021
【図４】
2004068342.tif 000022
【図５】
2004068342.tif 000023
【図６】
2004068342.tif 000024
【図７】
2004068342.tif 000025
【国際調査報告】
2004068342.tif 000026
2004068342.tif 000027
2004068342.tif 000028
2004068342.tif 000029
2004068342.tif 000030