説明

プログラムの変換方法

【課題】プログラムを、命令型言語(imperative language)から宣言型言語(declarative
language)へ形式的に変換することに伴う問題を解決すること。
【解決手段】本発明は、コンピュータ用の命令型言語L1で表された所定のプログラムP中の変数V(P) を定義する第1のステップであって、該Pは一群の単語定義によって特定され、該単語定義の各々は一意的な単語に関するものである第1のステップと、所定の構文法及び意味論に基づいて、前記P中の演算式もしくは論理式であるeを置換する第2のステップと、前記プログラムPの各単位を対応する演算式もしくは論理式である式eに変換するための関数Dを、前記V(P)、e、前記所定の構文法及び意味論に基づいて規定する第3のステップと、所定の規則に基づき、前記第3のステップで規定された関数Dを変換して宣言型言語L2で表されるプログラムP2を生成する第4のステップとを具備する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラムの変換方法に関するものである。
【背景技術】
【0002】
ソフトウェア開発およびメンテナンスは、経済において非常に重要な活動となっている。何千億ドルもが、毎年、ソフトウェアの開発およびメンテナンスに使用され、この金額は年々増加している。ソフトウェア開発とメンテナンスに対するニーズのこうした増大に対処するために、言語、方法論、ツールが数多く提唱された。今日、我々の推定では、2000以上の異なるプログラミング言語が存在し、こうした言語は、プログラミング言語のパラダイムと呼ばれる様々な原理 (命令型、オプジェクト指向型、関数型、論理型、並列型、など) に基づいている。
【0003】
しかし、ソフトウェア・エンジニアリング分野における近年のめざましい進展にもかかわらず、ソフトウェア開発プロジェクトにおける失敗の数は非常に憂慮される状態にある、という統計が多い。つまり、支払いを受けただけで納入されなかったソフトウェア、納入されただけで使用されなかったソフトウェア、作り直したり放棄されたりしたソフトウェア、また、度重なる変更後にやっと使用されたソフトウェアなどが数多く存在する。基本的に、このことは、ソフトウェアそのものが複雑なために、その開発およびメンテナンスに必要な時間と費用の見積りが誤っている可能性が高いということに原因がある。また、今日のニーズに適切に見合う言語および方法論が不足していることにも原因がある。さらに、ソフトウェア開発が成功するかどうかは、どのプログラミング言語方法論を選択するかにも非常に左右され、この選択が、ソフトウェア開発およびメンテナンスの費用に重大な影響を及ぼしている。
【非特許文献1】エイ・ベイトマン、ジェイ・マーフィ著、「レガシーシステムの移築」、作業報告CA−2894、ダブリン市立大学コンピュータ応用学科
【非特許文献2】エル・エイ・べラディ、エム・エム・レーマン著、「巨大プログラム開発モデル」、IBMシステムズ・ジャーナル、15(3):p.225−252、1976年
【非特許文献3】エム・ブローディ、エム・ストンブレイカ著、「ダーウィン:レガシー情報システムの段階的移行について」、技術レポートTR−0222−10−92−165、分散オブジェクト・コンピューティング・グループ、1993年3月
【非特許文献4】フレミング・ニールソン、ハンネ・リース・ニールソン著、「アプリケーションについての意味論:公式紹介」、ワイリー・プロフェッショナル・コンピューティング、ISBN0 471 92980 8、ワイリー、1992年
【非特許文献5】根来 文生著、「Lyee ソフトウェアの原理」、21世紀( IS2000 )における情報社会についての国際会議会報pp121- 189、日本、福島県会津、2000年11月
【非特許文献6】根来文生、アイ・ハミド(I.Hamid)著、「意思工学の提案」、データベースと情報システムの進歩に関する第5回東ヨーロッパ会議研究(ADBIS’2001)、リトアニア、ヴィルニウス、2000年9月
【非特許文献7】ピー・プロトキン著、「プログラミング言語として考えられるLef」、理論的コンピュータ科学 、5:223−255、1977年
【非特許文献8】ディー・スコット著、「ISWIM、CUCH、OWHYのタイプ理論的代替案」、理論的コンピュータ科学 、121(1−2):411−440、1993年12月6日
【非特許文献9】ビー・ウー、ディー・ローレス、ジェイ・ビスバル、ジェイ・グリムソン、ヴィ・ウェイダ、アール・リチャードソン、ディ・オサリバン著、「ちぎり方法論:レガシー情報システムの移住のためのゲートウェイ・フリー・アプローチ」、複雑なコンピュータ・システム技術についての第3回IEEE会議(ICECCS S97)予稿集、イタリア、コモ、ヴィラ・オルモ
【発明の開示】
【発明が解決しようとする課題】
【0004】
その結果として、驚くほど数多くのプログラミング言語 (ツール、方法論など) が存在するにもかかわらず、より単純で表現力に富み、かつ、効果的な新しいプログラミング言語を作り出そうとする研究分野は、今でもとても活発であり、その研究結果は非常に高く評価されている。特に、ソフトウェア消費者と開発者の両者にとって非常に興味深いのは、プログラムをある言語から別の言語へ変換することを可能にすることである。実は、こういったことが可能になると、組織の多くが、ソフトウェア・エンジニアリング分野の発展から恩恵を受け、新しいソフトウェア
(頻繁にアップデートを必要とするもの) を時代遅れの古い言語 (Cobol (商標)や Pascal (商標)など) を使って開発するのに多大な費用がかかるという問題を解決することが可能になる。
【0005】
本発明は、プログラムを、命令型言語(imperative language)から宣言型言語(declarative
language)へ形式的に変換することに伴う問題を解決することを目的とする。そのために、簡単な命令型言語Lを定義する。Lは、命令型パラダイムに見受けられる基本的な命令文(statements)、つまり、代入、ループ、選択、条件分枝などをサポートする。また、宣言型言語
も定義する。Lでは、プログラムが独立変数の定義の集合によって構成されており、この定義には、特別な算術式 (条件式あるいは再帰的式)
が含まれている。例えば、x = 5 + if (a < 3, 2 * a, a - 1) は、L の定義でありえる。ここでは、x
の値が、a < 3 の場合には 5 + 2 * a の値となり、それ以外の場合には 5 + (a - 1) の値となる。それぞれの言語に付随する意味論は表示的(denotational)で、そこでは、与えられた環境
(メモリー状態) におけるプログラムの意味論が、1つの環境となる。本発明は、最後に、L によるプログラムを、 (意味論的に) 同等なLのプログラムに移行(migrate)する形式的変換関数(formal
translation function)を提案し、その正しさ (いかなるプログラムでも、元のバージョンの意味論が、変換されたバージョンの意味論と同等であること)
を証明することを目的とする。
【課題を解決するための手段】
【0006】
本発明は、コンピュータ用の命令型言語L1で表された所定のプログラムP中の変数V(P) を定義する第1のステップであって、該Pは一群の単語定義によって特定され、該単語定義の各々は一意的な単語に関するものである第1のステップと、所定の構文法及び意味論に基づいて、前記P中の演算式もしくは論理式であるeを置換する第2のステップと、前記プログラムPの各単位を対応する演算式もしくは論理式である式eに変換するための関数Dを、前記V(P)、e、前記所定の構文法及び意味論に基づいて規定する第3のステップと、所定の規則に基づき、前記第3のステップで規定された関数Dを変換して宣言型言語L2で表されるプログラムP2を生成する第4のステップとを具備する。
【0007】
本発明では、標準的な命令型言語の単純なバージョンであるL を使用する。この言語には、代入(affectation)、条件命令、ループ、および、シーケンス、といった、基本的かつ重要な構文が含まれている。宣言型言語L
は、Lyee (商標) から触発されたもので、ソフトウェアを変数定義の集合によって指定する。しかしながら、Lyee のアプローチとは異なり、変数の定義は、ループなどの特別な算術式を含む。また、L
によるプログラムの定義は、全て互いに独立である。それぞれの言語に付随する意味論は表示的であり、そこでは、ある環境 (メモリー状態) におけるプログラムの意味論もまた
1つの環境となる。さらに、形式的変換関数 Dも提案する。この関数は、いかなるL プログラムも、同等なL プログラムに移行することが可能であり、この正しさを証明する。これにより、プログラムを命令型言語から宣言型言語に移行することを可能にする形式的方法が実現される。
【発明の効果】
【0008】
本発明によれば、プログラムを単語定義の集合により要件指定する宣言型言語Lを定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Lを提案し、言語Lによるどんなプログラムも、言語Lによる同等なプログラムに変換する関数Dを定義した。関数Dの正しさは、図1が変換可能であることを示すことにより証明された。これにより、プログラムを、命令型言語(imperative
language)から宣言型言語(declarative language)へ形式的に変換することに伴う問題が解決され、命令型言語から宣言型言語への機械的な変換が可能となる。
【発明を実施するための最良の形態】
【0009】
[本発明の概要]
プログラムを、命令型言語(imperative language)から宣言型言語(declarative
language)へ形式的に変換することに伴う問題の研究について述べる。そのために、簡単な命令型言語Lを定義する。Lは、命令型パラダイムに見受けられる基本的な命令文(statements)、つまり、代入、ループ、選択、条件分枝などをサポートする。また、宣言型言語
も定義する。Lでは、プログラムが独立変数の定義の集合によって構成されており、この定義には、特別な算術式 (条件式あるいは再帰的式)
が含まれている。例えば、x = 5 + if (a < 3, 2 * a, a - 1) は、L の定義でありえる。ここでは、x
の値が、a < 3 の場合には 5 + 2 * a の値となり、それ以外の場合には 5 + (a - 1) の値となる。それぞれの言語に付随する意味論は表示的(denotational)で、そこでは、与えられた環境
(メモリー状態) におけるプログラムの意味論が、1つの環境となる。最後に、L によるプログラムを、 (意味論的に) 同等なLのプログラムに移行(migrate)する形式的変換関数(formal
translation function)を提案し、その正しさ (いかなるプログラムでも、元のバージョンの意味論が、変換されたバージョンの意味論と同等であること)
を証明する。
[1 .序論]
ソフトウェアをあるプログラミング言語から他の言語へと移行するのに成功するためには、2つの条件が必須である。第一に、手法は完全に自動的である必要がある。なぜなら、人間が介入すると、一般的に、間違いが起こりやすく、仕事量が多く、かつ、費用がかかるからである。第二に、手法の正しさを証明する必要がある。言い換えれば、次のことを示す形式的証明 (正しそうに見える単なる非形式的論拠ではなく) が必要である。つまり、プログラムの変換されたバージョンが、その元のバージョンと、明確に定義された同等関係の観点からみて同等であること、である。移行手法が非特許文献
1、2、3及び9 に多数提案されているが、どれもたいした成功を納めてはいない。
【0010】
本発明では、プログラムを命令型言語から宣言型言語に移行することを可能にする形式的方法を紹介する。そのために、標準的な命令型言語の単純なバージョンであるL
を使用する。この言語には、代入(affectation)、条件命令、ループ、および、シーケンス、といった、基本的かつ重要な構文が含まれている。宣言型言語L
は、Lyee(商標)(非特許文献5及び6) から触発されたもので、ソフトウェアを変数定義の集合によって指定する。しかしながら、Lyee のアプローチとは異なり、変数の定義は、ループなどの特別な算術式を含む。また、L
によるプログラムの定義は、全て互いに独立である。それぞれの言語に付随する意味論は表示的であり、そこでは、ある環境 (メモリー状態) におけるプログラムの意味論もまた
1つの環境となる。さらに、形式的変換関数 Dも提案する。この関数は、いかなるL プログラムも、同等なL プログラムに移行することが可能であり、この正しさを証明する。
【0011】
本明細書の残りの部分の構成は次のようになっている。2節では、単純で古典的な命令型言語であるL の構文規則と表示的意味論について述べる。3節では、宣言型言語であるL
の構文規則と表示的意味論について提示する。4節では、変換関数Dについて紹介する。5節では、変換プログラムの例をいくつか提示し、関数Dがどのように機能するかを示す。6節では、Dの正しさ (つまり、プログラムの意味論が変換後も維持されていること) を証明する。7節では、言語L の重要な特徴について論議する。最後に、8節では、本研究についての最終的な所見および今後の研究について、結論として簡単に説明する。
[2.命令型言語]
この節では、命令型言語L の構文規則と表示的意味論について述べる。

