(57)【要約】【課題】プログラムを、命令型言語（imperative language）から宣言型言語（declarativelanguage）へ形式的に変換することに伴う問題を解決すること。【解決手段】本発明は、コンピュータ用の命令型言語Ｌ１で表された所定のプログラムＰ中の変数Ｖ（Ｐ） を定義する第１のステップであって、該Ｐは一群の単語定義によって特定され、該単語定義の各々は一意的な単語に関するものである第１のステップと、所定の構文法及び意味論に基づいて、前記Ｐ中の演算式もしくは論理式であるｅを置換する第２のステップと、前記プログラムＰの各単位を対応する演算式もしくは論理式である式ｅに変換するための関数Ｄを、前記Ｖ（Ｐ）、ｅ、前記所定の構文法及び意味論に基づいて規定する第３のステップと、所定の規則に基づき、前記第３のステップで規定された関数Ｄを変換して宣言型言語Ｌ２で表されるプログラムＰ２を生成する第４のステップとを具備する。【選択図】図１
2008009463.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ用の命令型言語Ｌ１で表された所定のプログラムＰ中の変数Ｖ（Ｐ） を定義する第１のステップであって、該Ｐは一群の単語定義によって特定され、該単語定義の各々は一意的な単語に関するものである第１のステップと、
所定の構文法及び意味論に基づいて、前記Ｐ中の演算式もしくは論理式であるｅを置換する第２のステップと、
前記プログラムＰの各単位を対応する演算式もしくは論理式である式ｅに変換するための関数Ｄを、前記Ｖ（Ｐ）、ｅ、前記所定の構文法及び意味論に基づいて規定する第３のステップと、
所定の規則に基づき、前記第３のステップで規定された関数Ｄを変換して宣言型言語Ｌ２で表されるプログラムＰ２を生成する第４のステップと
を具備することを特徴とするプログラムの変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの変換方法に関するものである。
【背景技術】
【０００２】
ソフトウェア開発およびメンテナンスは、経済において非常に重要な活動となっている。何千億ドルもが、毎年、ソフトウェアの開発およびメンテナンスに使用され、この金額は年々増加している。ソフトウェア開発とメンテナンスに対するニーズのこうした増大に対処するために、言語、方法論、ツールが数多く提唱された。今日、我々の推定では、２０００以上の異なるプログラミング言語が存在し、こうした言語は、プログラミング言語のパラダイムと呼ばれる様々な原理 (命令型、オプジェクト指向型、関数型、論理型、並列型、など) に基づいている。
【０００３】
しかし、ソフトウェア・エンジニアリング分野における近年のめざましい進展にもかかわらず、ソフトウェア開発プロジェクトにおける失敗の数は非常に憂慮される状態にある、という統計が多い。つまり、支払いを受けただけで納入されなかったソフトウェア、納入されただけで使用されなかったソフトウェア、作り直したり放棄されたりしたソフトウェア、また、度重なる変更後にやっと使用されたソフトウェアなどが数多く存在する。基本的に、このことは、ソフトウェアそのものが複雑なために、その開発およびメンテナンスに必要な時間と費用の見積りが誤っている可能性が高いということに原因がある。また、今日のニーズに適切に見合う言語および方法論が不足していることにも原因がある。さらに、ソフトウェア開発が成功するかどうかは、どのプログラミング言語方法論を選択するかにも非常に左右され、この選択が、ソフトウェア開発およびメンテナンスの費用に重大な影響を及ぼしている。
【非特許文献１】エイ・ベイトマン、ジェイ・マーフィ著、「レガシーシステムの移築」、作業報告ＣＡ−２８９４、ダブリン市立大学コンピュータ応用学科
【非特許文献２】エル・エイ・べラディ、エム・エム・レーマン著、「巨大プログラム開発モデル」、ＩＢＭシステムズ・ジャーナル、１５（３）：ｐ．２２５−２５２、１９７６年
【非特許文献３】エム・ブローディ、エム・ストンブレイカ著、「ダーウィン：レガシー情報システムの段階的移行について」、技術レポートＴＲ−０２２２−１０−９２−１６５、分散オブジェクト・コンピューティング・グループ、１９９３年３月
【非特許文献４】フレミング・ニールソン、ハンネ・リース・ニールソン著、「アプリケーションについての意味論：公式紹介」、ワイリー・プロフェッショナル・コンピューティング、ＩＳＢＮ０  ４７１  ９２９８０  ８、ワイリー、１９９２年
【非特許文献５】根来  文生著、「Lyee ソフトウェアの原理」、２１世紀（ IS2000 ）における情報社会についての国際会議会報pp121- 189、日本、福島県会津、２０００年１１月
【非特許文献６】根来文生、アイ・ハミド（I.Hamid）著、「意思工学の提案」、データベースと情報システムの進歩に関する第５回東ヨーロッパ会議研究（ＡＤＢＩＳ’２００１）、リトアニア、ヴィルニウス、２０００年９月
【非特許文献７】ピー・プロトキン著、「プログラミング言語として考えられるＬｅｆ」、理論的コンピュータ科学 、５：２２３−２５５、１９７７年
【非特許文献８】ディー・スコット著、「ＩＳＷＩＭ、ＣＵＣＨ、ＯＷＨＹのタイプ理論的代替案」、理論的コンピュータ科学 、１２１（１−２）：４１１−４４０、１９９３年１２月６日
【非特許文献９】ビー・ウー、ディー・ローレス、ジェイ・ビスバル、ジェイ・グリムソン、ヴィ・ウェイダ、アール・リチャードソン、ディ・オサリバン著、「ちぎり方法論：レガシー情報システムの移住のためのゲートウェイ・フリー・アプローチ」、複雑なコンピュータ・システム技術についての第３回ＩＥＥＥ会議（ＩＣＥＣＣＳ  Ｓ９７）予稿集、イタリア、コモ、ヴィラ・オルモ
【発明の開示】
【発明が解決しようとする課題】
【０００４】
その結果として、驚くほど数多くのプログラミング言語 (ツール、方法論など) が存在するにもかかわらず、より単純で表現力に富み、かつ、効果的な新しいプログラミング言語を作り出そうとする研究分野は、今でもとても活発であり、その研究結果は非常に高く評価されている。特に、ソフトウェア消費者と開発者の両者にとって非常に興味深いのは、プログラムをある言語から別の言語へ変換することを可能にすることである。実は、こういったことが可能になると、組織の多くが、ソフトウェア・エンジニアリング分野の発展から恩恵を受け、新しいソフトウェア
(頻繁にアップデートを必要とするもの) を時代遅れの古い言語 (Cobol （商標）や Pascal （商標）など) を使って開発するのに多大な費用がかかるという問題を解決することが可能になる。
【０００５】
本発明は、プログラムを、命令型言語（imperative language）から宣言型言語（declarative
language）へ形式的に変換することに伴う問題を解決することを目的とする。そのために、簡単な命令型言語Ｌ１を定義する。Ｌ１は、命令型パラダイムに見受けられる基本的な命令文（statements）、つまり、代入、ループ、選択、条件分枝などをサポートする。また、宣言型言語
Ｌ２も定義する。Ｌ２では、プログラムが独立変数の定義の集合によって構成されており、この定義には、特別な算術式 (条件式あるいは再帰的式)
が含まれている。例えば、x = 5 + if (a < 3, 2 * a, a - 1) は、Ｌ２ の定義でありえる。ここでは、x
の値が、a < 3 の場合には 5 + 2 * a の値となり、それ以外の場合には 5 + (a - 1) の値となる。それぞれの言語に付随する意味論は表示的（denotational）で、そこでは、与えられた環境
(メモリー状態) におけるプログラムの意味論が、１つの環境となる。本発明は、最後に、Ｌ１ によるプログラムを、 (意味論的に) 同等なＬ２のプログラムに移行（migrate）する形式的変換関数（formal
translation function）を提案し、その正しさ (いかなるプログラムでも、元のバージョンの意味論が、変換されたバージョンの意味論と同等であること)
を証明することを目的とする。
【課題を解決するための手段】
【０００６】
本発明は、コンピュータ用の命令型言語Ｌ１で表された所定のプログラムＰ中の変数Ｖ（Ｐ） を定義する第１のステップであって、該Ｐは一群の単語定義によって特定され、該単語定義の各々は一意的な単語に関するものである第１のステップと、所定の構文法及び意味論に基づいて、前記Ｐ中の演算式もしくは論理式であるｅを置換する第２のステップと、前記プログラムＰの各単位を対応する演算式もしくは論理式である式ｅに変換するための関数Ｄを、前記Ｖ（Ｐ）、ｅ、前記所定の構文法及び意味論に基づいて規定する第３のステップと、所定の規則に基づき、前記第３のステップで規定された関数Ｄを変換して宣言型言語Ｌ２で表されるプログラムＰ２を生成する第４のステップとを具備する。
【０００７】
本発明では、標準的な命令型言語の単純なバージョンであるＬ１ を使用する。この言語には、代入（affectation）、条件命令、ループ、および、シーケンス、といった、基本的かつ重要な構文が含まれている。宣言型言語Ｌ２
は、Lyee （商標） から触発されたもので、ソフトウェアを変数定義の集合によって指定する。しかしながら、Lyee のアプローチとは異なり、変数の定義は、ループなどの特別な算術式を含む。また、Ｌ２
によるプログラムの定義は、全て互いに独立である。それぞれの言語に付随する意味論は表示的であり、そこでは、ある環境 (メモリー状態) におけるプログラムの意味論もまた
1つの環境となる。さらに、形式的変換関数 Ｄも提案する。この関数は、いかなるＬ１ プログラムも、同等なＬ２ プログラムに移行することが可能であり、この正しさを証明する。これにより、プログラムを命令型言語から宣言型言語に移行することを可能にする形式的方法が実現される。
【発明の効果】
【０００８】
本発明によれば、プログラムを単語定義の集合により要件指定する宣言型言語Ｌ２を定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Ｌ１を提案し、言語Ｌ１によるどんなプログラムも、言語Ｌ２による同等なプログラムに変換する関数Ｄを定義した。関数Ｄの正しさは、図１が変換可能であることを示すことにより証明された。これにより、プログラムを、命令型言語（imperative
language）から宣言型言語（declarative language）へ形式的に変換することに伴う問題が解決され、命令型言語から宣言型言語への機械的な変換が可能となる。
【発明を実施するための最良の形態】
【０００９】
［本発明の概要］
プログラムを、命令型言語（imperative language）から宣言型言語（declarative
language）へ形式的に変換することに伴う問題の研究について述べる。そのために、簡単な命令型言語Ｌ１を定義する。Ｌ１は、命令型パラダイムに見受けられる基本的な命令文（statements）、つまり、代入、ループ、選択、条件分枝などをサポートする。また、宣言型言語
Ｌ２も定義する。Ｌ２では、プログラムが独立変数の定義の集合によって構成されており、この定義には、特別な算術式 (条件式あるいは再帰的式)
が含まれている。例えば、x = 5 + if (a < 3, 2 * a, a - 1) は、Ｌ２ の定義でありえる。ここでは、x
の値が、a < 3 の場合には 5 + 2 * a の値となり、それ以外の場合には 5 + (a - 1) の値となる。それぞれの言語に付随する意味論は表示的（denotational）で、そこでは、与えられた環境
(メモリー状態) におけるプログラムの意味論が、１つの環境となる。最後に、Ｌ１ によるプログラムを、 (意味論的に) 同等なＬ２のプログラムに移行（migrate）する形式的変換関数（formal
translation function）を提案し、その正しさ (いかなるプログラムでも、元のバージョンの意味論が、変換されたバージョンの意味論と同等であること)
を証明する。
［1 ．序論］
ソフトウェアをあるプログラミング言語から他の言語へと移行するのに成功するためには、２つの条件が必須である。第一に、手法は完全に自動的である必要がある。なぜなら、人間が介入すると、一般的に、間違いが起こりやすく、仕事量が多く、かつ、費用がかかるからである。第二に、手法の正しさを証明する必要がある。言い換えれば、次のことを示す形式的証明 (正しそうに見える単なる非形式的論拠ではなく) が必要である。つまり、プログラムの変換されたバージョンが、その元のバージョンと、明確に定義された同等関係の観点からみて同等であること、である。移行手法が非特許文献
１、２、３及び９ に多数提案されているが、どれもたいした成功を納めてはいない。
【００１０】
本発明では、プログラムを命令型言語から宣言型言語に移行することを可能にする形式的方法を紹介する。そのために、標準的な命令型言語の単純なバージョンであるＬ１
を使用する。この言語には、代入（affectation）、条件命令、ループ、および、シーケンス、といった、基本的かつ重要な構文が含まれている。宣言型言語Ｌ２
は、Lyee（商標）（非特許文献５及び６） から触発されたもので、ソフトウェアを変数定義の集合によって指定する。しかしながら、Lyee のアプローチとは異なり、変数の定義は、ループなどの特別な算術式を含む。また、Ｌ２
によるプログラムの定義は、全て互いに独立である。それぞれの言語に付随する意味論は表示的であり、そこでは、ある環境 (メモリー状態) におけるプログラムの意味論もまた
1つの環境となる。さらに、形式的変換関数 Ｄも提案する。この関数は、いかなるＬ１ プログラムも、同等なＬ２ プログラムに移行することが可能であり、この正しさを証明する。
【００１１】
本明細書の残りの部分の構成は次のようになっている。２節では、単純で古典的な命令型言語であるＬ１ の構文規則と表示的意味論について述べる。３節では、宣言型言語であるＬ２
の構文規則と表示的意味論について提示する。４節では、変換関数Ｄについて紹介する。５節では、変換プログラムの例をいくつか提示し、関数Ｄがどのように機能するかを示す。６節では、Ｄの正しさ (つまり、プログラムの意味論が変換後も維持されていること) を証明する。７節では、言語Ｌ２ の重要な特徴について論議する。最後に、８節では、本研究についての最終的な所見および今後の研究について、結論として簡単に説明する。
［２．命令型言語］
この節では、命令型言語Ｌ１ の構文規則と表示的意味論について述べる。
２.１ 構文規則
言語Ｌ１の、メタ変数とカテゴリーは以下のようになっている。
●ｎの範囲は、値の集合Ｚの範囲である。
●ｘの範囲は、変数の集合Ｘの範囲である。
●a, a1 , a2 , . . . の範囲は、算術式の集合Ａ１の範囲である。
●b, b1 , b2
, . . . の範囲は、ブール式の集合Ｂ１の範囲である。
●P, P1 , P2 , . . . の範囲は、プログラムの集合Ｌ１の範囲である。
【００１２】
Ｌ１ の構文法は、ＢＮＦ（Backus Naur Form：バッカス・ナウア記法）の文法に従い、テーブル 1 のようになる。
＜テーブル１：Ｌ１の構文規則＞      
算術式の構文規則：
a ::= n | x | a1 ＋
a2 | a1 * a2 | a1 − a2
ブール式の構文規則：
【００１３】
【数１】
2008009463.tif 000003
プログラムの構文規則：
P ::= x = a
| if b then P
else P
| while b do P
| P; P 
２.２ 意味論
●    算術式
算術式の意味論は、式に表れる変数を束縛する値に依存する。例えば、x が5に束縛される場合には、式 x +
2は7と評価される。したがって、算術式の意味を定義するための、環境 (または状態) の概念を導入する必要がある。環境は、変数を入力として取り、変数を束縛する値を出力として与える関数として定義される。つまり、Ｘ
→ Ｚである。s が環境である場合は、環境sにおける変数xを束縛する値を、s(x)、x s または s x と表す。その結果、可能な環境全ての集合をгと表示する。最後に、任意の環境 s における算術式の意味論をテーブル２に示す。そこでは、次のようになっている。
【００１４】
【数２】
2008009463.tif 000004
＜テーブル２：Ｌ１の意味論＞
算術式の意味論：
【００１５】
【数３】
2008009463.tif 000005
ブール式の意味論：
【００１６】
【数４】
2008009463.tif 000006
プログラムの意味論：
【００１７】
【数５】
2008009463.tif 000007
例えば、
【００１８】
【数６】
2008009463.tif 000008
とすると、式
x + 1 の意味論は以下のようになる。
【００１９】
【数７】
2008009463.tif 000009
●ブール式：
ブール式の意味論は、関数
【００２０】
【数８】
2008009463.tif 000010
によって表され、ここで
bool = {true,
false}である。
【００２１】
テーブル２にあるように
【００２２】
【数９】
2008009463.tif 000011
の定義は、
【００２３】
【数１０】
2008009463.tif 000012
の定義の上に成り立っている。
●    プログラム：
プログラムの意味論はテーブル２に示されたとおりである。そこでは次のようになっている。
【００２４】
【数１１】
2008009463.tif 000013
【００２５】
【数１２】
2008009463.tif 000014
は次のように定義する：
【００２６】
【数１３】
2008009463.tif 000015
‐  μf は、関数 f の最小不動点 (この概念については後ほど詳しく述べる) である。
以下に、各種プログラムの意味論の背後にあるアイデアについて述べる。
‐  所与の環境 s における 代入 &laquo; x = a &raquo; の意味論は、新しい環境
【００２７】
【数１４】
2008009463.tif 000016
であり、そこでは x は、同じ環境 s における式 a の評価に束縛される。
‐  ２つのプログラムの逐次配列 &laquo; P1; P2 &raquo; の意味論は、その２つのプログラムの意味論の合成である。つまり以下のようになっている。
【００２８】
【数１５】
2008009463.tif 000017
‐  命令 &laquo; if &raquo; の意味論は次のようになる。
【００２９】
【数１６】
2008009463.tif 000018
関数condを次のように定義する。
【００３０】
【数１７】
2008009463.tif 000019
ここでは
【００３１】
【数１８】
2008009463.tif 000020
である。よって次のようになる。
【００３２】
【数１９】
2008009463.tif 000021
‐  &laquo; while &raquo; の意味論は次の方程式を満たすものとする。
【００３３】
【数２０】
2008009463.tif 000022
言い換えれば、次のようになる。
【００３４】
【数２１】
2008009463.tif 000023
さらに、
【００３５】
【数２２】
2008009463.tif 000024
が次の方程式の解になる必要がある。
【００３６】
【数２３】
2008009463.tif 000025
ここでは次のようになる。
【００３７】
【数２４】
2008009463.tif 000026
λ計算の概念を使用し、関数fを次のように表すことができる。
【００３８】
【数２５】
2008009463.tif 000027
【００３９】
【数２６】
2008009463.tif 000028
、ここで⊥は未定義環境を示す。この記号を使うと、部分関数について触れなくて済むため、意味論の説明を単純化することができる。
【００４０】
【数２７】
2008009463.tif 000029
は、定義されていなければ常に⊥を返す関数である。
【００４１】
while 命令に関連する意味論は f の最小不動点で、μf で示す。つまり次のようになる。
【００４２】
【数２８】
2008009463.tif 000030
ここで留意すべきなのは、このような関数 f の不動点の存在 (非特許文献４参照)  がよく知られているということである。この命令文の証明は、以下に示した不動点定理(非特許文献７及び８参照)に基づく。
定理２.１（不動点定理） f : D → D を、⊥で表す最小要素を持つ完備半順序集合（cpo：complete partial order）
【００４３】
【数２９】
2008009463.tif 000031
における連続関数とすると、以下のようになる。
【００４４】
【数３０】
2008009463.tif 000032
ここで、f 0 は恒等関数であり、
【００４５】
【数３１】
2008009463.tif 000033
の場合は、
【００４６】
【数３２】
2008009463.tif 000034
である。
［３.宣言型言語］
この節では、宣言型言語Ｌ２ の構文規則および表示的意味論について述べる。この言語では、プログラムは、独立変数 (単語)の 定義の集合により定義される。したがって、プログラムの変数を定義する際には順序は問わない。
３.１ 構文規則
言語Ｌ２ の、メタ変数とカテゴリーは以下のようになっている。
●nの範囲は、値の集合Ｚの範囲である。
●xの範囲は、変数の集合Ｘの範囲である。
●a, a1 , a2 , . . . の範囲は、算術式の集合Ａ２の範囲である。
●b, b1 , b2 , . . . の範囲は、ブール式の集合Ｂ２の範囲である。
●P, P1 , P2 , . . . の範囲は、プログラムの集合Ｌ２の範囲である。
【００４７】
Ｌ２の構文規則は、ＢＮＦの文法に従い、テーブル３のようになる。この言語の算術式とＬ１の算術式との主要な違いは、Ｌ２の算術式は、条件式または再帰的式もあるということである。例えば、以下はＬ２の算術式である。
【００４８】
【数３３】
2008009463.tif 000035
＜テーブル３：Ｌ２の構文規則＞
算術式の構文規則：
【００４９】
【数３４】
2008009463.tif 000036
ブール式の構文規則：
【００５０】
【数３５】
2008009463.tif 000037
プログラムの構文規則：
【００５１】
【数３６】
2008009463.tif 000038
３.２ 意味論
●    算術式：
算術式を評価するには、その式が扱う各変数の値を与える環境が必要である。算術式の結果は常に、値の集合Ｚの値である。さらに正確に言うと、算術式の意味論は、テーブル４に定義されている関数
【００５２】
【数３７】
2008009463.tif 000039
により与えられる。
‐  値nの意味論は、環境から独立であり、n自身である。
‐  所与の環境s∈гにおける、変数xの意味論は、環境sにおいてxを束縛する値、すなわち、s
x である。
‐  所与の環境s∈гにおける、２つの算術式の加算 (あるいは、それぞれ、減算、乗算) の意味論は、同じ環境 s における、１番目の式の意味論と、２番目の式の意味論の加算 (あるいは、それぞれ、減算、乗算) である。
‐  所与の環境s∈гにおける条件式 &laquo;
if(b, a1, a2) &raquo; の意味論は、関数
【００５３】
【数３８】
2008009463.tif 000040
の計算結果である。ここでは次のようになる。
【００５４】
【数３９】
2008009463.tif 000041
‐  所与の環境 s における、再帰的式
【００５５】
【数４０】
2008009463.tif 000042
の意味論は、次のように計算される。
【００５６】
まず、環境
【００５７】
【数４１】
2008009463.tif 000043
に適用した関数fb,Pの最小不動点を計算する。このステップの結果は新しい環境で、この環境をs'とする。最後に、環境s'におけるxを束縛する値を返す。再帰的定義の意味論に関連した完全な例が結果として得られる。
＜テーブル４：Ｌ２の意味論＞
算術式の意味論：
【００５８】
【数４２】
2008009463.tif 000044
ブール式の意味論：
【００５９】
【数４３】
2008009463.tif 000045
プログラムの意味論：
【００６０】
【数４４】
2008009463.tif 000046
●    ブール式：
Ｌ２のブール式の意味論は、Ｌ１のブール式に付随した意味論に類似する。
●プログラム：
‐  所与の環境s における定義
【００６１】
【数４５】
2008009463.tif 000047
の意味論は、sに類似した新しい環境s'であるが、異なっているのは、変数xが、s'において、sにおける式aの評価に束縛されているということである。
‐  ２つのプログラムの和集合の意味論は、それらプログラムの意味論の和集合である。ここで留意すべきことは、プログラムの適格（well formed）な合成のみを考察するということである。つまり、
【００６２】
【数４６】
2008009463.tif 000048
であるならば、a1 = a2
である。
３.３ 例
例 1
以下のプログラム Pは言語Ｌ２によるので、変数「max」という、3 つの変数 a、b、c の最大値を定義している。
【００６３】
【数４７】
2008009463.tif 000049
ここで、環境
【００６４】
【数４８】
2008009463.tif 000050
におけるPの意味論を知りたいとする。テーブル４にある意味論の定義に従えば、以下のようになる。
【００６５】
【数４９】
2008009463.tif 000051
例２
言語Ｌ２によるプログラムで、
【００６６】
【数５０】
2008009463.tif 000052
を計算するものは、以下のように書くことが可能である。
【００６７】
【数５１】
2008009463.tif 000053
ここで、
【００６８】
【数５２】
2008009463.tif 000054
である。
【００６９】
P’の意味論の詳細については、後半 (Ａ 節参照) で述べる。
［４．Ｌ１からＬ２へ：形式的変換］
この節では、プログラムを言語Ｌ１から言語Ｌ２へ移行する関数Ｄを定義する。さらに、Ｄの正しさを証明する。すなわち、
【００７０】
【数５３】
2008009463.tif 000055
であるなら、以下のようになる。
【００７１】
【数５４】
2008009463.tif 000056
まず、いくつかの有用な定義を提示する。1 番目のものは、言語Ｌ１で記述された所与のプログラムにおける定義済み変数（defined variable）の概念を示している。
定義４.１ (定義済み変数) 
P を言語Ｌ１のプログラムとする。Pによる定義済み変数の集合V(P )は次のようになる。
【００７２】
【数５５】
2008009463.tif 000057
２番目の定義は、式 e∈A2∪B2を、いかにしてプログラム P∈Ｌ２に置換するかを示す。
定義４.２ (式置換)
【００７３】
【数５６】
2008009463.tif 000058
が言語Ｌ２によるプログラムであるとし、e をA2∪B2に含まれる式とする。Pによるeの置換 P (a) または aP を、次のように定義する。
【００７４】
【数５７】
2008009463.tif 000059
ここで、c∈Z∪Boolであり、かつ
【００７５】
【数５８】
2008009463.tif 000060
である。
【００７６】
ここからは、変換関数（translation function）の定義について述べる。
定義４.３ (変換関数) 
プログラムを言語Ｌ１から言語Ｌ２ へと変換する関数Ｄの定義を以降に示す。
【００７７】
【数５９】
2008009463.tif 000061
次に、各変換の背後にあるアイデアについて述べる。
●代入 &laquo; x = a &raquo; の変換は、
【００７８】
【数６０】
2008009463.tif 000062
である。
●２つのプログラムP1とP2の配列の変換は、P2の変換とP1の変換の合成関数である。例えば、P1 : x = x + 3 かつ P2 :
y = x + y ならば、以下のようになる。
【００７９】
【数６１】
2008009463.tif 000063
●プログラム&laquo; if b then P1
else P2 &raquo;がＬ２に変換されると、変数の集合になり、各変数は条件定義に束縛される。例えば、P1: x = 2 * x;
y = 2 かつ P2 : y = x +
y ならば、以下のようになる。
【００８０】
【数６２】
2008009463.tif 000064
●プログラム&laquo; while b do P &raquo; がＬ２に変換されると、変数の集合になり、各変数は再帰的定義に束縛される。例えば、P: x = x + 3; y = x + y
ならば、以下のようになる。
【００８１】
【数６３】
2008009463.tif 000065
［５． 例］
以下に、プログラム変換の例をいくつか挙げる。
●例 1
【００８２】
【表１】
2008009463.tif 000066
D(P) の計算は次のようになる。
【００８３】
【数６４】
2008009463.tif 000067
●例 2
【００８４】
【表２】
2008009463.tif 000068
D(P) の計算は次のようになる。
【００８５】
【数６５】
2008009463.tif 000069
［６．Ｄの正しさ］
この節では、変換関数Ｄがプログラムの意味論を変更しないことを示す。言い換えれば、図 1 の図が変換（commute）可能であることを証明する。
【００８６】
図 1は、
【００８７】
【数６６】
2008009463.tif 000070
に係る。
【００８８】
主要な結果は以下の定理で与えられる
定理 ６.１
【００８９】
【数６７】
2008009463.tif 000071
であれば、以下のようになる。
【００９０】
【数６８】
2008009463.tif 000072
証明：
この定理の証明は、後半 (B.3 参照) で述べる。
［７．考察］
この節では、言語Ｌ２および変換関数Ｄの重要な特徴についていくつか述べる。
●言語Ｌ２で記述された所与のプログラムの各定義は、他から完全に独立である。したがって、所与のプログラムの定義は全て並行に実行することができる。
●Ｌ２で記述されたプログラムのメンテナンスは、Ｌ１のような命令型言語で記述された前のプログラムよりも容易である。例えば、以下のようなことが挙げられる。
‐  Ｌ２で記述された所与のプログラムに新しい定義 (新しい機能性) を加えても、古い定義には影響しない。
‐  Ｌ２で記述された所与のプログラムから定義をいくつか削除あるいは更新しても、他の定義には影響しない。
‐  言語Ｌ２は、保守演算子（operator）を多数含むように、容易に拡張することができる。例えば、以下のプログラムによって、Ｌ２を簡単に拡張できる。
*  X を変数の集合であるとすると、拡張 P - Xを使って、Xに含まれる変数の定義を削除したプログラムPを表すことができる。
*  X を変数の集合であるとすると、拡張 P/X を使って、X に含まれる変数の定義のみを含むプログラム P のスライスを表すことができる。
*  P1 とP2を２つのプログラムであるとすると、拡張
P1†P2を使って、(P1−Var(P2))∪P2 から得られるプログラムを表すことができる。言い換えれば、プログラム P2により、P1における定義を更新することができる。
【００９１】
こういった拡張により、ユーザはプログラムのメンテナンスが容易になる。
●変換過程においては、定数伝播などの最適化が自動的に関数Ｄによって行われる。例えば、プログラム P: x:= 3; y = 2 * x + z は
【００９２】
【数６９】
2008009463.tif 000073
に変換され、これは容易に
【００９３】
【数７０】
2008009463.tif 000074
へ変換できる。
●Ｌ１によるプログラムに、入れ子ループがある場合は、Ｌ２における入れ子再帰的関数（nested recursive function）を持った定義へと変換される。しかし、次のことを念頭に入れておくことが重要である。それは、Ｌ１のような命令型言語におけるプログラムは、変換されると、whileの入っていない(while free、つまり、入れ子ループのない)while 命令を、最大で１つ含む同等なプログラムになるということである。以下のように変換される。
−  「while」命令の後に文がない場合
【００９４】
【数７１】
2008009463.tif 000075
−  入れ子ループがない場合
【００９５】
【数７２】
2008009463.tif 000076
［８．結論］
本稿では、プログラムを単語定義の集合により要件指定する宣言型言語Ｌ２を定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Ｌ１を提案し、言語Ｌ１によるどんなプログラムも、言語Ｌ２による同等なプログラムに変換する関数Ｄを定義した。関数Ｄの正しさは、図１が変換可能であることを示すことにより証明された。
【００９６】
今後の課題としては、言語Ｌ１をCOBOL のような実際の言語に拡張し、画面やファイルからの入出力といった、欠けている機能を補うことが挙げられる。そのためには、言語Ｌ２を拡張し、変換関数およびその正しさの証明を更新する必要がある。さらに、プログラムを言語Ｌ１から言語Ｌ２ へ自動変換することが可能なツールを開発し、かつ、Ｌ１からＬ２ へ変換されたプログラムを理解し、メンテナンスすることがいかに容易か、を研究することを計画している。
［Ａ．ケース・スタディ］
Ｌ２によるプログラムで、
【００９７】
【数７３】
2008009463.tif 000077
を計算するものは以下のように記述することができる。
【００９８】
【数７４】
2008009463.tif 000078
ここで、
【００９９】
【数７５】
2008009463.tif 000079
である。
【０１００】
Ｌ２の意味論によれば、式
【０１０１】
【数７６】
2008009463.tif 000080
が表しているのは、以下のように定義される関数
【０１０２】
【数７７】
2008009463.tif 000081
の最小不動点の、変数som上への、射影である。
【０１０３】
【数７８】
2008009463.tif 000082
不動点定理(２.１) から、
【０１０４】
【数７９】
2008009463.tif 000083
の最小不動点は次のようになる。
【０１０５】
【数８０】
2008009463.tif 000084
以降に、
【０１０６】
【数８１】
2008009463.tif 000085
がどう計算されるかを示す。
【０１０７】
【数８２】
2008009463.tif 000086
【０１０８】
【数８３】
2008009463.tif 000087
2008009463.tif 000088
【０１０９】
【数８４】
2008009463.tif 000089
【０１１０】
【数８５】
2008009463.tif 000090
【０１１１】
【数８６】
2008009463.tif 000091
は、次のようになる、と導き出せる。
【０１１２】
【数８７】
2008009463.tif 000092
最後に、
【０１１３】
【数８８】
2008009463.tif 000093
の最小不動点は次のようになる。
【０１１４】
【数８９】
2008009463.tif 000094
ここで、環境
【０１１５】
【数９０】
2008009463.tif 000095
における、Pの意味論を評価するとする。
【０１１６】
ここで、
【０１１７】
【数９１】
2008009463.tif 000096
であるから、
【０１１８】
【数９２】
2008009463.tif 000097
の定義から、以下のように導き出せる。
【０１１９】
【数９３】
2008009463.tif 000098
さらに、次のようになる。
【０１２０】
【数９４】
2008009463.tif 000099
［Ｂ．定理の証明］
この節では、変換関数Ｄがプログラムの意味論を変更しないことを示す。以下の補足概念を用いる。集合ε2はA2∪B2を表し、全ての E∈ε2
において
【０１２１】
【数９５】
2008009463.tif 000100
は以下のようになる。
【０１２２】
【数９６】
2008009463.tif 000101
ここで、有用な結果についていくつか述べる。
補助定理 Ｂ.１
【０１２３】
【数９７】
2008009463.tif 000102
なら、次のようになる。
【０１２４】
【数９８】
2008009463.tif 000103
証明：
この証明は E における構造的帰納法（structural induction）による。
●E = "c" 、ここで、c∈{n, true, false}である。
【０１２５】
【数９９】
2008009463.tif 000104
●E = "x"
【０１２６】
【数１００】
2008009463.tif 000105
●E = ”¬b”
【０１２７】
【数１０１】
2008009463.tif 000106
●E = ”E 1 op E 2”、ここで
【０１２８】
【数１０２】
2008009463.tif 000107
である。
【０１２９】
【数１０３】
2008009463.tif 000108
●E = ”if(b, E 1, E2)” ならば、以下のようになる。
【０１３０】
【数１０４】
2008009463.tif 000109
以下の定理では、言語Ｌ１の算術式およびブール式と、言語Ｌ２の算術式およびブール式の間のつながりを示している。
補足定理
Ｂ.２ 
次の結果が得られた。
【０１３１】
【数１０５】
2008009463.tif 000110
証明：
この証明は以下のものの定義から直接得られる。
【０１３２】
【数１０６】
2008009463.tif 000111
最後に、以下の定理で、変換関数が正しいことを詳述する。
補足定理
Ｂ.３  
【０１３３】
【数１０７】
2008009463.tif 000112
ならば、次のようになる。
【０１３４】
【数１０８】
2008009463.tif 000113
証明：
この証明はPにおける構造的帰納法による。
●P = “x = e” 
【０１３５】
【数１０９】
2008009463.tif 000114
●P = ”P1; P 2” 
【０１３６】
【数１１０】
2008009463.tif 000115
●P = ”if b then P1 else P2”
【０１３７】
【数１１１】
2008009463.tif 000116
●P = ”while b do P1”
【０１３８】
【数１１２】
2008009463.tif 000117
以上詳細に説明したように、本発明では、標準的な命令型言語の単純なバージョンであるＬ１ を使用する。この言語には、代入（affectation）、条件命令、ループ、および、シーケンス、といった、基本的かつ重要な構文が含まれている。宣言型言語Ｌ２
は、Lyee （商標） から触発されたもので、ソフトウェアを変数定義の集合によって指定する。しかしながら、Lyee のアプローチとは異なり、変数の定義は、ループなどの特別な算術式を含む。また、Ｌ２
によるプログラムの定義は、全て互いに独立である。それぞれの言語に付随する意味論は表示的であり、そこでは、ある環境 (メモリー状態) におけるプログラムの意味論もまた
1つの環境となる。さらに、形式的変換関数 Ｄも提案する。この関数は、いかなるＬ１ プログラムも、同等なＬ２ プログラムに移行することが可能であり、この正しさを証明する。これにより、プログラムを命令型言語から宣言型言語に移行することを可能にする形式的方法が実現される。
【０１３９】
本発明によれば、プログラムを単語定義の集合により要件指定する宣言型言語Ｌ２を定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Ｌ１を提案し、言語Ｌ１によるどんなプログラムも、言語Ｌ２による同等なプログラムに変換する関数Ｄを定義した。関数Ｄの正しさは、図１が変換可能であることを示すことにより証明された。これにより、プログラムを、命令型言語（imperative
language）から宣言型言語（declarative language）へ形式的に変換することに伴う問題が解決され、命令型言語から宣言型言語への機械的な変換が可能となる。
【産業上の利用可能性】
【０１４０】
本発明によれば、プログラムを単語定義の集合により要件指定する宣言型言語Ｌ２を定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Ｌ１を提案し、言語Ｌ１によるどんなプログラムも、言語Ｌ２による同等なプログラムに変換する関数Ｄを定義した。関数Ｄの正しさは、図１が変換可能であることを示すことにより証明された。これにより、プログラムを、命令型言語（imperative
language）から宣言型言語（declarative language）へ形式的に変換することに伴う問題が解決され、命令型言語から宣言型言語への機械的な変換が可能となる。
【図面の簡単な説明】
【０１４１】
【図１】本発明の数６６に係り、変換関数Ｄがプログラムの意味論を変更しないことを示すための図である。
【符号の説明】
【０１４２】
Ｄ  変換関数
【図１】
2008009463.tif 000118
【外国語明細書】
2008009463.tif 000119
2008009463.tif 000120
2008009463.tif 000121
2008009463.tif 000122
2008009463.tif 000123
2008009463.tif 000124
2008009463.tif 000125
2008009463.tif 000126
2008009463.tif 000127
2008009463.tif 000128
2008009463.tif 000129
2008009463.tif 000130
2008009463.tif 000131
2008009463.tif 000132
2008009463.tif 000133
2008009463.tif 000134
2008009463.tif 000135
2008009463.tif 000136
2008009463.tif 000137
2008009463.tif 000138
2008009463.tif 000139
2008009463.tif 000140
2008009463.tif 000141
2008009463.tif 000142
2008009463.tif 000143
A (legacy) software transforming method, comprising:
A first step for defining variables V(P) in a given program P denoted in an imperative language L1, P being specified by a set word definitions, said each definition concerning a unique variable;
A second step for substituting expression e in the P, e being arithmetic expression or boolean expression, in accordance with predetermined syntax and semantics; 
A third step for defining a function D for translating each unit of the program P into each corresponding expression e, e being arithmetic expression or boolean expression, in accordance with V(P), e, the syntax, and the semantics; and
A fourth step for converting the function D defined in the third step to produce a program P2 denoted in a declarative language L2, in accordance with predetermined rule.
2008009463.tif 000144
2008009463.tif 000145
2008009463.tif 000146
2008009463.tif 000147
2008009463.tif 000148
2008009463.tif 000149
2008009463.tif 000150
2008009463.tif 000151
2008009463.tif 000152