LOOPは、原始的な再帰関数を正確に表現するシンプルなレジスタ言語です。[1] この言語は、カウンタマシンモデルから派生したものです。カウンタマシンと同様に、 LOOP言語は、それぞれが1つの非負の整数を保持できる1つ以上の無制限のレジスタのセットで構成されています。いくつかの算術命令(「CleaR」、「INCrement」、「DECrement」、「CoPY」など)は、レジスタに対して動作します。唯一の制御フロー命令は、「LOOP x DO ... END」です。これにより、そのスコープ内の命令がx回繰り返されます。(ループの実行中にレジスタxの内容が変更されても、パスの回数には影響しません。)
歴史
LOOP言語は1967年の論文でAlbert R. MeyerとDennis M. Ritchieによって定式化されました。[2] 彼らはLOOP言語と基本的な再帰関数との対応を示しました。
この言語はリッチーの未発表の博士論文のテーマでもあった。[3] [4]
これは、 GOTOやWHILEとともにUwe Schöningによっても発表された。[5]
設計哲学と特徴
GOTOプログラムやWHILEプログラムとは対照的に、LOOPプログラムは常に終了します。[6]したがって、LOOPプログラムで計算可能な関数の集合は、計算可能な関数の適切な部分集合です(したがって、WHILEおよびGOTOプログラム関数で計算可能な関数の部分集合です)。[7]
マイヤーとリッチーは、各原始再帰関数はループ計算可能であり、その逆も成り立つことを証明した。[2] [5]
LOOP計算可能ではない全計算可能関数の例としては、アッカーマン関数がある。[8]
正式な定義
構文
LOOPLOOP プログラムは、記号DO、 、END、:=、+と、;任意の数の変数と定数で構成されます。LOOP プログラムは、修正バッカスナウア形式で次の構文を持ちます。
ここで、は変数名であり、は定数です。
セマンティクス
Pが LOOP プログラムの場合、P は関数 と同等です。LOOP プログラム内の変数からは関数 の引数に対応し、プログラム実行前に適切な値で初期化されます。他のすべての変数には初期値 0 が与えられます。変数 は、からの引数値が与えられたときに が取る値に対応します。
次のような形式の声明
x i := 0
変数の値が 0 に設定されていることを意味します。
次のような形式の声明
x i := x i + 1
変数の値が 1 増加することを意味します。
次のような形式の声明
1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ;8 ;9 ;10 ;11 ;12 ;13 ;14 ;15 ;16 ;17 ;18 ;19 ;20 ;21 ;22 ;23 ;24 ;25 ; 26 ;27 ;28 ;30 ; 31 ;32 ;33 ;3
サブプログラムとをこの順序で順次実行することを表します。
次のような形式の声明
ループx終了
は、部分プログラムを合計 回繰り返し実行することを意味し、ステートメントの実行開始時の の値が使用されます。の値が変わっても、ループ内で が実行される回数には影響しません。 の値が 0 の場合、 はLOOPステートメント内で実行されません。これにより、変数の値が 0 か 1 かによって部分プログラムの条件付き実行が決まる LOOP プログラムでの 分岐が可能になります。
「便利な説明書」の作成
基本構文から「便利な命令」を作成します。これらは従来の意味でのサブルーチンではなく、基本構文から作成され、ニーモニックが与えられた LOOP プログラムです。正式な意味では、これらのプログラムを使用するには、(i) コードに「展開」する必要があります。一時変数または「補助」変数の使用が必要になるため、これを考慮する必要があります。または、(ii) 命令を「組み込んだ」構文を設計する必要があります。
- 例
k 進射影関数は、順序付けられた k タプルから i 番目の座標を抽出します。
マイヤーとリッチーは、彼らの画期的な論文[2]で、割り当てを基本ステートメントにしました。例が示すように、割り当ては基本ステートメントのリストから導き出すことができます。
命令を作成するには、以下のコードブロックを使用します。 = equiv
xj := 0 ;ループ × iDO xj := xj + 1です 終わり
繰り返しますが、これらはすべて便宜上のものであり、モデルの本質的な力を高めるものではありません。
サンプルプログラム
追加
ここで、S は「後継者」と読みます。
ハイパー演算子シーケンスでは、関数
ループプログラムADD( x 1 , x 2 ) で実装できる。
ループx 1 DO x 0 := x 0 + 1 END ; ループx 2 DO x 0 := x 0 + 1 END
乗算
ループプログラムMULT( x 1 , x 2 ) で実装できる。
x 0 := 0; ループx 2 DO x 0 := ADD( x 1 , x 0 ) 終了
このプログラムは、ADD() プログラムを「便利な命令」として使用します。拡張すると、MULT プログラムは 2 つのネストされた LOOP 命令を持つ LOOP プログラムになります。ADD は 1 つとしてカウントされます。
ハイパーオペレーターの追加
ハイパーオペレーション関数 のLOOPプログラムが与えられた場合、次のレベルのLOOPプログラムを構築することができる。
例えば、 (指数を表す)は、LOOPプログラムPOWER( x 1 , x 2 ) によって実装できる。
x 0 := 1; ループx 2 DO x 0 := MULT( x 1 , x 0 ) 終了
拡張された指数計算プログラムには、3 つのネストされた LOOP 命令があります。
前任者
先行関数は次のように定義される。
- 。
この関数は、変数を に設定する次の LOOP プログラムによって計算できます。
/* 前提条件: x2 = 0 */ LOOP x 1 DO x 0 := x 2 ; x 2 := x 2 + 1 終了
拡大すると、これがプログラムです
/* 前提条件: x 2 = 0 */
LOOP x 1 DO
x 0 := 0;
LOOP x 2 DO
x 0 := x 0 + 1
END ;
x 2 := x 2 + 1
終了
このプログラムは、他の LOOP プログラム内のサブルーチンとして使用できます。 LOOP 構文は、次のステートメントで拡張できます。これは、上記をサブルーチンとして呼び出すのと同じです。
x 0 := x 1 ∸ 1
注意: ここでも副作用に注意する必要があります。先行プログラムは変数 x 2 を変更しますが、この変数は他の場所で使用されている可能性があります。ステートメント x 0 := x 1 ∸ 1 を展開するには、変数 x n、 x n+1、 x n+2 (n が十分に大きい場合) をそれぞれ 0、 x 1、 0 に初期化し、これらの変数に対してコードを実行し、結果 (x n ) を x 0にコピーします。コンパイラはこれを実行できます。
カットオフ減算
上記の「加算」プログラムで、2 番目のループが x 0を増分するのではなく減分する場合、プログラムは変数と の差 (0 でカットオフ) を計算します。
x 0 := x 1 ループx 2 DO x 0 := x 0 ∸ 1 終了
前と同様に、次のステートメントを使用して LOOP 構文を拡張できます。
x 0 := x 1 ∸ x 2
もしそうでなければ
if x 1 > x 2 then P1 else P2の if-then-else ステートメント:
x n1 := x 1 ∸ x 2 ; xn2 := 0 ; x n3 := 1; ループx n1 DO x n2 := 1; x n3 := 0 END ; ループx n2 DO 1 位 END ; ループx n3 DO 2位 終わり;
参照
注釈と参考文献
- ^ エンダートン 2012年。
- ^ abc マイヤー&リッチー 1967年。
- ^ ブロック 2020.
- ^ リッチー 1967年。
- ^ Schöning 2008、p. 105より。
- ^ シェーニング2008、93ページ。
- ^ シェーニング2001、122ページ。
- ^ シェーニング2008、112ページ。
文献
- アクスト、ポール (1966)。 「相対原始再帰の反復」。数学アンナレン。167:53~55。土井:10.1007/BF01361215。S2CID 119730846。
- Axt, Paul (1970). 「原始再帰の反復」.記号論理学ジャーナル. 35 (3): 253–255. doi :10.1002/malq.19650110310.
- ブロック、デビッド・C(2020年6月19日)。「デニス・リッチーの失われた博士論文の発見」CHM 。 2020年7月14日閲覧。
- Calude, Cristian (1988)。計算複雑性の理論。離散数学年報。第35巻。North Holland Publishing Company。ISBN 9780080867755。
- Cherniavsky, John Charles ( 1976)。「単純なプログラムはプレスブルガーの公式を正確に実現する」。SIAM Journal on Computing。5 ( 4): 666–677。doi : 10.1137/0205045。
- Cherniavsky, John Charles; Kamin, Samuel Noah (1979). 「シンプルなプログラミング言語のための完全かつ一貫した Hoare 公理」. Association for Computing Machinery . 26 (1): 119–128. doi : 10.1145/322108.322120 . S2CID 13062959.
- Constable, Robert L.; Borodin, Allan B (1972). 「部分再帰プログラミング言語、パート I: 効率とプログラム構造」Journal of the ACM . 19 (3): 526–568. doi : 10.1145/321707.321721 . S2CID 42474303.
- Crolard, Tristan; Lacas, Samuel; Valarcher, Pierre (2006). 「ループ言語の表現力について」Nordic Journal of Computing . 13 : 46–57.
- Crolard, Tristan; Polonowski, Emmanuel; Valarcher, Pierre (2009). 「高階手続き型変数によるループ言語の拡張」(PDF) . ACM Transactions on Computational Logic . 10 (4): 1–37. doi :10.1145/1555746.1555750. S2CID 1367078.
- エンダートン、ハーバート (2012)。計算可能性理論。アカデミックプレス。doi : 10.1145 /1555746.1555750。
- ファキーニ、エマヌエラ。マッジョーロ=スケッティーニ、アンドレア (1979)。 「原始的な再帰シーケンス関数の階層」。RAIRO - Informatique Théorique - 理論情報学。13 (1): 49–67。土井:10.1051/ita/1979130100491。
- ファキーニ、エマヌエラ。マッジョーロ=スケッティーニ、アンドレア (1982)。 「プリミティブ再帰シーケンス関数の階層の比較」。Zeitschrift für mathematische Logik und Grundlagen der Mathematik。28 (27–32): 431–445。土井:10.1002/malq.19820282705。
- ゲッツェ、ベルンハルト。ネーリッヒ、ヴェルナー (1980)。 「ループプログラムと部分再帰階層の構造」。Zeitschrift für mathematische Logik und Grundlagen der Mathematik。26 (14–18): 255–278。土井:10.1002/malq.19800261407。
- Ibarra, Oscar H.; Leininger, Brian S. (1981). 「Presburger 関数の特性」SIAM Journal on Computing . 10 (1): 22–39. doi :10.1137/0210003.
- Ibarra, Oscar H.; Rosier, Louis E. (1983). 「単純なプログラミング言語とチューリングマシンの制限されたクラス」.理論計算機科学. 26 (1–2): 197–220. doi : 10.1016/0304-3975(83)90085-3 .
- Kfoury, AJ; Moll, Robert N.; Arbib, Michael A. (1982).計算可能性へのプログラミングアプローチ. Springer, New York, NY. doi :10.1007/978-1-4612-5749-3. ISBN 978-1-4612-5751-6。
- Machtey, Michael (1972). 「拡張ループ言語と計算可能関数のクラス」. Journal of Computer and System Sciences . 6 (6): 603–624. doi : 10.1016/S0022-0000(72)80032-1 .
- PlanetMath. 「原始再帰ベクトル値関数」 。 2021年8月21日閲覧。
- Matos, Armando B. (2014 年 11 月 3 日)。「原始再帰関数の閉じた形式: 命令型プログラムから数式、関数型プログラムまで」(PDF) 。2021年8 月 20 日閲覧。
- Matos, Armando B. (2015). 「プリミティブ再帰関数の効率: プログラマの視点」理論計算機科学. 594 : 65–81. doi : 10.1016/j.tcs.2015.04.022 .
- Meyer, Albert R. ; Ritchie, Dennis MacAlistair (1967)。ループプログラムの複雑性。ACM '67: 1967 年第 22 回全国会議の議事録。doi : 10.1145 /800196.806014。
- ミンスキー、マービン・リー (1967)。計算:有限マシンと無限マシン。プレンティス・ホール。doi :10.1017/ S0008439500029350。S2CID 227917578 。
- Ritchie, Dennis MacAlistair (1967). プログラム構造と計算複雑性(草稿)(論文). コンピュータ歴史博物館(CHM). p. 181 . 2024年10月16日閲覧。
- リッチー、ロバート・ウェルズ (1965 年 11 月)。「アッカーマン関数に基づく再帰関数のクラス」。パシフィック ジャーナル オブ マスマティクス。15 (3 ) : 1027–1044。doi : 10.2140/pjm.1965.15.1027。
- シェーニング、ウーヴェ (2001)。Theoretische Informatik-kurz gefasst (第 4 版)。ロンドン:オックスフォード大学出版局。ISBN 3-8274-1099-1。
- シェーニング、ウーヴェ (2008)。Theoretische Informatik-kurz gefast (5 ed.)。ロンドン:オックスフォード大学出版局。ISBN 978-3-8274-1824-1.DNB986529222。
- Tsichritzis, Dennis C (1970). 「単純なプログラムの同値問題」Journal of the ACM . 17 (4): 729–738. doi :10.1145/321607.321621. S2CID 16066171.
- Tsichritzis, Dennis C (1971). 「部分再帰階層の比較に関する注記」.情報処理レター. 1 (2): 42–44. doi :10.1016/0020-0190(71)90002-0.
外部リンク
- ループ、Goto、While
- プログラミングにおけるループの技術をマスターする: ステップバイステップのチュートリアル