2.1 構文規則
言語Lの、メタ変数とカテゴリーは以下のようになっている。
●nの範囲は、値の集合Zの範囲である。
●xの範囲は、変数の集合Xの範囲である。
●a, a1 , a2 , . . . の範囲は、算術式の集合Aの範囲である。
●b, b1 , b2
, . . . の範囲は、ブール式の集合Bの範囲である。
●P, P1 , P2 , . . . の範囲は、プログラムの集合Lの範囲である。
【0012】
の構文法は、BNF(Backus Naur Form:バッカス・ナウア記法)の文法に従い、テーブル 1 のようになる。
<テーブル1:Lの構文規則>

算術式の構文規則:
a ::= n | x | a1
a2 | a1 * a2 | a1 − a2

ブール式の構文規則:
【0013】
【数1】

プログラムの構文規則:
P ::= x = a
| if b then P
else P
| while b do P
| P; P

2.2 意味論
● 算術式
算術式の意味論は、式に表れる変数を束縛する値に依存する。例えば、x が5に束縛される場合には、式 x +
2は7と評価される。したがって、算術式の意味を定義するための、環境 (または状態) の概念を導入する必要がある。環境は、変数を入力として取り、変数を束縛する値を出力として与える関数として定義される。つまり、X
→ Zである。s が環境である場合は、環境sにおける変数xを束縛する値を、s(x)、x s または s x と表す。その結果、可能な環境全ての集合をгと表示する。最後に、任意の環境 s における算術式の意味論をテーブル2に示す。そこでは、次のようになっている。
【0014】
【数2】

