JPWO2004068342A1 - ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置 - Google Patents
ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置 Download PDFInfo
- Publication number
- JPWO2004068342A1 JPWO2004068342A1 JP2004567562A JP2004567562A JPWO2004068342A1 JP WO2004068342 A1 JPWO2004068342 A1 JP WO2004068342A1 JP 2004567562 A JP2004567562 A JP 2004567562A JP 2004567562 A JP2004567562 A JP 2004567562A JP WO2004068342 A1 JPWO2004068342 A1 JP WO2004068342A1
- Authority
- JP
- Japan
- Prior art keywords
- word
- software development
- adjacency matrix
- search
- node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
単語の状態を定義している単語単位をベースにするプログラムの数学的な構造モデルを作成する。より具体的には、単語単位のプログラム群間の半順序関係をもとに有向グラフを作成する。この有向グラフをもとに隣接行列を得る。こうして得られた隣接行列に深さ優先探索を基調にするトポロジカル・ソートを行う。その結果できる順序に沿って単語単位のプログラム群を並び替える。これにより、例えば繰返しを回避することができる。
Description
本発明は、ソフトウェア開発に係り、特に、数学的考え方にたったソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置に関する。
一般にプログラムは、次のような3つの部分によって構成される。
(1)領域の宣言、メモリの割り当てとそれに関連した定数及び変数のアドレス
(2)制御の順序を表す文
(3)メモリ割り当て領域に与えられる値を決定するための実行条件文と計算実行文
ソフトウェアが開発されるとき、ユーザは、主に(3)にのみ関係する。他の部分については、システムエンジニア及びプログラマが責任をもつ。人間は、コンピュータそれ自身を制御しているプログラムによって、画面及びキーボードからデータを入力し、ファイル中のデータを読み、またファイルにデータを書きこむ。この部分に使用する装置を動かすプログラムも要件に依存せず、システムエンジニア及びプログラマが責任をもつ。このうち、特に、(2)の部分には要件に依存しない固定の(一定の)構造が存在する。したがって、要件に依存する(3)を決定する(すなわち、定義する)だけで、自動的にプログラムを生成することができる。この構造体はLyee(登録商標)の方法論の上では「プログラムの構造」といわれる(特許文献1乃至6、非特許文献3及び4参照)。
我々は通常、ホーア論理(Hoar Logic)やλ計算のような論理的な関係を用いてプログラム構造を表現する(非特許文献1及び2参照)。このスタイルのプログラム構造の表現は、それらのプログラムの行動的構造を理解することの助けになる。これにより、特に宣言型(スタイル)プログラムの場合に、プログラムを理解し、分析することが可能になる。しかしながらこのようなアプローチを通してされた分析は、論理表現の持つ複雑さゆえに、意味論を検証したり、そして/あるいは、意味論を修正したりすることの困難さを顕在化する。
国際公開第97/16784号パンフレット 国際公開第98/19232号パンフレット 国際公開第99/49387号パンフレット 国際公開第00/79385号パンフレット 国際公開第02/42904号パンフレット 特開2002−202883号公報 グリン・ウィンスケル著、「プログラミング言語の公式意味論」、MITプレス、1993年 ハンネ・リース・ニールソン、フレミング・ニールソン著、「アプリケーションについての意味論 公式紹介」、ジョン・ワイリー・アンド・サンズ、1992年 根来 文生著、「Lyeeソフトウェアの原理」、21世紀(IS2000)における情報社会についての国際会議会報、日本、会津、2000年11月5日−8日、pp441−446 根来 文生著、「ソースコード生成についての高密度処理方法」、システミクス、サイバネティクス及びインフォマティクスについての第5回世界多極会議会報、(SCI2001)、米国、オーランド、2001年7月22日−25日
(1)領域の宣言、メモリの割り当てとそれに関連した定数及び変数のアドレス
(2)制御の順序を表す文
(3)メモリ割り当て領域に与えられる値を決定するための実行条件文と計算実行文
ソフトウェアが開発されるとき、ユーザは、主に(3)にのみ関係する。他の部分については、システムエンジニア及びプログラマが責任をもつ。人間は、コンピュータそれ自身を制御しているプログラムによって、画面及びキーボードからデータを入力し、ファイル中のデータを読み、またファイルにデータを書きこむ。この部分に使用する装置を動かすプログラムも要件に依存せず、システムエンジニア及びプログラマが責任をもつ。このうち、特に、(2)の部分には要件に依存しない固定の(一定の)構造が存在する。したがって、要件に依存する(3)を決定する(すなわち、定義する)だけで、自動的にプログラムを生成することができる。この構造体はLyee(登録商標)の方法論の上では「プログラムの構造」といわれる(特許文献1乃至6、非特許文献3及び4参照)。
我々は通常、ホーア論理(Hoar Logic)やλ計算のような論理的な関係を用いてプログラム構造を表現する(非特許文献1及び2参照)。このスタイルのプログラム構造の表現は、それらのプログラムの行動的構造を理解することの助けになる。これにより、特に宣言型(スタイル)プログラムの場合に、プログラムを理解し、分析することが可能になる。しかしながらこのようなアプローチを通してされた分析は、論理表現の持つ複雑さゆえに、意味論を検証したり、そして/あるいは、意味論を修正したりすることの困難さを顕在化する。
このように、従来の論理的な関係を用いたプログラム構造についての表現は、特に宣言型(スタイル)プログラムの場合に、プログラムを理解し、分析することが可能になる。しかしながらこのようなアプローチを通してされた分析は、論理表現の持つ複雑さゆえに、意味論を検証したり、そして/あるいは、意味論を修正したりすることの困難さを顕在化するものであった。
本発明は、前述のような従来の技術が有していた諸問題点を解決しようとするものであって、当該プログラムが複雑な論理表現を持っていても、意味論を容易に検証し、修正し得る方法論を提供することを目的とするものである。
本発明は、これにより、Lyee(登録商標)方法論によるソフトウェア開発において、より高効率、高速、高パフォーマンスを実現することを目的とする。
さらに本発明は、上記のような目的を達成できるソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置を提供することを目的とする。
また、本発明は上記と併せて、Lyee(登録商標)方法論に係るプログラム構造を数学的に表現し、その正当性を示すこと、及び、その順序性のない性質を示すことを目的とする。
本発明は、前述のような従来の技術が有していた諸問題点を解決しようとするものであって、当該プログラムが複雑な論理表現を持っていても、意味論を容易に検証し、修正し得る方法論を提供することを目的とするものである。
本発明は、これにより、Lyee(登録商標)方法論によるソフトウェア開発において、より高効率、高速、高パフォーマンスを実現することを目的とする。
さらに本発明は、上記のような目的を達成できるソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置を提供することを目的とする。
また、本発明は上記と併せて、Lyee(登録商標)方法論に係るプログラム構造を数学的に表現し、その正当性を示すこと、及び、その順序性のない性質を示すことを目的とする。
本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表し、該表された有向グラフに対して探索を施し、該探索の結果をもとに当該単語単位プログラム群を並び替えることを特徴とする。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、該生成された隣接行列に対して探索を施し、該探索の結果をもとに当該単語単位プログラム群を並び替えることを特徴とする。
ここで、「探索」とは、(後述する)トポロジカル・ソート、(Topological Sort)、(後述する)深さ優先探索(Depth−First Search)、幅優先探索(Breadth−First Search)、反復深化法(Iterative Deeping)、発見的探索(Heuristic Search)、ヒル・クライミング(Hill Climbing)、最適優先探索(Best−First Search)、オイラー(Euler)の一筆書き、ダイクストラ(Dijkstra)法等を含む各種アルゴリズムをいう。
また本発明は、ソフトウェア開発のユーザ要件中の単語についての有意性規定関係から隣接行列及び状態ベクトルを生成し、当該隣接行列と状態ベクトルとを所定の公理に基づき計算し、該計算の結果から、単語の状態を把握することを特徴とする。
さらに本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表すことを特徴とする。
ここで、順序関係としては半順序及び全順序が考えられる。
また、ここで用いる「ソフトウェア」とは広義の意である。即ち、ユーザからの開発要望及び当該要望にあった目的プログラムの双方を包含する概念である。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係に係る集合が閉じる単位で基本構造単位を構成し、該構成された基本構造単位をノードとして捉えた有向グラフで表すことを特徴とする。
さらに本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、該生成された隣接行列に対して探索を施し該探索の結果をもとに当該単語単位プログラム群を並び替え、該並び替えられた当該単語単位プログラム群をLyee方法論に適用してコードを生成することで求めるソフトウェアを得ることを特徴とする。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成する隣接行列計算部と、該生成された隣接行列に対して探索を施し該探索の結果をもとに当該単語単位プログラム群を並び替える探索部と、該並び替えられた当該単語単位プログラム群をLyee方法論に適用してコードを生成する生成部とを具備することを特徴とする。これら各部は総て自動化できるので、結局繰返し処理の排除→ソフトウェア生成まで一貫して自動処理が可能となり、ソフトウェア生産速度、効率は各段に向上する。
ここで、(後述する)「有向グラフ作成部」とは、ソフトウェア開発要望者であるユーザの発する要件に含まれるそれぞれの単語をノードによって表し、入力単語と状態単語とを区別しつつa≦b(aからbが作られることを意味する記号として「≦」を定義する。以下同じ。)という始点と終点の間の半順序関係(または全順序関係)を矢印によって表した有向グラフを作成する機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
ここで、「入力単語」とは(後述の)数式1におけるfiを持っていない最終の終点単語をいい、「状態単語」とは入力単語でない単語をいう。
また、「隣接行列計算部」とは、単語単位のプログラム相互の関係を(後述の)数式1形式で表現し、それを行列の形式で再表現した形態である隣接行列を計算して得る機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
さらに、「探索部」とは、前述の各種手法を包含するアルゴリズムである探索を一般に実現する機能を有する。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
また、(後述の)「トポロジカル・ソート部」とは、上記で得られた有向グラフに対して(後述の)深さ優先探索を行い、行きついたところから探索経路を戻るときにノードを取得してゆくことでノード列(数列)を整列する機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
ここで、「深さ優先探索」とは、
(1)始点であるノードを出発してノード間の連結がとれているノードを訪問が重複しないように進み、
(2)行く場所がなくなったら行く場所のあるノードまで戻り(再帰)、
(3)戻ったノードから再び(1)の要領で進み、
(4)進むところがなくなったら終了する、
というアルゴリズムをいう。
上記で規定される本願に係る発明では、繰返しを回避するので、より高効率、高速、高パフォーマンスを備えたソフトウェア開発を実現することが可能となる。
さらに上記で規定される本発明では、繰返しをなくす前処理を自動で行い、こうして得られた前処理済の単語単位のプログラムをもとにLyee(登録商標)方法論により自動的に目的プログラム生成を行う。つまり、ユーザ要件の洗練化(整列)から目的プログラムの生成に至るまで自動化することが可能となる。これにより、ソフトウェア生産の大幅な効率向上、生産性向上、品質向上等、ソフトウェア産業上に大きな効果をもたらす。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、該生成された隣接行列に対して探索を施し、該探索の結果をもとに当該単語単位プログラム群を並び替えることを特徴とする。
ここで、「探索」とは、(後述する)トポロジカル・ソート、(Topological Sort)、(後述する)深さ優先探索(Depth−First Search)、幅優先探索(Breadth−First Search)、反復深化法(Iterative Deeping)、発見的探索(Heuristic Search)、ヒル・クライミング(Hill Climbing)、最適優先探索(Best−First Search)、オイラー(Euler)の一筆書き、ダイクストラ(Dijkstra)法等を含む各種アルゴリズムをいう。
また本発明は、ソフトウェア開発のユーザ要件中の単語についての有意性規定関係から隣接行列及び状態ベクトルを生成し、当該隣接行列と状態ベクトルとを所定の公理に基づき計算し、該計算の結果から、単語の状態を把握することを特徴とする。
さらに本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表すことを特徴とする。
ここで、順序関係としては半順序及び全順序が考えられる。
また、ここで用いる「ソフトウェア」とは広義の意である。即ち、ユーザからの開発要望及び当該要望にあった目的プログラムの双方を包含する概念である。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係に係る集合が閉じる単位で基本構造単位を構成し、該構成された基本構造単位をノードとして捉えた有向グラフで表すことを特徴とする。
さらに本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、該生成された隣接行列に対して探索を施し該探索の結果をもとに当該単語単位プログラム群を並び替え、該並び替えられた当該単語単位プログラム群をLyee方法論に適用してコードを生成することで求めるソフトウェアを得ることを特徴とする。
また本発明は、ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成する隣接行列計算部と、該生成された隣接行列に対して探索を施し該探索の結果をもとに当該単語単位プログラム群を並び替える探索部と、該並び替えられた当該単語単位プログラム群をLyee方法論に適用してコードを生成する生成部とを具備することを特徴とする。これら各部は総て自動化できるので、結局繰返し処理の排除→ソフトウェア生成まで一貫して自動処理が可能となり、ソフトウェア生産速度、効率は各段に向上する。
ここで、(後述する)「有向グラフ作成部」とは、ソフトウェア開発要望者であるユーザの発する要件に含まれるそれぞれの単語をノードによって表し、入力単語と状態単語とを区別しつつa≦b(aからbが作られることを意味する記号として「≦」を定義する。以下同じ。)という始点と終点の間の半順序関係(または全順序関係)を矢印によって表した有向グラフを作成する機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
ここで、「入力単語」とは(後述の)数式1におけるfiを持っていない最終の終点単語をいい、「状態単語」とは入力単語でない単語をいう。
また、「隣接行列計算部」とは、単語単位のプログラム相互の関係を(後述の)数式1形式で表現し、それを行列の形式で再表現した形態である隣接行列を計算して得る機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
さらに、「探索部」とは、前述の各種手法を包含するアルゴリズムである探索を一般に実現する機能を有する。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
また、(後述の)「トポロジカル・ソート部」とは、上記で得られた有向グラフに対して(後述の)深さ優先探索を行い、行きついたところから探索経路を戻るときにノードを取得してゆくことでノード列(数列)を整列する機能を実現する単位をいう。例えば、こうした機能をプログラム化したソフトウェアとしてもよいし、或いは当該ソフトウェアをコード化したものをROM(ReadOnlyMemory)に書きこんだものであってもよい。
ここで、「深さ優先探索」とは、
(1)始点であるノードを出発してノード間の連結がとれているノードを訪問が重複しないように進み、
(2)行く場所がなくなったら行く場所のあるノードまで戻り(再帰)、
(3)戻ったノードから再び(1)の要領で進み、
(4)進むところがなくなったら終了する、
というアルゴリズムをいう。
上記で規定される本願に係る発明では、繰返しを回避するので、より高効率、高速、高パフォーマンスを備えたソフトウェア開発を実現することが可能となる。
さらに上記で規定される本発明では、繰返しをなくす前処理を自動で行い、こうして得られた前処理済の単語単位のプログラムをもとにLyee(登録商標)方法論により自動的に目的プログラム生成を行う。つまり、ユーザ要件の洗練化(整列)から目的プログラムの生成に至るまで自動化することが可能となる。これにより、ソフトウェア生産の大幅な効率向上、生産性向上、品質向上等、ソフトウェア産業上に大きな効果をもたらす。
第1図は、状態単語αについての数式1を計算するプログラムの構造を示したフローチャートである。
第2図は、a≦b(aからbが作られる)という関係をもつ順序を説明するための有向グラフの例である。
第3図は、有向グラフの例である。
第4図は、あるノード1乃至8が形成する特定の半順序関係を表した有向グラフである。
第5図は、トポロジカル・ソートの動作を説明するためのフローチャートである。
第6図は、Lyee(登録商標)方法論における単語単位の論理要素をノードとした場合にトポロジカル・ソートを用いて繰り返しをなくすための自動制御の動作を説明するためのフローチャートである。
第7図は、本発明をソフトウェア開発装置として実現する場合の機能構成を示したブロック図である。
発明の概要
本発明は、「有向グラフ」技術から生まれる、従来とは別のアプローチを用いることで上記の従来技術上の問題点を解決するものである。
以下、図面を参照しながら、本願の発明の具体的な実施形態について説明する。
第I章で、本発明の前提となる、本発明が改良を施す対象であるLyee(登録商標)方法論によるソフトウェア構造(単語単位のプログラム構造)と、Lyee(登録商標)の特徴的な概念である「状態」の概念について概略を述べる。第II章では、単語単位のプログラムを数学的構造モデルによって説明する。第III章で、本発明の具体的な実施形態であるトポロジカルソートについて述べる。
I.単語単位のプログラムとは何か
(I−1)単語単位のプログラムとは
Lyee(登録商標)方法論によるソフトウェアは、単語単位のプログラムを基本にして構成されている。単語単位のプログラミングでは、要件は単語の集合によって表され、単語は宣言文を使って定義される。単語単位のプログラムは、2種類の主なコンポーネントで構成されている。1つのコンポーネントは単語のコンポーネントである。単語単位のプログラミングでは、要件は、単語の名前、単語の計算式の定義、単語の計算式の条件、単語の属性(入出力、データタイプ、その他の属性)を含んだ単語の集合とし、代入文ではなく宣言文の形式で定義される。
たとえば、Swが単語wを定義する宣言文であるとすると、その要件の例は表1のようになる。
もう1つのコンポーネントは制御プログラムのコンポーネントである。制御プログラムは、それ以上実行を繰返しても、いかなる単語の値も変化しない状態になるまで、単純に単語単位プログラムの実行の繰り返しを行う。単語aの定義は単語bを使用しており、単語bは単語aの後に与えられているが、ユーザはこれらの定義が実行される順序(制御ロジック)を指定する必要がない。一方、手続き型プログラミングの場合は当然ながら、宣言型プログラムミングの一種であるロジカルプログラミングの場合でも、プログラムの一行の実行順序は実行結果に影響を与える。
表1の例を使って、この処理の動きを説明する。
最初に、単語aが実行される。単語d、b、cはまだ実行されておらず、従って単語aは値を決定することができない。次に、入力単語cが実行される。単語cは実行条件がないので、値が決定される。例えば、単語cの値が+3だとすると、単語bは、実行条件c>0が真となるので、定義2×c+5が実行可能になり、単語bの値は+11と計算され、値の出力が可能となる。単語dは入力単語であり、実行条件がないので、d=真である。これですべての単語が処理されたが、単語aの値は未決定のままである。結果として、プログラムは最初に戻って再び処理を実行する。
2回目の実行時、d=真、単語bと単語cはそれぞれ値が+11と+3に決定しているので、単語aは値+14を得て、その値が適切な装置に出力される。単語c、bとdの値は前に計算されているので、これらの単語の値のすべては決定済みである。従って、2回目の実行で、4つの単語の総ての値が決定したことになる。
次に、「状態」概念について説明する。単語のデータタイプは、コンピュータ上で扱い可能な、数、ブール(boolean)、文字、その他である。論理的順序を制御するためには、それぞれの単語に存在する「状態」の概念の導入が必要となる。実際、単語の状態とは、複数の状態:すなわち、真、偽、そして未決定のいずれか1つとなる。それぞれの意味は次の通りである。
真:値が決定され、かつユーザ要件を満たす。
偽:値が決定されるが、それはユーザ要件を満たさない。
未決定(又は空):値が決定されていない。
単語の最初の状態は常に未決定で、それは単語の値がまだ転送(move)されていないか、あるいは計算されていなかったことを意味している。名前によって定義された単語を終点単語、そして、別の単語を定義するために、計算条件や計算式に使われている単語群を始点単語と呼ぶ。要件中の総ての単語が1回実行されることを一巡処理と呼ぶ。
単語の値が決定され、その状態が真となるのは、その単語の始点単語の状態がすべて真となったときである。始点単語として使われていない単語の状態は、終点単語の状態に関与しない。一巡処理が繰り返されることを、繰返し処理(又は、繰返しプロセス)と呼ぶ。単語の状態に変化がなくなるまで繰り返し処理を続けることにより、単語を出力に用いることが可能となる。各単語の状態は、真、偽になるか、あるいは未決定のまま残るか、のいずれかである。もし未決定の単語があるなら、そのシステムに入力単語が存在するかどうか、閉じたループがあるかどうかをチェックする必要がある。
閉じたループは、単語が直接的または間接的に自身で自身を定義しているか、要件が完全でないことを意味する。実行条件は排他的でなければならず、また否定は明示的に定義されていなくてはならない。すなわち、条件の総和が重なりのない全体を構成(言い換えれば、条件の総和が1となり、1以上でも1以下でもない)しなければならない。
このように、単語単位のプログラミングは、ソフトウェアの制御ロジック部分を自動的に生成する。
(I−2)個々の単語のプログラム構造
図1は、前述した単語単位のプログラムの構造を示したフローチャートである。同図をもとにプログラムの構造及び動作について説明する。図1のαは、単語名を示す。
(1)ボックス1
まず、statement(宣言文)を遂行するべきかどうか判断する。もし単語αの状態が空でないなら、以下を実行せず終了し(301)、空ならボックス2へ進む。
(2)ボックス2
もし始点単語の状態が総て真であるときは、単語の定義式(計算式)を遂行して、その結果を一時的な領域に記憶する。従って、一時的な領域が必要となる。始点のいずれかが真以外の場合は、定義式を遂行しない。
(3)ボックス3
定義式を実行した、または不実行の結果、単語αに有意な(ユーザ要件に適合する)値が決定されたかどうかを判断する。総ての始点単語が真であるとき、単語の値は決定される。しかし、たとえ総ての始点単語が真であるとしても、ユーザの要求条件によっては単語の値は偽とされるかもしれない。単語に有意な値が決定されるときはボックス4へ、単語に値が決定されない、又は決定された値が偽とされるときはボックス5へ移行する。
(4)ボックス4
決定された単語αの値がユーザの要求条件に適合するときには、通常領域に結果を記録する。従って、通常領域が必要となる。この場合には、単語αの状態は真である(303)。
(5)ボックス5
ボックス3で単語の値が未決定、又は決定された値が偽とされた場合はここに至る。ボックス5では、単語がこのうちどちらであるかを判断する。単語の値がユーザ要求条件によって偽となるか、あるいは始点の値が偽の場合は、単語の状態は偽である。単語の状態が偽となる場合はボックス6へ、単語の値が偽でない場合はボックス7へ移行する。
(6)ボックス6
値が偽であることを示すフラグをセットする。このようなフラグは偽のプロセスとしてすべての単語に必要である。または、状態が偽であることを意味する値を通常領域に記憶する。このとき単語の状態は偽となる(305)。
(7)ボックス7
繰り返し処理を実行するかどうかを判断するために再帰(繰返し)カウンタに1を加える。従って、再帰カウンタが必要となる(非特許文献3参照)。このとき単語の状態は空となる(307)。
(I−3)全体のシステムを制御するプログラムとその構造
システム全体を制御するプログラムがパレット連鎖関数と呼ばれる(非特許文献3参照)。適切に繰り返し処理をする制御プログラムはこのプログラムの中に入れられる。図1で説明したように、もし1つの始点単語の状態が偽であるなら、終点単語の状態が確実に偽になる。たとえ始点単語のすべての状態が真であるとしても、ユーザ要求条件について偽があるときには、終点単語の状態が偽になる。したがって、繰り返しがなされるかどうかを判断するためには、ただ空(未決定)の始点単語が定義式に含まれるか否かを判断すればよい。
もし空の始点単語が1つでもあれば、繰り返し処理は実行される。しかしながら、有向グラフによってそれを表現するならば、閉じられたループが含まれるときには、終点単語の状態が空から変化しない。また、このシステムが始点単語を持っていないとき、終点単語は空から変化しない。そのために、このような場合には、繰り返しプロセスは終了せず永久のループに入る。このような状況を回避するために、プログラムのすべての単語L(α)を制御するパレット連鎖関数のプログラム(Φ)にある再帰カウンタを制御するために用いられるプログラムコードがある。
単語が空になるたびに、それぞれの単語のプログラムが再帰カウンタに1を加える。一連の繰り返しプロセスを終了する条件として、この再帰カウンタの値が前回の繰り返し処理での値と同じであるということを用いる。この状態を「状態変化はない」という。
ロジカルプログラミングでは、特に非手続き型プログラミング言語の一種である標準的なプロログ(Prolog:非手続き型プログラミング言語)では、バックトラック(再実行)が永久ループに陥る。他の改良型プロログは、待機(wait)やフリーズを使って永久ループを回避する。単語単位のプログラムでは、前述のメカニズムを使ってこのようなループを回避する。
Lyee(登録商標)方法論で用いるパレット連鎖関数プログラム(Φ)の例を以下に示す。「Crtの値は状態が未決定(空)である単語L(α)の数である」をループの変数プロパティとするというプロパティを用いる、ことによって、このプログラムはホア(Hoare)の理論で証明することができる。下記の例はx、y及びzの3つの単語がある場合である。
[Φのプログラムコード]
PCtr=1 /*PCtr=前回の繰り返し処理の再起カウンタ*/
Ctr=0 /*Ctr=再起カウンタ*/
While PCtr≠Ctr do
PCtr=Ctr
Ctr=0
L(x) /*各単語プログラムは状態と繰り返しの制御を行う
以下のような関数(機能)を持っている;
もし始点単語が空なら、単語L(α)の状態は未決
定でCtr=Ctr+1
そうでないなら、単語L(α)の状態は決定済*/
L(y)
L(z)
End
/*Ctrの値は状態が未決定である単語L(α)の数*/
このプログラムは以下の意味になる:
1)プログラムが終了する。
2)終了したとき、変数Ctrの値は、状態が未決定である単語L(α)の数である。
プログラムが停止したとき、単語の定義式に従って、このシステム中に始点単語を持つ単語L(α)の状態は、通常の場合真か偽が割り当てられる。単語αの状態は、次のような場合は、未決定(空)である:
1)単語αが閉じたループの中か、閉じたループの後にある場合。
2)単語αが排他的条件を持っていない場合。
排他的とは、もし「((x>y)or(x<y))」が常に真であり、かつ、「((x>yand(x<y))」が常に偽であれば、xとyは排他的である、として定義される。
3)単語αの始点単語が同じシステムにない場合。
II.単語単位のプログラムの数学的考察
単語単位のプログラムのプログラム構造はホアの定理によって証明できる。しかしながら、そのようなホアの定理のアプローチを通しての分析では、その論理表現のスタイルの複雑性のために、単語単位プログラムの意味論を検証し、改良を加えることが困難である。そこで、有向グラフ技術に起源したもう1つのアプローチである隣接行列を用いて、単語単位プログラムによるプログラム構造を数学的構造モデル化し、本発明を説明する。この章では、まず単語単位のプログラムによるプログラム構造を、数学的構造モデルによって表し、その特徴を述べる。すなわち、有向グラフモデルと隣接行列モデルである。
1.
Lyee要件の仕様をより形式的に扱うと、関数xを、1、2、…nの点における定数とその他の点のxの値によって定義した方程式のシステムに表すことができる。
数式1は、単語がn個あるシステムにおける、i番目の単語xの定義式を表す関数である。x(i)は終点単語であるi番目の単語xを表す。fi(x(1),x(2),…,x(n))は、終点単語x(i)の定義式を表す関数で、定義式がシステム内の1からn番目の単語のいずれかによって構成されていることを示す。
数式1のLyee(登録商標)仕様は次のように書き直すことができる:
さらに簡易な形式では、
x=F(x)
(II−1)本発明の原理:有向グラフ(directed graph)とその隣接行列
始点単語と終点単語の関係は、有向グラフによって表すことができる。有向グラフでは、各単語はノードによって、単語間の関係は矢印によって表される。矢印の出発点となるノードが始点単語、終着点となるノードが終点単語を表す。さらに、それはa≦b(単語aから単語bが作られる)という関係をもつ順序を定義する。
図2は、a≦b(aからbが作られる)という関係(f)をもつ順序を説明するための有向グラフの例を示した図である。
同図に示すように、単語はa≦bという関係を持つ半順序づけられた集合(セット)を構成する。即ち、同図の有向グラフは単語a及び単語bという要素及びこれらの要素間を関係付ける半順序関係(矢印)を構成要素とする集合とみることができる。
有向グラフは隣接行列によって表現することができる。n個の単語の関係を表す隣接行列は、n個×n個のマトリックスで表され、これを隣接行列Fと呼ぶ。この隣接行列において、行見出しと列見出しには、それぞれn個の単語名が置かれる。行の見出しとなるときn個の単語はそれぞれ終点単語であり、列の見出しとなるときn個の単語はそれぞれ始点単語である。
i番目の単語の式(つまり、数式1によれば、単語x(i)を生成するプログラムfi(x(i)))が、始点単語としてxjを使うとき、隣接行列のi行目と始点単語xj列の交点を表す隣接行列Fの要素fij(i=1,...,n;j=1,...,n)は1である。そうでないなら、0である。終点単語xiを生成する式において、始点単語xjが使用されているか否かを1か0で表すのである。(※「fij(i=1,...,n;j=1,...,n)」は、単語x(i)を生成するプログラムfi(x(i))を構成する単語のうちの単語x(j)を指し、このときはiは1からn、jは1からnのいずれかである、ことを示している。)
各単語が数式1の形式で、下記の数式3のように定義される例1の単語の関係を、有向グラフ、隣接行列の2つの形態で表して具体的に説明する。
(例1)
入力単語(fi(x(i))を持っていない最終の終点単語)をx1及びx2と置き、状態単語(入力単語でない単語、すなわちプログラムによって値を生成する単語)をx3、x4、x5、x6及びx7と置く。これらの関係を数式1の形式で表すと下記の数式3のようになる。
図3は、上記の例1の状態を表した有向グラフの例である。
即ち、同図に示す例においては、x1及びx2はfi(x(i))を持っていない入力単語である。よって、いずれの矢印の終着点にもなっていない。x3はx4及びx5から生成される。よって、x3はx4及びx5から出発する矢印の終着点になっている。同様に、x4はx2及びx5から、x5はx1から、x6はx3及びx7から、x7はx4及びx6から生成されることを表すように矢印が出発点と終着点が表されている。つまり、数式3で規定される状態と図3の有向グラフで表される状態とは等価である。
このとき例1の隣接行列は数式4のように表現される。
先に述べたように、隣接行列Fの行見出しは終点単語であり、列見出しは始点単語である。各行または列がどの終点単語または始点単語を示すかをわかりやすくし、説明を簡便にするために、隣接行列には見出しを付した。
数式4の隣接行列Fを各行について展開して説明する。第1行目の終点単語x1の行は、いずれの始点単語列との交点も0になっており、終点単語x1は始点を持たないこと(すなわち入力単語であること)が示されている。終点単語x2についても同様である。第3行目の終点単語x3の行は始点単語x4とx5の列との交点が1、その他の始点単語列との交点が0になっており、終点単語x3はx4とx5を始点単語として持つことが示されている。以下、終点単語x4から終点単語x7の終点単語についても、同様に、どの単語を始点単語として持つか(あるいは持たないか)が示されている。
数式4の隣接行列の各行は、以下のような数式でも表すことができる。左辺が行見出しとなる終点単語、右辺は、交点の値が1となった列見出しの始点単語を表す。右辺の「0」は、いずれの交点の交点の値も「0」であることを表す。
x1=0
x2=0
x3=x4+x5
x4=x2+x5
x5=x1
x6=x3+x7
x7=x4+x6
ここで、「+」は、後述するように、通常の四則演算における「加える」の意味でなく、本明細書中の単語の関係を表す数式においては、左辺の状態単語(終点単語)を決める半順序集合の始点単語が複数あるときにこれらを付加して左辺の単語を規定することを示す演算子(以下、「付加演算子」と呼ぶ)として用いている。
以上より、したがって、数式3で定義される単語の関係は、図3の有向グラフで表される関係及び数式4の隣接行列による数学的表現で記述される関係と等価であるということがいえる。
(II−2)隣接行列Fと状態ベクトルXで表す終点単語のための状態モデル
前述の(II−1)項では、n個の単語の「終点単語の他の単語との関係」を表すためのモデルとして、有向グラフと隣接行列を考察した。次に、n個の単語の「終点単語の値の状態」を表すためのモデルについて述べる。まず、n個の単語の始点単語としての状態を縦列のベクトルXに記録する(ベクトルとは1つの列あるいは行しか持たないマトリックスである)。数式4の隣接行列に表された単語の例で説明すると、始点単語が表示される順序、x1からx7の順序に各始点単語の状態を表したベクトルXは、たとえば下記の数式5のように表すことができる。各行がどの始点単語を示すかをわかりやすくし、説明を簡便にするために、ベクトルには見出しを付した。
このとき、ベクトルXは、始点単語x1とx2の状態は「+1」、始点単語x3の状態は「−1」、x4からx7の始点単語の状態は「null」であることを示している。
単語を生成し得る値の状態は次のように3種類に設定される。
+1:値は真であるとして決定済みである。
−1:値)は偽であるとして決定済みである。
空(null):値は未決定である。
入力単語の初期値は以下の通りである。
1:値は真であるとして決定済みである。
(適切に入力されている状態)
−1:値は偽であるとして決定済みである。
(適切に入力されていない状態)
従って、たとえ数式1が実行されるとしても、状態は変化しない。
状態単語の初期値は空である:
空:値はまだ決定済みでない。
(移動していない、あるいはまだ計算されていない状態)
状態単語について考察するに、単語の関係を表す隣接行列Fの上に単語の状態を表す状態ベクトルXを作用させるということは当該単語の順序で数式1を横列で実行することである。順番にn個の式を使う処理は順序処理と呼ばれる。その始点単語のすべての状態が+1であるとき、状態単語の状態が+1(真)になり、状態単語の値は決定済みとなる。
始点単語ではない単語の状態はその式の終点単語の状態とは関係していない。順序処理が繰り返されることは繰り返し処理と呼ばれる。たとえそれが繰り返されるとしても、「真」であるとして決定が済んでいない単語は、偽の状態(−1)になるか、あるいは空のままである。上記のことが「有向グラフ」で表現されると以下のようになる。
(1)もしノードが閉じられたループに含まれなかったなら、そして、もしいずれかの始点単語に係るノードから次々に始点単語を探索した際に当該始点単語の値が偽であるなら、ノード(単語)の値は決定されない。もし単語の値がユーザの必要条件を満たさなかったならノードの値は決定されない。たとえ値が成功裏に計算されるとしても、ノード(単語)の値が偽と決定される。
(2)もしノードが閉じられたループに含まれなかったなら、そして、もしすべての始点単語が、そのノードから次々に始点単語を探索したとき真であるなら、ノードの値は真として決定される。
(3)ノードが閉じられたループに含まれるときであって、ノードの始点単語がシステムに存在しないとき、ノード(単語)の値は空のまま残る。
(例2)
例1の場合、図3において、x3、x4、x5、x6及びx7の状態は、この場合における終端の始点単語であるx1及びx2の状態に依存する。同図から明らかなように、終端の始点単語であるx1が真になるとき、x5は真である。終端の始点単語であるx1及びx2が真であるとき、x4及びx5が真になる。x6及びx7はループにあるので空のままである。
(II−3)隣接行列Fと状態ベクトルXの計算操作
n個の単語の状態はベクトルX(列1つからなる行列)に、単語の順序に従って記録される。隣接行列Fと状態ベクトルXを用いて繰り返し処理を実行して計算した状態と同じ状態を表すように、算術演算子が定義される。言い換えれば、FとXの乗算は以下のようになる。
m回目の隣接行列Fと状態ベクトルXの積である、状態ベクトルXmの要素xm,i(m回目の繰り返し処理後の単語xi)は以下のような式で表せる。
乗算演算子(・)の左側のfIjには、隣接行列Fのi行目の終点単語においてj列の始点単語Xjが使われているか否かを表す指数1か0(始点単語となる場合が1、始点単語とならない場合が0)が与えられる。乗算演算子(・)の右側のxm,iには、m回目の繰返し処理中のベクトルXのi行目に表された始点単語xiの状態を示す3種類の指数+1(真)、−1(偽)、null(ここでnullは空を意味する)が与えられる。
数式4の隣接行列Fと数式5のベクトルXを例にして、終点単語x3の3回目の繰返し処理を数式7で表すと以下のようになる。
数式4のy3行と始点単語x1列との交点は「0」、数式5で示されたx1の状態を表す列の第1行は「+1」、よって、f3,1・x3,1は「0・(+1)」となっている。数式4のy3行と始点単語列との交点総てについて、その指数と数式5に示された対応する状態指数を乗算演算子で結び、付加演算を用いて列記していくと上記の式となる。
ここで、乗算演算子(・)の演算結果を次のように定義する。
(公理1)
数式8の公理は以下のことを示している。始点単語指数が0であれば、始点単語の状態が何であれ、始点単語の状態は真(+1)となり、終点単語の状態に影響を与えない。始点単語指数が1の場合は、始点単語の状態はそのまま変化せず、始点単語の状態が終点単語の状態に営業を与える。
次に、付加演算子(+)の演算結果を次のように定義する。付加演算子に用いる値は、公理1の演算結果である。
(公理2)
上記の公理2は、さらに右辺によって類別してみると、
数式9乃至10から明らかなように、付加演算子(+)の意味については、例えばもし、左辺に(−1)が1個でもあれば右辺は(−1)となる。もし左辺に(−1)がなく、かつ空(null)が1個でもあれば、右辺は空である。もし左辺のすべてが(+1)であるなら、右辺の状態は、終点である右辺の値がユーザ要件を満たす場合は(+1)、ユーザ要件を満たさない場合は(−1)である。
公理1及び2を使うことによって、次の定理が証明される。
(定理1)
終点単語の状態が(+1)(真)になるのは、始点単語の総ての状態が(+1)(真)であり、かつ終点単語の値がユーザ要件を満たす場合である<公理2第1群>。
(証明)
もし単語の状態が(+1)(真)であるなら、それは公理1によって、その単語が始点単語として用いられるとき、1・(+1)=(+1)であるから始点単語は(+1)(真)になる。その単語が始点単語として用いられない場合については、それは0・*=(+1)(*は3つの状態のいずれかを表す)であるから、単語の状態がいずれであっても、公理2に用いる始点は(+1)(真)となる。付加演算が実行された結果が(+1)(真)になるのは、公理2によって、定理1の場合以外には考えられない。
(定理2)
終点単語の状態が(−1)(偽)になるのは、始点単語の状態が1つでも(−1)であるときか、あるいはすべての始点単語が(+1)(真)であってかつ終点単語の値がユーザ要件を満たさない場合である<公理2第2群>。
(証明)
もしいずれかの始点単語として用いられる単語の状態が(−1)であるなら、公理1によって1・(−1)=(−1)であるから、始点単語の状態は(−1)(偽)になる。そのために、結果が公理2によって(−1)(偽)になる。すべての始点単語が(+1)(真)であるときは、定理1及び<公理2第2群>によって、(−1)(偽)になると証明される。
(定理3)
終点単語の状態が(未決定である)空になるのは、1個以上の始点単語の状態が空であり、かつ始点単語の残りの状態が(+1)(真)である場合である<公理2第3群>。
(証明)
もし1個以上の始点単語の状態が空であって、残りの始点単語の総てが(+1)(真)あるなら、公理2によって終点単語の状態は空になる。
一巡処理はXm=FXm−1によって表せる。繰り返し処理が継続されると以下のようになる。
Fmは通常のマトリックスの積として定義される。Fmの要素(i,j)はマイナスでない整数である。
終点単語の状態は一巡処理を繰り返す繰り返し処理によって空から(+1)または(−1)に変化する。その状態については、たとえ(+1)(真)のものと(−1)(偽)のものとが繰り返しプロセスを実行するとしても、終点の状態は変化しない。有向グラフによって表現した際、グラフに閉じられたループが存在し、終点が閉じられたループ内にあるとき、あるいは、このシステムが始点を持っていないとき、何度もそれを繰り返すとしても、終点単語の状態は空のままである。「状態に変化がない(すなわち、固定点fixed pointに達した)」ことはXm+1=Xmで表わされ、数式6を用いると、次のようになる。
Fm+1X0=FmX0
この時
F: 隣接行列
X: 状態ベクトル(単語の状態を列で示す)
X0: 初期状態、すなわち全ての要素がnull
m: 繰り返しの数
この方程式が有効なとき、プログラムは停止する。
III.不要な繰り返しを回避する方法(実行順序の並び替え)
(III−1)隣接行列の性質
(II−2)で、数学的構造モデルが確立された。ユーザ要件のすべての特性が隣接行列のみで示される。したがって、この隣接行列の特性を調べるのは非常に重要であって、有用である。
隣接行列Fの特性を利用して、不要な反復を避けるための方法を示す。どんなプログラム(アルゴリズム)も、再帰的な方法のみを用いて説明することができる。手続的には、再帰はwhileループ(繰り返しの終了条件をwhileで指定したループ)によって実現される。
数式6を使用して、「いかなる状態変化もない」(すなわち、「定点に達する」)という状態は、以下のように示される:
この公式が有効になるとき、プログラムは止まることになる。
このとき、行列Fには、どんな特性があるか?行列Fmの特性は何であるか?これらの疑問に答えるために、定理4を導入することが必要である。
空でない有限集合Vの組G=(V、E)とV×Vの部分集合Eは有向グラフと呼ばれる。Vの要素は頂点もしくはポイント(点)と呼ばれ、Eの要素(u,v)は縁もしくは矢と呼ばれる。Gのポイントの有限系列P、P=<v1,v2,...,vn>はv0からv1に至るパスと呼ばれ、各i(1≦I≦n)について、(vi−I,vi)∈Eが成り立つときには、nはこのパスの長さと呼ばれる。v0はPの始点、vnは終点と呼ばれる。<v0>は長さゼロのパスである。パスは隣接している矢の方向と共にGのポイントを追従する道筋である。
(定理4)
有向グラフVの隣接行列をAと定義する。Anの(i、j)要素は、互いに異なるGのviからvjまでの長さnのパスの数である。
m=1、m=2、…と連続して計算しFm+1X0=FmX0が成立するときにはプログラムが停止する。FとFmのプロパティを検証する。X0の全要素が常にヌル(空)なので、Fはシステムの全プロパティを表す。
1)Fm=0である場合 (m≦n)
Fmのすべての要素が0である。定理4を用いれば、閉鎖ループがこの隣接行列の有向グラフに存在しないことが証明される。変数mはその有向グラフの最も長いパスの長さを表す。Fの固有値はすべて0である。零べき行列(Fm=0)のプロパティから、対角に要素0を持つ下三角形のマトリクスFに再配列することができる。即ち、
F’=P−1FP、ここでPは正方行列もしくは長方形行列。
理由は、F(FmX0)=FmX0,Fm+1X0=FmX0
が有効であるからである。Xmのすべての要素は(+1)か(−1)である。
2)Fm≠0である場合 (m≦n)
もし、閉じたループがこの隣接行列の有向グラフに存在した場合、対角の要素fii (r):i=1,…,n of Frに1つ以上の整数が現れることが、定理4を使って証明される。このとき、変数rは最も短い閉じたループである。Fの固有値は、総てが0ではない。言い換えれば、固有値の1つは0と等しくない。総てのX0値が空(null)なので、Fm+1X0=FmX0は有効である。変数mは、その有向グラフのループの前の最も長いパスの長さを表す。Xmの例では、Xm=t[(+1),(+1),(null),(null),(null),(null)]。
もし、閉じたループが有向グラフに存在しなければ、その隣接行列は零冪行列(Fm=0)となる。この特性は重要である。
(III−2)繰り返しプロセスを不必要にする単語の並べ方
「有向グラフ」で表現する際に、前述の第III章1項で示したように、閉じられたループ内で始点単語・終点単語である関係がないときには、隣接行列が下三角行列になり、対角の三角形が0になるような一巡処理順序に単語を並べることによって、繰り返しプロセスを避けることができる。
分析的に規則正しい行列Pを得るのは困難である。F’=P−1FPを用いる代わりに、トポロジカル・ソートを用いる。半順序関係が与えられているとき、最初にするべき仕事から終わりにするべき仕事まで、データを一列に並べることをトポロジカル・ソート(topological sort)と呼ぶ。半順序関係(partial order)であるから、答えが常に唯一的に決定されるわけではない。
有向グラフに深さ優先探索(depth first search:縦型検索ともいう)をしつつ、戻るときにノードを拾い上げるという方法によって、トポロジカル・ソートを実行することができる。各ノードからこれを行い結果を逆順にならべる。順序処理(一巡処理)における単語を並べるには、この方法によって単語を並べさえすればよい。
図4は、あるノード1乃至8が形成する特定の順序関係を表した有向グラフである。
即ち、同図に示す例においては、先に定義した始点単語と終点単語との関係を用いて次のように規定できる。
ノード2≦ノード1
ノード1≦ノード3
ノード3≦ノード4、ノード5≦ノード4
ノード2≦ノード5
ノード5≦ノード6
ノード3≦ノード7、ノード6≦ノード7、ノード8≦ノード7
ノード6≦ノード8
(例4)
図4に示される有向グラフの隣接行列は次の数式13の通りである。
図4の有向グラフでは閉じられたループ内で始点単語・終点単語の関係がない。そこで、この半順序関係に係る隣接行列が下三角行列になるように、トポロジカル・ソートを行う。具体的には次のように行う。
(1)有向グラフに対する深さ優先探索を実行する。即ち、一例として、ノード1を始点とすると、ノード1を出発して連結されている未訪問のノードを半順序関係を守って探索(即ち、連結される未訪問のノードまで進み、行き場所がなくなったら、行ける場所があるノードまで戻って(再帰)再び進めるだけ進み、行き場所がなくなったら終了(再帰からリターン):これを「再帰的に進む」ともいう)する。これにより、ノード1→ノード3→ノード4(*)→ノード3→ノード7(*)→ノード3(*)→ノード1(*)を得る。但し、(*)は再帰の時点を示す。
(2)次に、始点をノード2に移し、上記と同様の探索を行う。すでに訪問したところは進まない。これにより、ノード2→ノード5→ノード6→ノード8(*)→ノード6(*)→ノード5(*)→ノード2(*)を得る。
(3)その他のノードを始点として探索をするところ、すでに全ノードを訪問済みなので探索は終了する。
(4)戻る(再帰の)ときのノードを拾い上げる。具体的には、(1)(2)で(*)の時点のノードを拾い上げる。上の例では、ノード4(*)→ノード7(*)→ノード3(*)→ノード1(*)→ノード8(*)→ノード6(*)→ノード5(*)→ノード2(*)を得る。
(5)順序処理(一巡処理)における単語を逆順に並べる。即ち、(4)で拾い上げたノードの列を逆に並べたものを一つの解として得る。上の例では、ノード2→ノード5→ノード6→ノード8→ノード1→ノード3→ノード7→ノード4が求める一つの解である。
以上より、トポロジカル・ソートの結果は(1,2,3,4,5,6,7,8)→(2,5,6,8,1,3,7,4)である。(「ノード」の表記は省略する。)
このトポロジカル・ソートの具体的な方法についてフローチャートを用いて説明すると次のようになる。図5はトポロジカル・ソートの動作を説明するためのフローチャートである。
まず、初期値を、a=1,I=1と設定する(ステップ501)。
次に、a=a+1とし、始点をノードaに設定する(ステップ502)。
ここから探索を開始する。具体的には、訪問可能な連結されているノードで未訪問のところがないかを判定する(ステップ503)。これについては、例えば、各ノードに訪問フラグを設定、初期値に0(未訪問を示す)を入れておき、当該ノードが訪問されたときには訪問フラグを1にするなどの方法により自動判定させることができる。
ここで未訪問ノードが存在するときには、1ノード進み(ステップ504)、ステップ503に戻る。
未訪問ノードが存在しないときには、1ノード戻り(再帰)、I=I+1とする(ステップ505)。このとき、再帰に係るノードを再帰ノード列I番目の要素として退避する(ステップ506)。
次に、再帰の結果ノードaに戻ったかを判定し(ステップ507)、まだ戻っていなければステップ503に戻る。ノードaに戻った場合には始点をノードaとする探索は終了する。即ち、再帰からリターンし、I=I+1とし(ステップ508)、再帰点を先の再帰ノード列I番目の要素として退避する(ステップ509)。
ここで全ノードが探索済みかどうかをチェックする(ステップ510)。まだ探索を行っていないノードが存在する場合には、始点を替えて再度探索を始めるため、ステップ502に戻る。全ノードの探索が終了しているときには、探索は終了し、退避してあった再帰ノード列を逆順に並べる(ステップ511)ことで、並び替えの1候補を得て、一連のトポロジカル・ソートの動作を終了する(ステップ512)。
このように、トポロジカル・ソートのアルゴリズム自体を上記で説明したフローチャートに沿ってプログラム化すれば、トポロジカル・ソートの自動プログラムを得ることができる。
さて、上記によりFをトポロジカル・ソートした。その結果、F’(トポロジカル・ソートされたF)は次の数式14のようになる。
トポロジカル・ソートの結果、一巡処理の順序は、「1,2,3,4,5,6,7,8」から「2,5,6,8,1,3,7,4」となった。
このようにF’が得られるが、このF’はその形から明らかなように上三角形に当たる総ての項が0である下三角行列になっている。この(ソート済み隣接行列である)F’は(上三角形部分には0しかないため)その構造上、あるノード(終点単語)を求めるための始点単語は当該ノードより(ソート済み隣接行列における)上の行のノードにしかない。従って、F’の行の上位から順番に値を求めていけば、Fで同じことを行う場合に比べて、繰り返しや遡りを行うことなくスムーズに総てのノードについて値が求まる。
さて、次に、上記で説明したトポロジカル・ソートをLyee(登録商標)方法論において応用する方法の一つを説明する。
図6は、Lyee(登録商標)方法論における単語単位の論理要素をノードとして上記のトポロジカル・ソートを用いて繰り返しをなくすための自動制御の動作を説明するためのフローチャートである。
同図に示すように、まず、単語ごとの論理要素(これらをノードと考える)間の関係を規定する(ステップ601)。
このためには例えば有向グラフの作成(ステップ602)を行っても良いが、これに限定されるものではない。
次に、ノードについての(上記説明した)隣接行列を定義する(ステップ603)。
この隣接行列に対して上述のトポロジカル・ソートを実行する(ステップ604)。トポロジカル・ソートの詳しいアルゴリズムについては図5及び対応する説明で詳述したので、ここでは割愛する。また、ここでは探索技法の一例としてトポロジカル・ソートとして説明したが、このステップ604では前述の他の探索の実行を行っても良いのはもとよりである。
最後に、トポロジカル・ソートの結果得られた1解に基づき、当該単語単位の論理要素(ノード)を並び替え(ステップ605)、当該動作を終了する(ステップ606)。
なお、隣接行列定義のステップ(ステップ603)については、本稿では理解の容易さを助けるために入れたが、本質的には必須のステップではない。つまり、隣接行列を定義することなく、単語ごとの論理要素間関係の規定(ステップ601)から、直接に、或いは有向グラフ作成(ステップ602)を介して、トポロジカル・ソート等の探索のステップ(ステップ604)に至ることも本発明の思想の範囲内であり、本発明の目的とするところを実現し得る。
このように、Lyee(登録商標)のソフトウェア生成自動プログラムにかける前の段階で、Lyee(登録商標)方法論によるユーザ要件から抽出した単語ごとの論理要素に対してトポロジカル・ソートをかけることで繰返しの省かれたLyee(登録商標)方法論によるソフトウェア生成が可能となる。
換言すれば、上記のノードをLyee(登録商標)方法論における単語ごとの論理要素と考えれば、上記の方法でF’を求めることで、ある単語について値を求める(有意性を決定する)に当たって、何回も繰り返し処理を行うことなく1回のRUNのみで目的を達することが可能となる。
さらに、上記のようなトポロジカル・ソートのアルゴリズムは、上記の説明から明らかなように、それ自体をソフトウェアとしてプログラミングして自動化することが可能である。
従って、Lyee(登録商標)方法論によるソフトウェア自動生成方法についてそれをさらに効率化・高品質化するのにも自動化を図れることになる。
なお、上記の説明においては、有向グラフに表される単語の順序関係として主として半順序関係を持つ場合について説明したが、半順序関係のみならず、全順序関係について、或いは全順序関係及び半順序関係が混在する場合についても上記の説明が該当することはもとよりである。
また上記の説明においては、理解のしやすさの観点から、有向グラフの作成を行った後に隣接行列を作成する点を説明したが、有向グラフの作成を介さずに、単語単位のプログラム相互の関係から直接隣接行列を作成するようにしても本発明は実現できる。
すべての単語で作るべきプログラムの構造と当該プログラムを制御するのに用いるパレット連鎖関数のプログラムの構造は、上記の記述で明確になった。そして、それらが数学上適切に動くことが証明された。
IV.むすび
以上詳細に説明したように、本発明では、単語の状態を定義している単語単位をベースにするプログラムの数学的な構造モデルを作成し、それをLyee(登録商標)方法論によるソフトウェア開発に適用することで、より高効率、高速、高パフォーマンスの開発を実現した。
単語の状態は完全な半順序を構成する。それは単語の最小要素(極小点)として 空を持っている。有向グラフとその隣接行列とを使って、この構造モデルは数学的な面からも正しいといえる。
さらに、本発明ではパレットの一般的な考えと基本構造の正当性を考察した。それらは実務上、プログラムを作るために必要である。また、順次読込(sequential read)のようなアルゴリズム、合計値算出を実現するための構造について説明した。これらの一般的な考えはLyee(登録商標)のシステム開発方法論で使われる。それは多くの産業的な応用分野ですでに実用的に有効とされた多くの結果をもたらしている。
人間であるユーザと、外の装置とのインタフェース及びコミュニケーションについても論じられている。これは、このようなシステムのタイプのために、単語単位をベースとするプログラムとして設計する(モデリング)ことの、実際の作業を正当化する。
以上を要するに、本発明によれば、数学的な考え方、手法、解析法をLyee(登録商標)のソフトウェア開発論、開発技術に適用・応用するので、ソフトウェア開発をより効率良く、高速に、精密に実現することができる。
本発明は当該技術分野における通常の知識を有する者にとって修正および改変が容易に数多くなし得るので、図示および記述されたものと寸分違わぬ構成および動作に本発明を限定することは望ましくないことであり、従って、あらゆる適切な改変体および等価体は本発明の範囲に含まれるものと見なされうる。前述の本発明に係る実施の具体的形態の説明および例示によって詳細に記述されたが、本願の特許請求の範囲のみならず本発明に係る開示事項全体に定義された本発明の範囲から逸脱することなしに、修正、置換、および、変更が数多く可能である。
また、本願に係る発明は、その適用において、上記の記述において説明されるか、或いは、図面に示された要素の詳細な解釈及び組み合わせに限定されるものではない。本発明は、他の実施形態が可能であり、種々の方法で実用および実施可能である。また、ここで用いられた語法および用語は記述を目的とするものであり、限定的に働くものとみなされてはならない。
従って、当該技術分野における通常の知識を有する者は、本開示の基調となる概念は、本発明の幾つかの目的を実施するための他の構造、方法、及び、システムを設計するための基礎として容易に利用され得ることを理解するはずである。従って、本発明の趣旨および範囲から逸脱しない限り、本願の特許請求の範囲にはそのような等価な解釈が含まれるものと見なされるものである。
上記の詳細な説明では、有向グラフ表記、隣接行列算出、トポロジカル・ソート、並び替えという順序で本発明の思想を実現する方法について述べた。しかしこれらはどれも絶対不可欠な要素というものではなく、例えば、有向グラフ表記の表記を経ないで直接隣接行列算出→トポロジカル・ソート→並び替えという順序で本発明の思想を実現してもよい。
さらに、有向グラフに対して、例えば幅優先探索(Breadth−First Search)、反復深化法(Iterative Deeping)、発見的探索(Heuristic Search)、ヒル・クライミング(Hill Climbing)、最適優先探索(Best−First Search)、オイラー(Euler)の一筆書き、ダイクストラ(Dijkstra)法等の各種探索技法を組み合わせることで並び替えてもよい。
或いは、隣接行列算出のあとを、これらの各種探索技法を組み合わせることで本発明の根本思想を実現してもよい。
また、本発明に係る技術思想は、例えばコンピュータソフトウェアの自動開発装置、自動開発プログラム、自動開発プログラムを記録した記録媒体、伝送媒体、紙媒体としても、また、自動開発プログラムを登載したコンピュータ・装置、自動開発プログラムを実行するクライアント・サーバ形式等といったカテゴリーにおいても実現、利用可能であることはいうまでもない。
図7は、本発明をソフトウェア開発装置として実現する場合の機能構成を示したブロック図である。即ち、同図に示す一例においては、ソフトウェア開発装置1000として、次の要素を備えさせる。
制御部1010は全体の制御及びLyee(登録商標)方法論に基づいたソフトウェア開発を自動的に行う機能を有する。即ち、後述する(有向グラフ作成部1050、)隣接行列計算部1060及びトポロジカルソート部1070により並び替えられた単語単位プログラム群をLyee方法論に自動的に適用して生成コードを得る機能を有している。
情報入力部1020は(図示しない)画面等を通じて、Lyee(登録商標)に係るユーザ要件を初めとする人間の意思をコンピュータに入力するインターフェースとしての機能を果たす。情報取得部/通信部1030は外部との通信や(ソフトウェア開発装置1000にある場合の)データベース1040、1041等との情報の授受を行う。なお、この例ではデータベース1040、1041はソフトウェア開発装置1000内に持っていてもよいことはもとよりである。
有向グラフ作成部1050は、制御部1010の制御に基づき、上記で説明したように、Lyee(登録商標)に係るユーザ要件から半順序関係を割り出し、それを有向グラフとして作成する機能を有する。隣接行列計算部1060は、制御部1010の制御に基づき、有向グラフ作成部1050で作成された有向グラフについて、上記で説明したような隣接行列を計算・作成する。トポロジカルソート部1070は、制御部1010の制御に基づき、隣接行列計算部1060で計算・作成された隣接行列に対して、上記で説明したようなトポロジカルソートを実行する機能を有する。
なお、上記トポロジカルソート部1070は探索を行う機能を持つ一例であって、上述のように、他の探索手法を実現する機能を有する探索部(一般)としても本発明の思想は実現される。
このように構成することにより、これら各部(1010〜1070、従って1000)は総て自動化できるので、結局繰返し処理の排除→ソフトウェア生成まで一貫して自動処理が可能となり、ソフトウェア生産速度、効率は各段に向上する。
このように、各機能を、それを実現するようにプログラムとして組んだソフトウェアとして、或いはそのようなソフトウェアを例えばROM(ReadOnlyMemory)に書きこみ、かかるROMを組み込んだ全体システム(装置)とすることで、前述した本発明に係る各要素をソフトウェアとして、或いはそのようなソフトウェアが組み込まれたソフトウェア開発装置として実現している。
さらに本発明は、単一プロセッサ、単一ハードディスクドライブ、及び、単一ローカルメモリを備えたコンピュータシステムに限らず、当該システムのオプションとして、任意の複数または組み合わせプロセッサ又は記憶デバイスを装備するにも適している。コンピュータシステムは、精巧な計算器、掌タイプコンピュータ、ラップトップ/ノートブックコンピュータ、ミニコンピュータ、メインフレームコンピュータ、及び、スーパーコンピュータ、ならびに、これらの処理システムネットワーク組合わせを含む。本発明の原理に従って作動する任意の適切な処理システムによって代替されうるし、また、これらと組合せて用いることも可能である。
また、本発明に係る技術思想は、もとよりあらゆる種類のプログラミング言語に対応可能である。さらに本発明に係る技術思想は、あらゆる種類・機能のアプリケーションソフトウェアに対しても適用可能である。
またさらに本願発明は、その技術思想の同一及び等価に及ぶ範囲において様々な変形、追加、置換、拡大、縮小等を許容するものである。また、本願発明を用いて生産されるソフトウェアが、その2次的生産品に登載されて商品化された場合であっても、本願発明の価値は何ら減ずるものではない。
以上、詳細に説明したように、本発明によれば、Lyee(登録商標)方法論によるソフトウェア開発において、より高効率、高速、高パフォーマンスを実現することができる。
第2図は、a≦b(aからbが作られる)という関係をもつ順序を説明するための有向グラフの例である。
第3図は、有向グラフの例である。
第4図は、あるノード1乃至8が形成する特定の半順序関係を表した有向グラフである。
第5図は、トポロジカル・ソートの動作を説明するためのフローチャートである。
第6図は、Lyee(登録商標)方法論における単語単位の論理要素をノードとした場合にトポロジカル・ソートを用いて繰り返しをなくすための自動制御の動作を説明するためのフローチャートである。
第7図は、本発明をソフトウェア開発装置として実現する場合の機能構成を示したブロック図である。
発明の概要
本発明は、「有向グラフ」技術から生まれる、従来とは別のアプローチを用いることで上記の従来技術上の問題点を解決するものである。
以下、図面を参照しながら、本願の発明の具体的な実施形態について説明する。
第I章で、本発明の前提となる、本発明が改良を施す対象であるLyee(登録商標)方法論によるソフトウェア構造(単語単位のプログラム構造)と、Lyee(登録商標)の特徴的な概念である「状態」の概念について概略を述べる。第II章では、単語単位のプログラムを数学的構造モデルによって説明する。第III章で、本発明の具体的な実施形態であるトポロジカルソートについて述べる。
I.単語単位のプログラムとは何か
(I−1)単語単位のプログラムとは
Lyee(登録商標)方法論によるソフトウェアは、単語単位のプログラムを基本にして構成されている。単語単位のプログラミングでは、要件は単語の集合によって表され、単語は宣言文を使って定義される。単語単位のプログラムは、2種類の主なコンポーネントで構成されている。1つのコンポーネントは単語のコンポーネントである。単語単位のプログラミングでは、要件は、単語の名前、単語の計算式の定義、単語の計算式の条件、単語の属性(入出力、データタイプ、その他の属性)を含んだ単語の集合とし、代入文ではなく宣言文の形式で定義される。
たとえば、Swが単語wを定義する宣言文であるとすると、その要件の例は表1のようになる。
もう1つのコンポーネントは制御プログラムのコンポーネントである。制御プログラムは、それ以上実行を繰返しても、いかなる単語の値も変化しない状態になるまで、単純に単語単位プログラムの実行の繰り返しを行う。単語aの定義は単語bを使用しており、単語bは単語aの後に与えられているが、ユーザはこれらの定義が実行される順序(制御ロジック)を指定する必要がない。一方、手続き型プログラミングの場合は当然ながら、宣言型プログラムミングの一種であるロジカルプログラミングの場合でも、プログラムの一行の実行順序は実行結果に影響を与える。
表1の例を使って、この処理の動きを説明する。
最初に、単語aが実行される。単語d、b、cはまだ実行されておらず、従って単語aは値を決定することができない。次に、入力単語cが実行される。単語cは実行条件がないので、値が決定される。例えば、単語cの値が+3だとすると、単語bは、実行条件c>0が真となるので、定義2×c+5が実行可能になり、単語bの値は+11と計算され、値の出力が可能となる。単語dは入力単語であり、実行条件がないので、d=真である。これですべての単語が処理されたが、単語aの値は未決定のままである。結果として、プログラムは最初に戻って再び処理を実行する。
2回目の実行時、d=真、単語bと単語cはそれぞれ値が+11と+3に決定しているので、単語aは値+14を得て、その値が適切な装置に出力される。単語c、bとdの値は前に計算されているので、これらの単語の値のすべては決定済みである。従って、2回目の実行で、4つの単語の総ての値が決定したことになる。
次に、「状態」概念について説明する。単語のデータタイプは、コンピュータ上で扱い可能な、数、ブール(boolean)、文字、その他である。論理的順序を制御するためには、それぞれの単語に存在する「状態」の概念の導入が必要となる。実際、単語の状態とは、複数の状態:すなわち、真、偽、そして未決定のいずれか1つとなる。それぞれの意味は次の通りである。
真:値が決定され、かつユーザ要件を満たす。
偽:値が決定されるが、それはユーザ要件を満たさない。
未決定(又は空):値が決定されていない。
単語の最初の状態は常に未決定で、それは単語の値がまだ転送(move)されていないか、あるいは計算されていなかったことを意味している。名前によって定義された単語を終点単語、そして、別の単語を定義するために、計算条件や計算式に使われている単語群を始点単語と呼ぶ。要件中の総ての単語が1回実行されることを一巡処理と呼ぶ。
単語の値が決定され、その状態が真となるのは、その単語の始点単語の状態がすべて真となったときである。始点単語として使われていない単語の状態は、終点単語の状態に関与しない。一巡処理が繰り返されることを、繰返し処理(又は、繰返しプロセス)と呼ぶ。単語の状態に変化がなくなるまで繰り返し処理を続けることにより、単語を出力に用いることが可能となる。各単語の状態は、真、偽になるか、あるいは未決定のまま残るか、のいずれかである。もし未決定の単語があるなら、そのシステムに入力単語が存在するかどうか、閉じたループがあるかどうかをチェックする必要がある。
閉じたループは、単語が直接的または間接的に自身で自身を定義しているか、要件が完全でないことを意味する。実行条件は排他的でなければならず、また否定は明示的に定義されていなくてはならない。すなわち、条件の総和が重なりのない全体を構成(言い換えれば、条件の総和が1となり、1以上でも1以下でもない)しなければならない。
このように、単語単位のプログラミングは、ソフトウェアの制御ロジック部分を自動的に生成する。
(I−2)個々の単語のプログラム構造
図1は、前述した単語単位のプログラムの構造を示したフローチャートである。同図をもとにプログラムの構造及び動作について説明する。図1のαは、単語名を示す。
(1)ボックス1
まず、statement(宣言文)を遂行するべきかどうか判断する。もし単語αの状態が空でないなら、以下を実行せず終了し(301)、空ならボックス2へ進む。
(2)ボックス2
もし始点単語の状態が総て真であるときは、単語の定義式(計算式)を遂行して、その結果を一時的な領域に記憶する。従って、一時的な領域が必要となる。始点のいずれかが真以外の場合は、定義式を遂行しない。
(3)ボックス3
定義式を実行した、または不実行の結果、単語αに有意な(ユーザ要件に適合する)値が決定されたかどうかを判断する。総ての始点単語が真であるとき、単語の値は決定される。しかし、たとえ総ての始点単語が真であるとしても、ユーザの要求条件によっては単語の値は偽とされるかもしれない。単語に有意な値が決定されるときはボックス4へ、単語に値が決定されない、又は決定された値が偽とされるときはボックス5へ移行する。
(4)ボックス4
決定された単語αの値がユーザの要求条件に適合するときには、通常領域に結果を記録する。従って、通常領域が必要となる。この場合には、単語αの状態は真である(303)。
(5)ボックス5
ボックス3で単語の値が未決定、又は決定された値が偽とされた場合はここに至る。ボックス5では、単語がこのうちどちらであるかを判断する。単語の値がユーザ要求条件によって偽となるか、あるいは始点の値が偽の場合は、単語の状態は偽である。単語の状態が偽となる場合はボックス6へ、単語の値が偽でない場合はボックス7へ移行する。
(6)ボックス6
値が偽であることを示すフラグをセットする。このようなフラグは偽のプロセスとしてすべての単語に必要である。または、状態が偽であることを意味する値を通常領域に記憶する。このとき単語の状態は偽となる(305)。
(7)ボックス7
繰り返し処理を実行するかどうかを判断するために再帰(繰返し)カウンタに1を加える。従って、再帰カウンタが必要となる(非特許文献3参照)。このとき単語の状態は空となる(307)。
(I−3)全体のシステムを制御するプログラムとその構造
システム全体を制御するプログラムがパレット連鎖関数と呼ばれる(非特許文献3参照)。適切に繰り返し処理をする制御プログラムはこのプログラムの中に入れられる。図1で説明したように、もし1つの始点単語の状態が偽であるなら、終点単語の状態が確実に偽になる。たとえ始点単語のすべての状態が真であるとしても、ユーザ要求条件について偽があるときには、終点単語の状態が偽になる。したがって、繰り返しがなされるかどうかを判断するためには、ただ空(未決定)の始点単語が定義式に含まれるか否かを判断すればよい。
もし空の始点単語が1つでもあれば、繰り返し処理は実行される。しかしながら、有向グラフによってそれを表現するならば、閉じられたループが含まれるときには、終点単語の状態が空から変化しない。また、このシステムが始点単語を持っていないとき、終点単語は空から変化しない。そのために、このような場合には、繰り返しプロセスは終了せず永久のループに入る。このような状況を回避するために、プログラムのすべての単語L(α)を制御するパレット連鎖関数のプログラム(Φ)にある再帰カウンタを制御するために用いられるプログラムコードがある。
単語が空になるたびに、それぞれの単語のプログラムが再帰カウンタに1を加える。一連の繰り返しプロセスを終了する条件として、この再帰カウンタの値が前回の繰り返し処理での値と同じであるということを用いる。この状態を「状態変化はない」という。
ロジカルプログラミングでは、特に非手続き型プログラミング言語の一種である標準的なプロログ(Prolog:非手続き型プログラミング言語)では、バックトラック(再実行)が永久ループに陥る。他の改良型プロログは、待機(wait)やフリーズを使って永久ループを回避する。単語単位のプログラムでは、前述のメカニズムを使ってこのようなループを回避する。
Lyee(登録商標)方法論で用いるパレット連鎖関数プログラム(Φ)の例を以下に示す。「Crtの値は状態が未決定(空)である単語L(α)の数である」をループの変数プロパティとするというプロパティを用いる、ことによって、このプログラムはホア(Hoare)の理論で証明することができる。下記の例はx、y及びzの3つの単語がある場合である。
[Φのプログラムコード]
PCtr=1 /*PCtr=前回の繰り返し処理の再起カウンタ*/
Ctr=0 /*Ctr=再起カウンタ*/
While PCtr≠Ctr do
PCtr=Ctr
Ctr=0
L(x) /*各単語プログラムは状態と繰り返しの制御を行う
以下のような関数(機能)を持っている;
もし始点単語が空なら、単語L(α)の状態は未決
定でCtr=Ctr+1
そうでないなら、単語L(α)の状態は決定済*/
L(y)
L(z)
End
/*Ctrの値は状態が未決定である単語L(α)の数*/
このプログラムは以下の意味になる:
1)プログラムが終了する。
2)終了したとき、変数Ctrの値は、状態が未決定である単語L(α)の数である。
プログラムが停止したとき、単語の定義式に従って、このシステム中に始点単語を持つ単語L(α)の状態は、通常の場合真か偽が割り当てられる。単語αの状態は、次のような場合は、未決定(空)である:
1)単語αが閉じたループの中か、閉じたループの後にある場合。
2)単語αが排他的条件を持っていない場合。
排他的とは、もし「((x>y)or(x<y))」が常に真であり、かつ、「((x>yand(x<y))」が常に偽であれば、xとyは排他的である、として定義される。
3)単語αの始点単語が同じシステムにない場合。
II.単語単位のプログラムの数学的考察
単語単位のプログラムのプログラム構造はホアの定理によって証明できる。しかしながら、そのようなホアの定理のアプローチを通しての分析では、その論理表現のスタイルの複雑性のために、単語単位プログラムの意味論を検証し、改良を加えることが困難である。そこで、有向グラフ技術に起源したもう1つのアプローチである隣接行列を用いて、単語単位プログラムによるプログラム構造を数学的構造モデル化し、本発明を説明する。この章では、まず単語単位のプログラムによるプログラム構造を、数学的構造モデルによって表し、その特徴を述べる。すなわち、有向グラフモデルと隣接行列モデルである。
1.
Lyee要件の仕様をより形式的に扱うと、関数xを、1、2、…nの点における定数とその他の点のxの値によって定義した方程式のシステムに表すことができる。
数式1は、単語がn個あるシステムにおける、i番目の単語xの定義式を表す関数である。x(i)は終点単語であるi番目の単語xを表す。fi(x(1),x(2),…,x(n))は、終点単語x(i)の定義式を表す関数で、定義式がシステム内の1からn番目の単語のいずれかによって構成されていることを示す。
数式1のLyee(登録商標)仕様は次のように書き直すことができる:
さらに簡易な形式では、
x=F(x)
(II−1)本発明の原理:有向グラフ(directed graph)とその隣接行列
始点単語と終点単語の関係は、有向グラフによって表すことができる。有向グラフでは、各単語はノードによって、単語間の関係は矢印によって表される。矢印の出発点となるノードが始点単語、終着点となるノードが終点単語を表す。さらに、それはa≦b(単語aから単語bが作られる)という関係をもつ順序を定義する。
図2は、a≦b(aからbが作られる)という関係(f)をもつ順序を説明するための有向グラフの例を示した図である。
同図に示すように、単語はa≦bという関係を持つ半順序づけられた集合(セット)を構成する。即ち、同図の有向グラフは単語a及び単語bという要素及びこれらの要素間を関係付ける半順序関係(矢印)を構成要素とする集合とみることができる。
有向グラフは隣接行列によって表現することができる。n個の単語の関係を表す隣接行列は、n個×n個のマトリックスで表され、これを隣接行列Fと呼ぶ。この隣接行列において、行見出しと列見出しには、それぞれn個の単語名が置かれる。行の見出しとなるときn個の単語はそれぞれ終点単語であり、列の見出しとなるときn個の単語はそれぞれ始点単語である。
i番目の単語の式(つまり、数式1によれば、単語x(i)を生成するプログラムfi(x(i)))が、始点単語としてxjを使うとき、隣接行列のi行目と始点単語xj列の交点を表す隣接行列Fの要素fij(i=1,...,n;j=1,...,n)は1である。そうでないなら、0である。終点単語xiを生成する式において、始点単語xjが使用されているか否かを1か0で表すのである。(※「fij(i=1,...,n;j=1,...,n)」は、単語x(i)を生成するプログラムfi(x(i))を構成する単語のうちの単語x(j)を指し、このときはiは1からn、jは1からnのいずれかである、ことを示している。)
各単語が数式1の形式で、下記の数式3のように定義される例1の単語の関係を、有向グラフ、隣接行列の2つの形態で表して具体的に説明する。
(例1)
入力単語(fi(x(i))を持っていない最終の終点単語)をx1及びx2と置き、状態単語(入力単語でない単語、すなわちプログラムによって値を生成する単語)をx3、x4、x5、x6及びx7と置く。これらの関係を数式1の形式で表すと下記の数式3のようになる。
図3は、上記の例1の状態を表した有向グラフの例である。
即ち、同図に示す例においては、x1及びx2はfi(x(i))を持っていない入力単語である。よって、いずれの矢印の終着点にもなっていない。x3はx4及びx5から生成される。よって、x3はx4及びx5から出発する矢印の終着点になっている。同様に、x4はx2及びx5から、x5はx1から、x6はx3及びx7から、x7はx4及びx6から生成されることを表すように矢印が出発点と終着点が表されている。つまり、数式3で規定される状態と図3の有向グラフで表される状態とは等価である。
このとき例1の隣接行列は数式4のように表現される。
先に述べたように、隣接行列Fの行見出しは終点単語であり、列見出しは始点単語である。各行または列がどの終点単語または始点単語を示すかをわかりやすくし、説明を簡便にするために、隣接行列には見出しを付した。
数式4の隣接行列Fを各行について展開して説明する。第1行目の終点単語x1の行は、いずれの始点単語列との交点も0になっており、終点単語x1は始点を持たないこと(すなわち入力単語であること)が示されている。終点単語x2についても同様である。第3行目の終点単語x3の行は始点単語x4とx5の列との交点が1、その他の始点単語列との交点が0になっており、終点単語x3はx4とx5を始点単語として持つことが示されている。以下、終点単語x4から終点単語x7の終点単語についても、同様に、どの単語を始点単語として持つか(あるいは持たないか)が示されている。
数式4の隣接行列の各行は、以下のような数式でも表すことができる。左辺が行見出しとなる終点単語、右辺は、交点の値が1となった列見出しの始点単語を表す。右辺の「0」は、いずれの交点の交点の値も「0」であることを表す。
x1=0
x2=0
x3=x4+x5
x4=x2+x5
x5=x1
x6=x3+x7
x7=x4+x6
ここで、「+」は、後述するように、通常の四則演算における「加える」の意味でなく、本明細書中の単語の関係を表す数式においては、左辺の状態単語(終点単語)を決める半順序集合の始点単語が複数あるときにこれらを付加して左辺の単語を規定することを示す演算子(以下、「付加演算子」と呼ぶ)として用いている。
以上より、したがって、数式3で定義される単語の関係は、図3の有向グラフで表される関係及び数式4の隣接行列による数学的表現で記述される関係と等価であるということがいえる。
(II−2)隣接行列Fと状態ベクトルXで表す終点単語のための状態モデル
前述の(II−1)項では、n個の単語の「終点単語の他の単語との関係」を表すためのモデルとして、有向グラフと隣接行列を考察した。次に、n個の単語の「終点単語の値の状態」を表すためのモデルについて述べる。まず、n個の単語の始点単語としての状態を縦列のベクトルXに記録する(ベクトルとは1つの列あるいは行しか持たないマトリックスである)。数式4の隣接行列に表された単語の例で説明すると、始点単語が表示される順序、x1からx7の順序に各始点単語の状態を表したベクトルXは、たとえば下記の数式5のように表すことができる。各行がどの始点単語を示すかをわかりやすくし、説明を簡便にするために、ベクトルには見出しを付した。
このとき、ベクトルXは、始点単語x1とx2の状態は「+1」、始点単語x3の状態は「−1」、x4からx7の始点単語の状態は「null」であることを示している。
単語を生成し得る値の状態は次のように3種類に設定される。
+1:値は真であるとして決定済みである。
−1:値)は偽であるとして決定済みである。
空(null):値は未決定である。
入力単語の初期値は以下の通りである。
1:値は真であるとして決定済みである。
(適切に入力されている状態)
−1:値は偽であるとして決定済みである。
(適切に入力されていない状態)
従って、たとえ数式1が実行されるとしても、状態は変化しない。
状態単語の初期値は空である:
空:値はまだ決定済みでない。
(移動していない、あるいはまだ計算されていない状態)
状態単語について考察するに、単語の関係を表す隣接行列Fの上に単語の状態を表す状態ベクトルXを作用させるということは当該単語の順序で数式1を横列で実行することである。順番にn個の式を使う処理は順序処理と呼ばれる。その始点単語のすべての状態が+1であるとき、状態単語の状態が+1(真)になり、状態単語の値は決定済みとなる。
始点単語ではない単語の状態はその式の終点単語の状態とは関係していない。順序処理が繰り返されることは繰り返し処理と呼ばれる。たとえそれが繰り返されるとしても、「真」であるとして決定が済んでいない単語は、偽の状態(−1)になるか、あるいは空のままである。上記のことが「有向グラフ」で表現されると以下のようになる。
(1)もしノードが閉じられたループに含まれなかったなら、そして、もしいずれかの始点単語に係るノードから次々に始点単語を探索した際に当該始点単語の値が偽であるなら、ノード(単語)の値は決定されない。もし単語の値がユーザの必要条件を満たさなかったならノードの値は決定されない。たとえ値が成功裏に計算されるとしても、ノード(単語)の値が偽と決定される。
(2)もしノードが閉じられたループに含まれなかったなら、そして、もしすべての始点単語が、そのノードから次々に始点単語を探索したとき真であるなら、ノードの値は真として決定される。
(3)ノードが閉じられたループに含まれるときであって、ノードの始点単語がシステムに存在しないとき、ノード(単語)の値は空のまま残る。
(例2)
例1の場合、図3において、x3、x4、x5、x6及びx7の状態は、この場合における終端の始点単語であるx1及びx2の状態に依存する。同図から明らかなように、終端の始点単語であるx1が真になるとき、x5は真である。終端の始点単語であるx1及びx2が真であるとき、x4及びx5が真になる。x6及びx7はループにあるので空のままである。
(II−3)隣接行列Fと状態ベクトルXの計算操作
n個の単語の状態はベクトルX(列1つからなる行列)に、単語の順序に従って記録される。隣接行列Fと状態ベクトルXを用いて繰り返し処理を実行して計算した状態と同じ状態を表すように、算術演算子が定義される。言い換えれば、FとXの乗算は以下のようになる。
m回目の隣接行列Fと状態ベクトルXの積である、状態ベクトルXmの要素xm,i(m回目の繰り返し処理後の単語xi)は以下のような式で表せる。
乗算演算子(・)の左側のfIjには、隣接行列Fのi行目の終点単語においてj列の始点単語Xjが使われているか否かを表す指数1か0(始点単語となる場合が1、始点単語とならない場合が0)が与えられる。乗算演算子(・)の右側のxm,iには、m回目の繰返し処理中のベクトルXのi行目に表された始点単語xiの状態を示す3種類の指数+1(真)、−1(偽)、null(ここでnullは空を意味する)が与えられる。
数式4の隣接行列Fと数式5のベクトルXを例にして、終点単語x3の3回目の繰返し処理を数式7で表すと以下のようになる。
数式4のy3行と始点単語x1列との交点は「0」、数式5で示されたx1の状態を表す列の第1行は「+1」、よって、f3,1・x3,1は「0・(+1)」となっている。数式4のy3行と始点単語列との交点総てについて、その指数と数式5に示された対応する状態指数を乗算演算子で結び、付加演算を用いて列記していくと上記の式となる。
ここで、乗算演算子(・)の演算結果を次のように定義する。
(公理1)
数式8の公理は以下のことを示している。始点単語指数が0であれば、始点単語の状態が何であれ、始点単語の状態は真(+1)となり、終点単語の状態に影響を与えない。始点単語指数が1の場合は、始点単語の状態はそのまま変化せず、始点単語の状態が終点単語の状態に営業を与える。
次に、付加演算子(+)の演算結果を次のように定義する。付加演算子に用いる値は、公理1の演算結果である。
(公理2)
上記の公理2は、さらに右辺によって類別してみると、
数式9乃至10から明らかなように、付加演算子(+)の意味については、例えばもし、左辺に(−1)が1個でもあれば右辺は(−1)となる。もし左辺に(−1)がなく、かつ空(null)が1個でもあれば、右辺は空である。もし左辺のすべてが(+1)であるなら、右辺の状態は、終点である右辺の値がユーザ要件を満たす場合は(+1)、ユーザ要件を満たさない場合は(−1)である。
公理1及び2を使うことによって、次の定理が証明される。
(定理1)
終点単語の状態が(+1)(真)になるのは、始点単語の総ての状態が(+1)(真)であり、かつ終点単語の値がユーザ要件を満たす場合である<公理2第1群>。
(証明)
もし単語の状態が(+1)(真)であるなら、それは公理1によって、その単語が始点単語として用いられるとき、1・(+1)=(+1)であるから始点単語は(+1)(真)になる。その単語が始点単語として用いられない場合については、それは0・*=(+1)(*は3つの状態のいずれかを表す)であるから、単語の状態がいずれであっても、公理2に用いる始点は(+1)(真)となる。付加演算が実行された結果が(+1)(真)になるのは、公理2によって、定理1の場合以外には考えられない。
(定理2)
終点単語の状態が(−1)(偽)になるのは、始点単語の状態が1つでも(−1)であるときか、あるいはすべての始点単語が(+1)(真)であってかつ終点単語の値がユーザ要件を満たさない場合である<公理2第2群>。
(証明)
もしいずれかの始点単語として用いられる単語の状態が(−1)であるなら、公理1によって1・(−1)=(−1)であるから、始点単語の状態は(−1)(偽)になる。そのために、結果が公理2によって(−1)(偽)になる。すべての始点単語が(+1)(真)であるときは、定理1及び<公理2第2群>によって、(−1)(偽)になると証明される。
(定理3)
終点単語の状態が(未決定である)空になるのは、1個以上の始点単語の状態が空であり、かつ始点単語の残りの状態が(+1)(真)である場合である<公理2第3群>。
(証明)
もし1個以上の始点単語の状態が空であって、残りの始点単語の総てが(+1)(真)あるなら、公理2によって終点単語の状態は空になる。
一巡処理はXm=FXm−1によって表せる。繰り返し処理が継続されると以下のようになる。
Fmは通常のマトリックスの積として定義される。Fmの要素(i,j)はマイナスでない整数である。
終点単語の状態は一巡処理を繰り返す繰り返し処理によって空から(+1)または(−1)に変化する。その状態については、たとえ(+1)(真)のものと(−1)(偽)のものとが繰り返しプロセスを実行するとしても、終点の状態は変化しない。有向グラフによって表現した際、グラフに閉じられたループが存在し、終点が閉じられたループ内にあるとき、あるいは、このシステムが始点を持っていないとき、何度もそれを繰り返すとしても、終点単語の状態は空のままである。「状態に変化がない(すなわち、固定点fixed pointに達した)」ことはXm+1=Xmで表わされ、数式6を用いると、次のようになる。
Fm+1X0=FmX0
この時
F: 隣接行列
X: 状態ベクトル(単語の状態を列で示す)
X0: 初期状態、すなわち全ての要素がnull
m: 繰り返しの数
この方程式が有効なとき、プログラムは停止する。
III.不要な繰り返しを回避する方法(実行順序の並び替え)
(III−1)隣接行列の性質
(II−2)で、数学的構造モデルが確立された。ユーザ要件のすべての特性が隣接行列のみで示される。したがって、この隣接行列の特性を調べるのは非常に重要であって、有用である。
隣接行列Fの特性を利用して、不要な反復を避けるための方法を示す。どんなプログラム(アルゴリズム)も、再帰的な方法のみを用いて説明することができる。手続的には、再帰はwhileループ(繰り返しの終了条件をwhileで指定したループ)によって実現される。
数式6を使用して、「いかなる状態変化もない」(すなわち、「定点に達する」)という状態は、以下のように示される:
この公式が有効になるとき、プログラムは止まることになる。
このとき、行列Fには、どんな特性があるか?行列Fmの特性は何であるか?これらの疑問に答えるために、定理4を導入することが必要である。
空でない有限集合Vの組G=(V、E)とV×Vの部分集合Eは有向グラフと呼ばれる。Vの要素は頂点もしくはポイント(点)と呼ばれ、Eの要素(u,v)は縁もしくは矢と呼ばれる。Gのポイントの有限系列P、P=<v1,v2,...,vn>はv0からv1に至るパスと呼ばれ、各i(1≦I≦n)について、(vi−I,vi)∈Eが成り立つときには、nはこのパスの長さと呼ばれる。v0はPの始点、vnは終点と呼ばれる。<v0>は長さゼロのパスである。パスは隣接している矢の方向と共にGのポイントを追従する道筋である。
(定理4)
有向グラフVの隣接行列をAと定義する。Anの(i、j)要素は、互いに異なるGのviからvjまでの長さnのパスの数である。
m=1、m=2、…と連続して計算しFm+1X0=FmX0が成立するときにはプログラムが停止する。FとFmのプロパティを検証する。X0の全要素が常にヌル(空)なので、Fはシステムの全プロパティを表す。
1)Fm=0である場合 (m≦n)
Fmのすべての要素が0である。定理4を用いれば、閉鎖ループがこの隣接行列の有向グラフに存在しないことが証明される。変数mはその有向グラフの最も長いパスの長さを表す。Fの固有値はすべて0である。零べき行列(Fm=0)のプロパティから、対角に要素0を持つ下三角形のマトリクスFに再配列することができる。即ち、
F’=P−1FP、ここでPは正方行列もしくは長方形行列。
理由は、F(FmX0)=FmX0,Fm+1X0=FmX0
が有効であるからである。Xmのすべての要素は(+1)か(−1)である。
2)Fm≠0である場合 (m≦n)
もし、閉じたループがこの隣接行列の有向グラフに存在した場合、対角の要素fii (r):i=1,…,n of Frに1つ以上の整数が現れることが、定理4を使って証明される。このとき、変数rは最も短い閉じたループである。Fの固有値は、総てが0ではない。言い換えれば、固有値の1つは0と等しくない。総てのX0値が空(null)なので、Fm+1X0=FmX0は有効である。変数mは、その有向グラフのループの前の最も長いパスの長さを表す。Xmの例では、Xm=t[(+1),(+1),(null),(null),(null),(null)]。
もし、閉じたループが有向グラフに存在しなければ、その隣接行列は零冪行列(Fm=0)となる。この特性は重要である。
(III−2)繰り返しプロセスを不必要にする単語の並べ方
「有向グラフ」で表現する際に、前述の第III章1項で示したように、閉じられたループ内で始点単語・終点単語である関係がないときには、隣接行列が下三角行列になり、対角の三角形が0になるような一巡処理順序に単語を並べることによって、繰り返しプロセスを避けることができる。
分析的に規則正しい行列Pを得るのは困難である。F’=P−1FPを用いる代わりに、トポロジカル・ソートを用いる。半順序関係が与えられているとき、最初にするべき仕事から終わりにするべき仕事まで、データを一列に並べることをトポロジカル・ソート(topological sort)と呼ぶ。半順序関係(partial order)であるから、答えが常に唯一的に決定されるわけではない。
有向グラフに深さ優先探索(depth first search:縦型検索ともいう)をしつつ、戻るときにノードを拾い上げるという方法によって、トポロジカル・ソートを実行することができる。各ノードからこれを行い結果を逆順にならべる。順序処理(一巡処理)における単語を並べるには、この方法によって単語を並べさえすればよい。
図4は、あるノード1乃至8が形成する特定の順序関係を表した有向グラフである。
即ち、同図に示す例においては、先に定義した始点単語と終点単語との関係を用いて次のように規定できる。
ノード2≦ノード1
ノード1≦ノード3
ノード3≦ノード4、ノード5≦ノード4
ノード2≦ノード5
ノード5≦ノード6
ノード3≦ノード7、ノード6≦ノード7、ノード8≦ノード7
ノード6≦ノード8
(例4)
図4に示される有向グラフの隣接行列は次の数式13の通りである。
図4の有向グラフでは閉じられたループ内で始点単語・終点単語の関係がない。そこで、この半順序関係に係る隣接行列が下三角行列になるように、トポロジカル・ソートを行う。具体的には次のように行う。
(1)有向グラフに対する深さ優先探索を実行する。即ち、一例として、ノード1を始点とすると、ノード1を出発して連結されている未訪問のノードを半順序関係を守って探索(即ち、連結される未訪問のノードまで進み、行き場所がなくなったら、行ける場所があるノードまで戻って(再帰)再び進めるだけ進み、行き場所がなくなったら終了(再帰からリターン):これを「再帰的に進む」ともいう)する。これにより、ノード1→ノード3→ノード4(*)→ノード3→ノード7(*)→ノード3(*)→ノード1(*)を得る。但し、(*)は再帰の時点を示す。
(2)次に、始点をノード2に移し、上記と同様の探索を行う。すでに訪問したところは進まない。これにより、ノード2→ノード5→ノード6→ノード8(*)→ノード6(*)→ノード5(*)→ノード2(*)を得る。
(3)その他のノードを始点として探索をするところ、すでに全ノードを訪問済みなので探索は終了する。
(4)戻る(再帰の)ときのノードを拾い上げる。具体的には、(1)(2)で(*)の時点のノードを拾い上げる。上の例では、ノード4(*)→ノード7(*)→ノード3(*)→ノード1(*)→ノード8(*)→ノード6(*)→ノード5(*)→ノード2(*)を得る。
(5)順序処理(一巡処理)における単語を逆順に並べる。即ち、(4)で拾い上げたノードの列を逆に並べたものを一つの解として得る。上の例では、ノード2→ノード5→ノード6→ノード8→ノード1→ノード3→ノード7→ノード4が求める一つの解である。
以上より、トポロジカル・ソートの結果は(1,2,3,4,5,6,7,8)→(2,5,6,8,1,3,7,4)である。(「ノード」の表記は省略する。)
このトポロジカル・ソートの具体的な方法についてフローチャートを用いて説明すると次のようになる。図5はトポロジカル・ソートの動作を説明するためのフローチャートである。
まず、初期値を、a=1,I=1と設定する(ステップ501)。
次に、a=a+1とし、始点をノードaに設定する(ステップ502)。
ここから探索を開始する。具体的には、訪問可能な連結されているノードで未訪問のところがないかを判定する(ステップ503)。これについては、例えば、各ノードに訪問フラグを設定、初期値に0(未訪問を示す)を入れておき、当該ノードが訪問されたときには訪問フラグを1にするなどの方法により自動判定させることができる。
ここで未訪問ノードが存在するときには、1ノード進み(ステップ504)、ステップ503に戻る。
未訪問ノードが存在しないときには、1ノード戻り(再帰)、I=I+1とする(ステップ505)。このとき、再帰に係るノードを再帰ノード列I番目の要素として退避する(ステップ506)。
次に、再帰の結果ノードaに戻ったかを判定し(ステップ507)、まだ戻っていなければステップ503に戻る。ノードaに戻った場合には始点をノードaとする探索は終了する。即ち、再帰からリターンし、I=I+1とし(ステップ508)、再帰点を先の再帰ノード列I番目の要素として退避する(ステップ509)。
ここで全ノードが探索済みかどうかをチェックする(ステップ510)。まだ探索を行っていないノードが存在する場合には、始点を替えて再度探索を始めるため、ステップ502に戻る。全ノードの探索が終了しているときには、探索は終了し、退避してあった再帰ノード列を逆順に並べる(ステップ511)ことで、並び替えの1候補を得て、一連のトポロジカル・ソートの動作を終了する(ステップ512)。
このように、トポロジカル・ソートのアルゴリズム自体を上記で説明したフローチャートに沿ってプログラム化すれば、トポロジカル・ソートの自動プログラムを得ることができる。
さて、上記によりFをトポロジカル・ソートした。その結果、F’(トポロジカル・ソートされたF)は次の数式14のようになる。
トポロジカル・ソートの結果、一巡処理の順序は、「1,2,3,4,5,6,7,8」から「2,5,6,8,1,3,7,4」となった。
このようにF’が得られるが、このF’はその形から明らかなように上三角形に当たる総ての項が0である下三角行列になっている。この(ソート済み隣接行列である)F’は(上三角形部分には0しかないため)その構造上、あるノード(終点単語)を求めるための始点単語は当該ノードより(ソート済み隣接行列における)上の行のノードにしかない。従って、F’の行の上位から順番に値を求めていけば、Fで同じことを行う場合に比べて、繰り返しや遡りを行うことなくスムーズに総てのノードについて値が求まる。
さて、次に、上記で説明したトポロジカル・ソートをLyee(登録商標)方法論において応用する方法の一つを説明する。
図6は、Lyee(登録商標)方法論における単語単位の論理要素をノードとして上記のトポロジカル・ソートを用いて繰り返しをなくすための自動制御の動作を説明するためのフローチャートである。
同図に示すように、まず、単語ごとの論理要素(これらをノードと考える)間の関係を規定する(ステップ601)。
このためには例えば有向グラフの作成(ステップ602)を行っても良いが、これに限定されるものではない。
次に、ノードについての(上記説明した)隣接行列を定義する(ステップ603)。
この隣接行列に対して上述のトポロジカル・ソートを実行する(ステップ604)。トポロジカル・ソートの詳しいアルゴリズムについては図5及び対応する説明で詳述したので、ここでは割愛する。また、ここでは探索技法の一例としてトポロジカル・ソートとして説明したが、このステップ604では前述の他の探索の実行を行っても良いのはもとよりである。
最後に、トポロジカル・ソートの結果得られた1解に基づき、当該単語単位の論理要素(ノード)を並び替え(ステップ605)、当該動作を終了する(ステップ606)。
なお、隣接行列定義のステップ(ステップ603)については、本稿では理解の容易さを助けるために入れたが、本質的には必須のステップではない。つまり、隣接行列を定義することなく、単語ごとの論理要素間関係の規定(ステップ601)から、直接に、或いは有向グラフ作成(ステップ602)を介して、トポロジカル・ソート等の探索のステップ(ステップ604)に至ることも本発明の思想の範囲内であり、本発明の目的とするところを実現し得る。
このように、Lyee(登録商標)のソフトウェア生成自動プログラムにかける前の段階で、Lyee(登録商標)方法論によるユーザ要件から抽出した単語ごとの論理要素に対してトポロジカル・ソートをかけることで繰返しの省かれたLyee(登録商標)方法論によるソフトウェア生成が可能となる。
換言すれば、上記のノードをLyee(登録商標)方法論における単語ごとの論理要素と考えれば、上記の方法でF’を求めることで、ある単語について値を求める(有意性を決定する)に当たって、何回も繰り返し処理を行うことなく1回のRUNのみで目的を達することが可能となる。
さらに、上記のようなトポロジカル・ソートのアルゴリズムは、上記の説明から明らかなように、それ自体をソフトウェアとしてプログラミングして自動化することが可能である。
従って、Lyee(登録商標)方法論によるソフトウェア自動生成方法についてそれをさらに効率化・高品質化するのにも自動化を図れることになる。
なお、上記の説明においては、有向グラフに表される単語の順序関係として主として半順序関係を持つ場合について説明したが、半順序関係のみならず、全順序関係について、或いは全順序関係及び半順序関係が混在する場合についても上記の説明が該当することはもとよりである。
また上記の説明においては、理解のしやすさの観点から、有向グラフの作成を行った後に隣接行列を作成する点を説明したが、有向グラフの作成を介さずに、単語単位のプログラム相互の関係から直接隣接行列を作成するようにしても本発明は実現できる。
すべての単語で作るべきプログラムの構造と当該プログラムを制御するのに用いるパレット連鎖関数のプログラムの構造は、上記の記述で明確になった。そして、それらが数学上適切に動くことが証明された。
IV.むすび
以上詳細に説明したように、本発明では、単語の状態を定義している単語単位をベースにするプログラムの数学的な構造モデルを作成し、それをLyee(登録商標)方法論によるソフトウェア開発に適用することで、より高効率、高速、高パフォーマンスの開発を実現した。
単語の状態は完全な半順序を構成する。それは単語の最小要素(極小点)として 空を持っている。有向グラフとその隣接行列とを使って、この構造モデルは数学的な面からも正しいといえる。
さらに、本発明ではパレットの一般的な考えと基本構造の正当性を考察した。それらは実務上、プログラムを作るために必要である。また、順次読込(sequential read)のようなアルゴリズム、合計値算出を実現するための構造について説明した。これらの一般的な考えはLyee(登録商標)のシステム開発方法論で使われる。それは多くの産業的な応用分野ですでに実用的に有効とされた多くの結果をもたらしている。
人間であるユーザと、外の装置とのインタフェース及びコミュニケーションについても論じられている。これは、このようなシステムのタイプのために、単語単位をベースとするプログラムとして設計する(モデリング)ことの、実際の作業を正当化する。
以上を要するに、本発明によれば、数学的な考え方、手法、解析法をLyee(登録商標)のソフトウェア開発論、開発技術に適用・応用するので、ソフトウェア開発をより効率良く、高速に、精密に実現することができる。
本発明は当該技術分野における通常の知識を有する者にとって修正および改変が容易に数多くなし得るので、図示および記述されたものと寸分違わぬ構成および動作に本発明を限定することは望ましくないことであり、従って、あらゆる適切な改変体および等価体は本発明の範囲に含まれるものと見なされうる。前述の本発明に係る実施の具体的形態の説明および例示によって詳細に記述されたが、本願の特許請求の範囲のみならず本発明に係る開示事項全体に定義された本発明の範囲から逸脱することなしに、修正、置換、および、変更が数多く可能である。
また、本願に係る発明は、その適用において、上記の記述において説明されるか、或いは、図面に示された要素の詳細な解釈及び組み合わせに限定されるものではない。本発明は、他の実施形態が可能であり、種々の方法で実用および実施可能である。また、ここで用いられた語法および用語は記述を目的とするものであり、限定的に働くものとみなされてはならない。
従って、当該技術分野における通常の知識を有する者は、本開示の基調となる概念は、本発明の幾つかの目的を実施するための他の構造、方法、及び、システムを設計するための基礎として容易に利用され得ることを理解するはずである。従って、本発明の趣旨および範囲から逸脱しない限り、本願の特許請求の範囲にはそのような等価な解釈が含まれるものと見なされるものである。
上記の詳細な説明では、有向グラフ表記、隣接行列算出、トポロジカル・ソート、並び替えという順序で本発明の思想を実現する方法について述べた。しかしこれらはどれも絶対不可欠な要素というものではなく、例えば、有向グラフ表記の表記を経ないで直接隣接行列算出→トポロジカル・ソート→並び替えという順序で本発明の思想を実現してもよい。
さらに、有向グラフに対して、例えば幅優先探索(Breadth−First Search)、反復深化法(Iterative Deeping)、発見的探索(Heuristic Search)、ヒル・クライミング(Hill Climbing)、最適優先探索(Best−First Search)、オイラー(Euler)の一筆書き、ダイクストラ(Dijkstra)法等の各種探索技法を組み合わせることで並び替えてもよい。
或いは、隣接行列算出のあとを、これらの各種探索技法を組み合わせることで本発明の根本思想を実現してもよい。
また、本発明に係る技術思想は、例えばコンピュータソフトウェアの自動開発装置、自動開発プログラム、自動開発プログラムを記録した記録媒体、伝送媒体、紙媒体としても、また、自動開発プログラムを登載したコンピュータ・装置、自動開発プログラムを実行するクライアント・サーバ形式等といったカテゴリーにおいても実現、利用可能であることはいうまでもない。
図7は、本発明をソフトウェア開発装置として実現する場合の機能構成を示したブロック図である。即ち、同図に示す一例においては、ソフトウェア開発装置1000として、次の要素を備えさせる。
制御部1010は全体の制御及びLyee(登録商標)方法論に基づいたソフトウェア開発を自動的に行う機能を有する。即ち、後述する(有向グラフ作成部1050、)隣接行列計算部1060及びトポロジカルソート部1070により並び替えられた単語単位プログラム群をLyee方法論に自動的に適用して生成コードを得る機能を有している。
情報入力部1020は(図示しない)画面等を通じて、Lyee(登録商標)に係るユーザ要件を初めとする人間の意思をコンピュータに入力するインターフェースとしての機能を果たす。情報取得部/通信部1030は外部との通信や(ソフトウェア開発装置1000にある場合の)データベース1040、1041等との情報の授受を行う。なお、この例ではデータベース1040、1041はソフトウェア開発装置1000内に持っていてもよいことはもとよりである。
有向グラフ作成部1050は、制御部1010の制御に基づき、上記で説明したように、Lyee(登録商標)に係るユーザ要件から半順序関係を割り出し、それを有向グラフとして作成する機能を有する。隣接行列計算部1060は、制御部1010の制御に基づき、有向グラフ作成部1050で作成された有向グラフについて、上記で説明したような隣接行列を計算・作成する。トポロジカルソート部1070は、制御部1010の制御に基づき、隣接行列計算部1060で計算・作成された隣接行列に対して、上記で説明したようなトポロジカルソートを実行する機能を有する。
なお、上記トポロジカルソート部1070は探索を行う機能を持つ一例であって、上述のように、他の探索手法を実現する機能を有する探索部(一般)としても本発明の思想は実現される。
このように構成することにより、これら各部(1010〜1070、従って1000)は総て自動化できるので、結局繰返し処理の排除→ソフトウェア生成まで一貫して自動処理が可能となり、ソフトウェア生産速度、効率は各段に向上する。
このように、各機能を、それを実現するようにプログラムとして組んだソフトウェアとして、或いはそのようなソフトウェアを例えばROM(ReadOnlyMemory)に書きこみ、かかるROMを組み込んだ全体システム(装置)とすることで、前述した本発明に係る各要素をソフトウェアとして、或いはそのようなソフトウェアが組み込まれたソフトウェア開発装置として実現している。
さらに本発明は、単一プロセッサ、単一ハードディスクドライブ、及び、単一ローカルメモリを備えたコンピュータシステムに限らず、当該システムのオプションとして、任意の複数または組み合わせプロセッサ又は記憶デバイスを装備するにも適している。コンピュータシステムは、精巧な計算器、掌タイプコンピュータ、ラップトップ/ノートブックコンピュータ、ミニコンピュータ、メインフレームコンピュータ、及び、スーパーコンピュータ、ならびに、これらの処理システムネットワーク組合わせを含む。本発明の原理に従って作動する任意の適切な処理システムによって代替されうるし、また、これらと組合せて用いることも可能である。
また、本発明に係る技術思想は、もとよりあらゆる種類のプログラミング言語に対応可能である。さらに本発明に係る技術思想は、あらゆる種類・機能のアプリケーションソフトウェアに対しても適用可能である。
またさらに本願発明は、その技術思想の同一及び等価に及ぶ範囲において様々な変形、追加、置換、拡大、縮小等を許容するものである。また、本願発明を用いて生産されるソフトウェアが、その2次的生産品に登載されて商品化された場合であっても、本願発明の価値は何ら減ずるものではない。
以上、詳細に説明したように、本発明によれば、Lyee(登録商標)方法論によるソフトウェア開発において、より高効率、高速、高パフォーマンスを実現することができる。
本発明では、繰返しをなくす前処理を自動で行い、こうして得られた前処理済の単語単位のプログラムをもとにLyee(登録商標)方法論により自動的に目的プログラム生成を行うことで、ソフトウェア生産の大幅な効率向上、生産性向上、品質向上等、ソフトウェア産業上に大きな効果をもたらす。
Claims (10)
- ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表し、
前記表された有向グラフに対して探索を施し、
前記探索の結果をもとに前記単語単位プログラム群を並び替える
ことを特徴とするソフトウェア開発前処理方法。 - ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、
前記生成された隣接行列に対して探索を施し、
前記探索の結果をもとに前記単語単位プログラム群を並び替える
ことを特徴とするソフトウェア開発前処理方法。 - 前記探索はトポロジカル・ソートによることを特徴とする請求の範囲第2項記載のソフトウェア開発前処理方法。
- ソフトウェア開発のユーザ要件中の単語についての有意性規定関係から隣接行列及び状態ベクトルを生成し、
前記隣接行列と前記状態ベクトルとを所定の公理に基づき計算し、
前記計算の結果から、単語の状態を把握する
ことを特徴とするソフトウェア開発前処理方法。 - 前記単語単位プログラム相互の順序関係に係る集合が閉じる単位である基本構造が複数ある場合には、1の基本構造の出力の最終値を境界エリアに出力することを特徴とする請求の範囲第1項または第2項記載のソフトウェア開発前処理方法。
- 前記単語単位プログラム相互の順序関係に係る集合が閉じる単位である基本構造が複数あって、当該基本構造同士が閉じられたループを形成する場合には、当該ループ中のノード(基本構造)を結合することを特徴とする請求の範囲第1項または第2項記載のソフトウェア開発前処理方法。
- ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係を有向グラフで表すことを特徴とするソフトウェア制御方法。
- ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係に係る集合が閉じる単位で基本構造単位を構成し、
前記構成された基本構造単位をノードとして捉えた有向グラフで表すことを特徴とするソフトウェア制御方法。 - ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成し、
前記生成された隣接行列に対して探索を施し該探索の結果をもとに前記単語単位プログラム群を並び替え、
前記並び替えられた前記単語単位プログラム群をLyee方法論に適用してコードを生成する
ことを特徴とするソフトウェア開発方法。 - ソフトウェア開発要望に係る単語ごとのエリアに値を求めるための単語単位プログラム相互の順序関係から隣接行列を生成する隣接行列計算部と、
前記生成された隣接行列に対して探索を施し該探索の結果をもとに前記単語単位プログラム群を並び替える探索部と、
前記並び替えられた前記単語単位プログラム群をLyee方法論に適用してコードを生成する生成部と
を具備することを特徴とするソフトウェア開発装置。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003019588 | 2003-01-28 | ||
JP2003019588 | 2003-01-28 | ||
PCT/JP2003/009591 WO2004068342A1 (ja) | 2003-01-28 | 2003-07-29 | ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JPWO2004068342A1 true JPWO2004068342A1 (ja) | 2006-05-25 |
Family
ID=32820612
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2004567562A Pending JPWO2004068342A1 (ja) | 2003-01-28 | 2003-07-29 | ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置 |
Country Status (5)
Country | Link |
---|---|
US (1) | US20060265695A1 (ja) |
EP (1) | EP1591887A1 (ja) |
JP (1) | JPWO2004068342A1 (ja) |
AU (1) | AU2003252292A1 (ja) |
WO (1) | WO2004068342A1 (ja) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20060121880A (ko) * | 2003-09-22 | 2006-11-29 | 카테나 가부시키가이샤 | 소프트웨어 생성방법 |
US8392008B2 (en) * | 2006-10-20 | 2013-03-05 | Rockwell Automation Technologies, Inc. | Module arbitration and ownership enhancements |
US7844349B2 (en) * | 2006-10-20 | 2010-11-30 | Rockwell Automation Technologies, Inc. | Standard MES interface for discrete manufacturing |
US7894917B2 (en) * | 2006-10-20 | 2011-02-22 | Rockwell Automation Technologies, Inc. | Automatic fault tuning |
US8601435B2 (en) * | 2006-10-20 | 2013-12-03 | Rockwell Automation Technologies, Inc. | Module class subsets for industrial control |
US20080095196A1 (en) * | 2006-10-20 | 2008-04-24 | Rockwell Automation Technologies, Inc. | Unit to unit transfer synchronization |
JP4958574B2 (ja) * | 2007-02-09 | 2012-06-20 | 秀晃 岡崎 | プログラム論理の検証方法、プログラム論理の検証プログラム |
US8296744B2 (en) * | 2008-10-03 | 2012-10-23 | Microsoft Corporation | Tree-based directed graph programming structures for a declarative programming language |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5193190A (en) * | 1989-06-26 | 1993-03-09 | International Business Machines Corporation | Partitioning optimizations in an optimizing compiler |
CA2010056C (en) * | 1990-02-14 | 1998-05-12 | Charles Brian Hall | Method for improving the efficiency of arithmetic code generation in an optimizing compiler using machine independent update instruction generation |
JP3175768B2 (ja) * | 1990-06-19 | 2001-06-11 | 富士通株式会社 | 複合型命令スケジューリング処理装置 |
JP3461636B2 (ja) * | 1995-10-24 | 2003-10-27 | 富士通株式会社 | データ処理装置 |
JP2001005651A (ja) * | 1999-06-21 | 2001-01-12 | Institute Of Computer Based Software Methodology & Technology | ソフトウェアの決定方法、ソフトウェアの使用方法、記録媒体、処理装置、ソフトウェアの保守方法、ソフトウェアの移植方法、ソフトウェアの管理方法、処理経路図の作成方法、パレット関数の作成方法、パレットの領域の決定方法、パレット連鎖関数の作成方法、位相要素の作成方法、論理要素の作成方法、作用要素の作成方法、ソフトウェアの実装方法、ソフトウェア開発方法、データ構造の置換方法、データ値の置換方法、従来型プログラムの分析方法、ソフトウェア開発管理方法、ソフトウェアの運用管理方法、並列コンピュータ及び判断補助装置 |
-
2003
- 2003-07-29 JP JP2004567562A patent/JPWO2004068342A1/ja active Pending
- 2003-07-29 WO PCT/JP2003/009591 patent/WO2004068342A1/ja not_active Application Discontinuation
- 2003-07-29 US US10/543,303 patent/US20060265695A1/en not_active Abandoned
- 2003-07-29 AU AU2003252292A patent/AU2003252292A1/en not_active Abandoned
- 2003-07-29 EP EP03815603A patent/EP1591887A1/en not_active Withdrawn
Also Published As
Publication number | Publication date |
---|---|
US20060265695A1 (en) | 2006-11-23 |
EP1591887A1 (en) | 2005-11-02 |
WO2004068342A1 (ja) | 2004-08-12 |
AU2003252292A1 (en) | 2004-08-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Pettie | A new approach to all-pairs shortest paths on real-weighted graphs | |
Downey et al. | Parameterized complexity: A framework for systematically confronting computational intractability | |
Gerede et al. | Automated composition of e-services: Lookaheads | |
Kupferman et al. | Modular model checking | |
She et al. | Efficient synthesis of feature models | |
Bouajjani et al. | Abstract regular (tree) model checking | |
Yousefian et al. | A heuristic solution for model checking graph transformation systems | |
US8577825B2 (en) | System, method and device for solving problems in NP without hyper-polynomial cost | |
Grumberg et al. | Learning to order BDD variables in verification | |
Bos et al. | Formal specification and analysis of industrial systems | |
Partabian et al. | An approach based on knowledge exploration for state space management in checking reachability of complex software systems | |
JPWO2004068342A1 (ja) | ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置 | |
Ganesh | Decision procedures for bit-vectors, arrays and integers | |
JP2005115498A (ja) | ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置 | |
Marx | 3 Complexity of modal logic | |
Lustig et al. | Synthesis from recursive-components libraries | |
Sabharwal | SymChaff: exploiting symmetry in a structure-aware satisfiability solver | |
Czaja et al. | Computing in Cause-Effect Structures | |
van Emde Boas | Resistance is futile; formal linguistic observations on design patterns | |
Nikolaevich Voit et al. | Design workflows and algorithm diagrams interpretation method in software development | |
Glück | A practical simulation result for two-way pushdown automata | |
Drewes et al. | Context-exploiting shapes for diagram transformation | |
Bárány et al. | Decidable classes of documents for XPath | |
Weaver | Satisfiability advancements enabled by state machines | |
Strømme | Exploiting graph structures for computational efficiency |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20060725 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20090609 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20091110 |