<テーブル2:Lの意味論>
算術式の意味論:
【0015】
【数3】

ブール式の意味論:
【0016】
【数4】

プログラムの意味論:
【0017】
【数5】

例えば、
【0018】
【数6】

とすると、式
x + 1 の意味論は以下のようになる。
【0019】
【数7】

●ブール式:
ブール式の意味論は、関数
【0020】
【数8】

によって表され、ここで
bool = {true,
false}である。
【0021】
テーブル2にあるように
【0022】
【数9】

の定義は、
【0023】
【数10】

の定義の上に成り立っている。

● プログラム:
プログラムの意味論はテーブル2に示されたとおりである。そこでは次のようになっている。
【0024】
【数11】

【0025】
【数12】

は次のように定義する:
【0026】
【数13】

‐ μf は、関数 f の最小不動点 (この概念については後ほど詳しく述べる) である。

以下に、各種プログラムの意味論の背後にあるアイデアについて述べる。
‐ 所与の環境 s における 代入 &laquo; x = a &raquo; の意味論は、新しい環境
【0027】
【数14】

であり、そこでは x は、同じ環境 s における式 a の評価に束縛される。
‐ 2つのプログラムの逐次配列 &laquo; P1; P2 &raquo; の意味論は、その2つのプログラムの意味論の合成である。つまり以下のようになっている。
【0028】
【数15】

‐ 命令 &laquo; if &raquo; の意味論は次のようになる。
【0029】
【数16】

関数condを次のように定義する。
【0030】
【数17】

ここでは
【0031】
【数18】

である。よって次のようになる。
【0032】
【数19】

‐ &laquo; while &raquo; の意味論は次の方程式を満たすものとする。
【0033】
【数20】

言い換えれば、次のようになる。
【0034】
【数21】

さらに、
【0035】
【数22】

が次の方程式の解になる必要がある。
【0036】
【数23】

ここでは次のようになる。
【0037】
【数24】

λ計算の概念を使用し、関数fを次のように表すことができる。
【0038】
【数25】

【0039】
【数26】

、ここで⊥は未定義環境を示す。この記号を使うと、部分関数について触れなくて済むため、意味論の説明を単純化することができる。
【0040】
【数27】

は、定義されていなければ常に⊥を返す関数である。
【0041】
while 命令に関連する意味論は f の最小不動点で、μf で示す。つまり次のようになる。
【0042】
【数28】

ここで留意すべきなのは、このような関数 f の不動点の存在 (非特許文献4参照) がよく知られているということである。この命令文の証明は、以下に示した不動点定理(非特許文献7及び8参照)に基づく。

定理2.1(不動点定理) f : D → D を、⊥で表す最小要素を持つ完備半順序集合(cpo:complete partial order)
【0043】
【数29】

における連続関数とすると、以下のようになる。
【0044】
【数30】

ここで、f 0 は恒等関数であり、
【0045】
【数31】

の場合は、
【0046】
【数32】

である。

[3.宣言型言語]
この節では、宣言型言語L の構文規則および表示的意味論について述べる。この言語では、プログラムは、独立変数 (単語)の 定義の集合により定義される。したがって、プログラムの変数を定義する際には順序は問わない。
3.1 構文規則
言語L の、メタ変数とカテゴリーは以下のようになっている。
●nの範囲は、値の集合Zの範囲である。
●xの範囲は、変数の集合Xの範囲である。
●a, a1 , a2 , . . . の範囲は、算術式の集合Aの範囲である。
●b, b1 , b2 , . . . の範囲は、ブール式の集合Bの範囲である。
●P, P1 , P2 , . . . の範囲は、プログラムの集合Lの範囲である。
【0047】
の構文規則は、BNFの文法に従い、テーブル3のようになる。この言語の算術式とLの算術式との主要な違いは、Lの算術式は、条件式または再帰的式もあるということである。例えば、以下はLの算術式である。
【0048】
【数33】

<テーブル3:Lの構文規則>
算術式の構文規則:
【0049】
【数34】

ブール式の構文規則:
【0050】
【数35】

プログラムの構文規則:
【0051】
【数36】

3.2 意味論
● 算術式:
算術式を評価するには、その式が扱う各変数の値を与える環境が必要である。算術式の結果は常に、値の集合Zの値である。さらに正確に言うと、算術式の意味論は、テーブル4に定義されている関数
【0052】
【数37】

により与えられる。
‐ 値nの意味論は、環境から独立であり、n自身である。
‐ 所与の環境s∈гにおける、変数xの意味論は、環境sにおいてxを束縛する値、すなわち、s
x である。
‐ 所与の環境s∈гにおける、2つの算術式の加算 (あるいは、それぞれ、減算、乗算) の意味論は、同じ環境 s における、1番目の式の意味論と、2番目の式の意味論の加算 (あるいは、それぞれ、減算、乗算) である。
‐ 所与の環境s∈гにおける条件式 &laquo;
if(b, a1, a2) &raquo; の意味論は、関数
【0053】
【数38】

の計算結果である。ここでは次のようになる。
【0054】
【数39】

‐ 所与の環境 s における、再帰的式
【0055】
【数40】

の意味論は、次のように計算される。
【0056】
まず、環境
【0057】
【数41】

に適用した関数fb,Pの最小不動点を計算する。このステップの結果は新しい環境で、この環境をs'とする。最後に、環境s'におけるxを束縛する値を返す。再帰的定義の意味論に関連した完全な例が結果として得られる。

<テーブル4:Lの意味論>
算術式の意味論:
【0058】
【数42】

ブール式の意味論:
【0059】
【数43】

プログラムの意味論:
【0060】
【数44】


● ブール式:
のブール式の意味論は、Lのブール式に付随した意味論に類似する。
●プログラム:
‐ 所与の環境s における定義
【0061】
【数45】

の意味論は、sに類似した新しい環境s'であるが、異なっているのは、変数xが、s'において、sにおける式aの評価に束縛されているということである。
‐ 2つのプログラムの和集合の意味論は、それらプログラムの意味論の和集合である。ここで留意すべきことは、プログラムの適格(well formed)な合成のみを考察するということである。つまり、
【0062】
【数46】

であるならば、a1 = a2
である。

3.3 例
例 1
以下のプログラム Pは言語Lによるので、変数「max」という、3 つの変数 a、b、c の最大値を定義している。
【0063】
【数47】

ここで、環境
【0064】
【数48】

におけるPの意味論を知りたいとする。テーブル4にある意味論の定義に従えば、以下のようになる。
【0065】
【数49】

例2
言語Lによるプログラムで、
【0066】
【数50】

を計算するものは、以下のように書くことが可能である。
【0067】
【数51】


ここで、
【0068】
【数52】

である。
【0069】
P’の意味論の詳細については、後半 (A 節参照) で述べる。

[4.LからLへ:形式的変換]
この節では、プログラムを言語Lから言語Lへ移行する関数Dを定義する。さらに、Dの正しさを証明する。すなわち、
【0070】
【数53】

であるなら、以下のようになる。
【0071】
【数54】

まず、いくつかの有用な定義を提示する。1 番目のものは、言語Lで記述された所与のプログラムにおける定義済み変数(defined variable)の概念を示している。

定義4.1 (定義済み変数)
P を言語Lのプログラムとする。Pによる定義済み変数の集合V(P )は次のようになる。
【0072】
【数55】

2番目の定義は、式 e∈A2∪B2を、いかにしてプログラム P∈Lに置換するかを示す。

定義4.2 (式置換)
【0073】
【数56】

が言語Lによるプログラムであるとし、e をA2∪B2に含まれる式とする。Pによるeの置換 P (a) または aP を、次のように定義する。
【0074】
【数57】

ここで、c∈Z∪Boolであり、かつ
【0075】
【数58】

である。
【0076】
ここからは、変換関数(translation function)の定義について述べる。

定義4.3 (変換関数)
プログラムを言語Lから言語L へと変換する関数Dの定義を以降に示す。
【0077】
【数59】

次に、各変換の背後にあるアイデアについて述べる。
●代入 &laquo; x = a &raquo; の変換は、
【0078】
【数60】

である。
●2つのプログラムP1とP2の配列の変換は、P2の変換とP1の変換の合成関数である。例えば、P1 : x = x + 3 かつ P2 :
y = x + y ならば、以下のようになる。
【0079】
【数61】

●プログラム&laquo; if b then P1
else P2 &raquo;がLに変換されると、変数の集合になり、各変数は条件定義に束縛される。例えば、P1: x = 2 * x;
y = 2 かつ P2 : y = x +
y ならば、以下のようになる。
【0080】
【数62】

●プログラム&laquo; while b do P &raquo; がLに変換されると、変数の集合になり、各変数は再帰的定義に束縛される。例えば、P: x = x + 3; y = x + y
ならば、以下のようになる。
【0081】
【数63】


[5. 例]
以下に、プログラム変換の例をいくつか挙げる。

●例 1
【0082】
【表1】

D(P) の計算は次のようになる。
【0083】
【数64】

●例 2
【0084】
【表2】

D(P) の計算は次のようになる。
【0085】
【数65】


[6.Dの正しさ]
この節では、変換関数Dがプログラムの意味論を変更しないことを示す。言い換えれば、図 1 の図が変換(commute)可能であることを証明する。
【0086】
図 1は、
【0087】
【数66】

に係る。
【0088】
主要な結果は以下の定理で与えられる

定理 6.1
【0089】
【数67】

であれば、以下のようになる。
【0090】
【数68】

証明:
この定理の証明は、後半 (B.3 参照) で述べる。

[7.考察]
この節では、言語Lおよび変換関数Dの重要な特徴についていくつか述べる。
●言語Lで記述された所与のプログラムの各定義は、他から完全に独立である。したがって、所与のプログラムの定義は全て並行に実行することができる。
●Lで記述されたプログラムのメンテナンスは、Lのような命令型言語で記述された前のプログラムよりも容易である。例えば、以下のようなことが挙げられる。
‐ Lで記述された所与のプログラムに新しい定義 (新しい機能性) を加えても、古い定義には影響しない。
‐ Lで記述された所与のプログラムから定義をいくつか削除あるいは更新しても、他の定義には影響しない。
‐ 言語Lは、保守演算子(operator)を多数含むように、容易に拡張することができる。例えば、以下のプログラムによって、Lを簡単に拡張できる。
* X を変数の集合であるとすると、拡張 P - Xを使って、Xに含まれる変数の定義を削除したプログラムPを表すことができる。
* X を変数の集合であるとすると、拡張 P/X を使って、X に含まれる変数の定義のみを含むプログラム P のスライスを表すことができる。
* P1 とP2を2つのプログラムであるとすると、拡張
P1†P2を使って、(P1−Var(P2))∪P2 から得られるプログラムを表すことができる。言い換えれば、プログラム P2により、P1における定義を更新することができる。
【0091】
こういった拡張により、ユーザはプログラムのメンテナンスが容易になる。
●変換過程においては、定数伝播などの最適化が自動的に関数Dによって行われる。例えば、プログラム P: x:= 3; y = 2 * x + z は
【0092】
【数69】

に変換され、これは容易に
【0093】
【数70】

へ変換できる。
●Lによるプログラムに、入れ子ループがある場合は、Lにおける入れ子再帰的関数(nested recursive function)を持った定義へと変換される。しかし、次のことを念頭に入れておくことが重要である。それは、Lのような命令型言語におけるプログラムは、変換されると、whileの入っていない(while free、つまり、入れ子ループのない)while 命令を、最大で1つ含む同等なプログラムになるということである。以下のように変換される。
− 「while」命令の後に文がない場合
【0094】
【数71】

− 入れ子ループがない場合
【0095】
【数72】


[8.結論]
本稿では、プログラムを単語定義の集合により要件指定する宣言型言語Lを定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Lを提案し、言語Lによるどんなプログラムも、言語Lによる同等なプログラムに変換する関数Dを定義した。関数Dの正しさは、図1が変換可能であることを示すことにより証明された。
【0096】
今後の課題としては、言語LをCOBOL のような実際の言語に拡張し、画面やファイルからの入出力といった、欠けている機能を補うことが挙げられる。そのためには、言語Lを拡張し、変換関数およびその正しさの証明を更新する必要がある。さらに、プログラムを言語Lから言語L へ自動変換することが可能なツールを開発し、かつ、LからL へ変換されたプログラムを理解し、メンテナンスすることがいかに容易か、を研究することを計画している。

[A.ケース・スタディ]
によるプログラムで、
【0097】
【数73】


を計算するものは以下のように記述することができる。
【0098】
【数74】

ここで、
【0099】
【数75】

である。
【0100】
の意味論によれば、式
【0101】
【数76】

が表しているのは、以下のように定義される関数
【0102】
【数77】

の最小不動点の、変数som上への、射影である。
【0103】
【数78】

不動点定理(2.1) から、
【0104】
【数79】

の最小不動点は次のようになる。
【0105】
【数80】

以降に、
【0106】
【数81】

がどう計算されるかを示す。
【0107】
【数82】

【0108】
【数83】



【0109】
【数84】

【0110】
【数85】

【0111】
【数86】

は、次のようになる、と導き出せる。
【0112】
【数87】

最後に、
【0113】
【数88】

の最小不動点は次のようになる。
【0114】
【数89】

ここで、環境
【0115】
【数90】

における、Pの意味論を評価するとする。
【0116】
ここで、
【0117】
【数91】

であるから、
【0118】
【数92】

の定義から、以下のように導き出せる。
【0119】
【数93】

さらに、次のようになる。
【0120】
【数94】

[B.定理の証明]
この節では、変換関数Dがプログラムの意味論を変更しないことを示す。以下の補足概念を用いる。集合ε2はA2∪B2を表し、全ての E∈ε2
において
【0121】
【数95】

は以下のようになる。
【0122】
【数96】

ここで、有用な結果についていくつか述べる。
補助定理 B.1
【0123】
【数97】

なら、次のようになる。
【0124】
【数98】

証明:
この証明は E における構造的帰納法(structural induction)による。
●E = "c" 、ここで、c∈{n, true, false}である。
【0125】
【数99】

●E = "x"
【0126】
【数100】

●E = ”¬b”
【0127】
【数101】

●E = ”E 1 op E 2”、ここで
【0128】
【数102】

である。
【0129】
【数103】

●E = ”if(b, E 1, E2)” ならば、以下のようになる。
【0130】
【数104】

以下の定理では、言語Lの算術式およびブール式と、言語Lの算術式およびブール式の間のつながりを示している。

補足定理
B.2
次の結果が得られた。
【0131】
【数105】

証明:
この証明は以下のものの定義から直接得られる。
【0132】
【数106】

最後に、以下の定理で、変換関数が正しいことを詳述する。

補足定理
B.3
【0133】
【数107】

ならば、次のようになる。
【0134】
【数108】

証明:
この証明はPにおける構造的帰納法による。
●P = “x = e”
【0135】
【数109】

●P = ”P1; P 2
【0136】
【数110】

●P = ”if b then P1 else P2
【0137】
【数111】

●P = ”while b do P1
【0138】
【数112】

以上詳細に説明したように、本発明では、標準的な命令型言語の単純なバージョンであるL を使用する。この言語には、代入(affectation)、条件命令、ループ、および、シーケンス、といった、基本的かつ重要な構文が含まれている。宣言型言語L
は、Lyee (商標) から触発されたもので、ソフトウェアを変数定義の集合によって指定する。しかしながら、Lyee のアプローチとは異なり、変数の定義は、ループなどの特別な算術式を含む。また、L
によるプログラムの定義は、全て互いに独立である。それぞれの言語に付随する意味論は表示的であり、そこでは、ある環境 (メモリー状態) におけるプログラムの意味論もまた
1つの環境となる。さらに、形式的変換関数 Dも提案する。この関数は、いかなるL プログラムも、同等なL プログラムに移行することが可能であり、この正しさを証明する。これにより、プログラムを命令型言語から宣言型言語に移行することを可能にする形式的方法が実現される。
【0139】
本発明によれば、プログラムを単語定義の集合により要件指定する宣言型言語Lを定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Lを提案し、言語Lによるどんなプログラムも、言語Lによる同等なプログラムに変換する関数Dを定義した。関数Dの正しさは、図1が変換可能であることを示すことにより証明された。これにより、プログラムを、命令型言語(imperative
language)から宣言型言語(declarative language)へ形式的に変換することに伴う問題が解決され、命令型言語から宣言型言語への機械的な変換が可能となる。
【産業上の利用可能性】
【0140】
本発明によれば、プログラムを単語定義の集合により要件指定する宣言型言語Lを定義した。各定義は、それぞれ1つのユニークな変数に関したもので、かつ、他の定義から完全に独立である。さらに、古典的命令型言語Lを提案し、言語Lによるどんなプログラムも、言語Lによる同等なプログラムに変換する関数Dを定義した。関数Dの正しさは、図1が変換可能であることを示すことにより証明された。これにより、プログラムを、命令型言語(imperative
language)から宣言型言語(declarative language)へ形式的に変換することに伴う問題が解決され、命令型言語から宣言型言語への機械的な変換が可能となる。
【図面の簡単な説明】
【0141】
【図1】本発明の数66に係り、変換関数Dがプログラムの意味論を変更しないことを示すための図である。
【符号の説明】
【0142】
D 変換関数

【特許請求の範囲】
【請求項1】
コンピュータ用の命令型言語L1で表された所定のプログラムP中の変数V(P) を定義する第1のステップであって、該Pは一群の単語定義によって特定され、該単語定義の各々は一意的な単語に関するものである第1のステップと、
所定の構文法及び意味論に基づいて、前記P中の演算式もしくは論理式であるeを置換する第2のステップと、
前記プログラムPの各単位を対応する演算式もしくは論理式である式eに変換するための関数Dを、前記V(P)、e、前記所定の構文法及び意味論に基づいて規定する第3のステップと、
所定の規則に基づき、前記第3のステップで規定された関数Dを変換して宣言型言語L2で表されるプログラムP2を生成する第4のステップと
を具備することを特徴とするプログラムの変換方法。

【図1】
image rotate


【公開番号】特開2008−9463(P2008−9463A)
【公開日】平成20年1月17日(2008.1.17)
【国際特許分類】
【外国語出願】
【出願番号】特願2004−280558(P2004−280558)
【出願日】平成16年9月27日(2004.9.27)
【出願人】(396023362)カテナ株式会社 (11)
【Fターム(参考)】