この記事には複数の問題があります。改善にご協力いただくか、トークページでこれらの問題について議論してください。(これらのメッセージを削除する方法とタイミングについてはこちらをご覧ください)
|
コンピュータサイエンスにおいて、ランダムアクセスマシン(RAMまたはRAマシン)は、レジスタマシンの一般クラスに属する抽象マシンを記述する計算モデルです。RAマシンはカウンターマシンと非常に似ていますが、レジスタの「間接アドレッシング」機能が追加されています。「レジスタ」は、任意のサイズの自然数を格納できるという追加機能を除けば、一般的なコンピュータのメインメモリと直感的に同等です。カウンターマシンと同様に、RAマシンはマシンの有限状態部分に実行命令を保持します(いわゆるハーバードアーキテクチャ)。
RAマシンは、データだけでなくプログラムもレジスタに格納する汎用チューリングマシンに相当するもの で、ランダムアクセス・ストアード・プログラム・マシン、またはRASPマシンと呼ばれます。これはいわゆるフォン・ノイマン・アーキテクチャの一例であり、コンピュータの一般的な概念に最も近いものです。
チューリングマシンやカウンターマシンモデルと共に、RAマシンモデルとRASPマシンモデルは計算複雑性分析に用いられます。Van Emde Boas (1990) は、これら3つとポインタマシンを合わせて「シーケンシャルマシン」モデルと呼び、「並列ランダムアクセスマシン」モデルと区別しています。
RA マシンは次の要素から構成されます。
似たような概念だがユーモラスな説明については、難解なプログラミング言語Brainfuckを参照してください。[ 1 ]
ランダムアクセスマシン(RAM)の概念は、最も単純なモデル、いわゆるカウンタマシンモデルから始まります。しかし、2つの追加要素によって、カウンタマシンモデルからは離れています。1つ目は、間接アドレッシングの利便性によってマシンを拡張することです。2つ目は、1つまたは複数の補助(専用)レジスタ(最も一般的なものは「アキュムレータ」と呼ばれます)を追加することで、より従来的なアキュムレータベースのコンピュータに近いモデルへと進化させることです。
ランダムアクセスマシン(RAM)は、間接アドレッシングが追加された、マルチレジスタカウンタマシンと同一の抽象計算マシンモデルです。有限ステートマシンのテーブルから命令の裁量に応じて、マシンは「ターゲット」レジスタのアドレスを(i)命令自体から直接、または(ii)命令で指定された「ポインタ」レジスタの内容(番号、ラベルなど)から間接的に取得します。
定義によれば、レジスタとは、アドレス(自然数に相当する一意で識別可能な指定/位置指定)と内容(単一の自然数)の両方を持つ場所です 。正確を期すため、レジスタ、その内容、そしてレジスタに対する操作を指定するために、Boolos-Burgess-Jeffrey (2002) の準形式記号を使用します。
定義:直接命令とは、命令自体の中で、その内容が命令の対象となるソースレジスタまたはデスティネーションレジスタのアドレスを指定する命令です。定義:間接命令とは、「ポインタレジスタ」を指定する命令で、その内容は「ターゲット」レジスタのアドレスです。ターゲットレジスタは、ソースレジスタまたはデスティネーションレジスタのいずれかになります(各種COPY命令がその例です)。レジスタは、間接的に自身をアドレス指定できます。
定義:ソースレジスタの内容は命令によって使用されます。ソースレジスタのアドレスは、(i) 命令によって直接指定するか、(ii) 命令によって指定されたポインタレジスタによって間接的に指定することができます。
定義:ポインタ レジスタの内容は、 「ターゲット」レジスタの アドレスです。
定義:ポインタ レジスタの内容はターゲット レジスタを指します 。「ターゲット」はソース レジスタまたは宛先レジスタのいずれかになります。
定義:デスティネーションレジスタは、命令が結果を格納するレジスタです。ソースレジスタのアドレスは、(i) 命令によって直接指定するか、(ii) 命令によって指定されたポインタレジスタによって間接的に指定できます。ソースレジスタとデスティネーションレジスタは、同じレジスタでも可能です。
レジスタマシンは、有限状態マシンの外部メモリとして、「レジスタ」と呼ばれる、容量が無制限で、かつ個別にラベル付けされた「レジスタ」と呼ばれる位置の、無制限(脚注参照:可算かつ無制限)な集合を持ちます。これらのレジスタは、自然数(0と正の整数)のみを保持します。有限状態マシンのテーブルにある一連の命令に従って、いくつかの(例えば2種類の)基本演算がこれらの「レジスタ」の内容に対して実行されます。最後に、IF-THEN-ELSE形式の条件式を使用して、1つまたは2つのレジスタの内容をテストし、有限状態マシンをデフォルトの命令シーケンスから「分岐/ジャンプ」させることができます。
基本モデル1 :ミンスキー(1961)の視覚化とランベック(1961)に最も近いモデル:
| 命令 | ニモニック | レジスタ「r」に対するアクション | 有限ステートマシンの命令レジスタ(IR)に対するアクション |
|---|---|---|---|
| インクリメント | INC ( r ) | [r] + 1 → r | [IR] + 1 → IR |
| デクリメント | 12月(r) | [r] - 1 → r | [IR] + 1 → IR |
| ゼロの場合はジャンプ | JZ ( r, z ) | なし | [r] = 0 の場合、z → IR、そうでない場合、[IR] + 1 → IR |
| 停止 | H | なし | [IR] → IR |
基本モデル 2 : 「後継」モデル (ペアノ公理の後継関数にちなんで名付けられました):
| 命令 | ニモニック | レジスタ「r」に対するアクション | 有限ステートマシンの命令レジスタ(IR)に対するアクション |
|---|---|---|---|
| クリア | CLR ( r ) | 0 → r | [IR] + 1 → IR |
| インクリメント | INC ( r ) | [r] + 1 → r | [IR] + 1 → IR |
| 等しい場合はジャンプ | JE (r1, r2, z) | なし | [r1] = [r2] の場合、z → IR、そうでない場合、[IR] + 1 → IR |
| 停止 | H | なし | [IR] → IR |
基本モデル3 : Elgot-Robinson (1964)が有界および非有界RASPの調査に使用したモデル。CLEARの代わりにCOPYを使用した「後継」モデル。
| 命令 | ニモニック | レジスタ「r」に対するアクション | 有限ステートマシンの命令レジスタ(IR)に対するアクション |
|---|---|---|---|
| コピー | コピー (r1, r2) | [r1] → r2 | [IR] + 1 → IR |
| インクリメント | INC ( r ) | [r] + 1 → r | [IR] + 1 → IR |
| 等しい場合はジャンプ | JE (r1, r2, z) | なし | [r1] = [r2] の場合、z → IR、そうでない場合、[IR] + 1 → IR |
| 停止 | H | なし | [IR] → IR |
上記の3つの基本セット1、2、または3は、あるセットの命令を別のセットの命令を使用して作成できるという点で同等です(興味深い演習:ミンスキー(1967)からのヒント – 数値0を格納するために、予約レジスタを宣言します。例えば、それを「0」(または「ゼロ」のZ、または「消去」のE)と呼びます)。モデルの選択は、著者がデモンストレーションや証明などでどのモデルが最も使いやすいかによって異なります。
さらに、基本命令セット1、2、または3から、任意の基本再帰関数を作成できます(Minsky ( 1967)、Boolos-Burgess-Jeffrey (2002)を参照)。(網を広げて全体および部分μ再帰関数を捉える方法については、間接アドレッシングの文脈で説明します)。しかし、基本再帰関数の構築は、命令セットが非常に原始的(小さい)ため困難です。1つの解決策は、特定の命令セットを別の命令セットの「便利な命令」で拡張することです。
繰り返しますが、これらはすべて便宜上のものであり、モデルの本来の力を高めるものではありません。
たとえば、最も拡張されたセットには、3 つのセットの各固有命令と、無条件ジャンプ J (z) が含まれます。
ほとんどの著者は、条件付きジャンプのいずれかを選択します。たとえば、Shepherdson-Sturgis (1963) は、上記のセットから JE を除いたものを使用します (完全に正確にするために、JZ の代わりに JNZ (ゼロ でない場合ジャンプ) を使用します。これもまた、便利な命令の 1 つです)。
私たちの日常生活において、「間接的な操作」という概念は珍しいことではありません。
間接参照は、「Tom_&_Becky's_cave...」の海賊の宝箱として識別される場所を指定します。この場所は、他の場所 (それ自体を含む) へのポインタとして機能します。その内容 (宝の地図) は、実際のアクションが発生しているターゲットの場所「under_Thatcher's_front_porch」の「アドレス」を提供します。
以下では、これらのモデルが抽象モデルであり、物理的に現実のものと2つの根本的な違いがあることを覚えておく必要があります。それは、無限の数のレジスタと、それぞれ無限の容量を持つレジスタです。この問題は、カウンターマシンモデルを用いてチューリング等価なRASPを構築し、任意の部分μ再帰関数を計算しようとする際に最も顕著に現れます。
では、有限ステートマシンの境界を超えてレジスタをアドレス指定するにはどうすればよいでしょうか。一つの方法は、プログラム命令(レジスタに格納される命令)を複数のコマンドを含むように変更することです。しかし、命令のサイズが(潜在的に)無制限でない限り、これも限界に達します。そこで、すべてのプログラム命令をエンコードした「超命令」(非常に大きな数値)を一つだけ使用してみてはいかがでしょうか。ミンスキーはこのように問題を解決しますが、彼が用いるゲーデル数列はモデルにとって大きな不都合を招き、その結果は私たちが直感的に理解している「ストアードプログラムコンピュータ」とは全く異なるものになります。
エルゴットとロビンソン(1964)は、「有限に決定された」RASPに関して同様の結論に達している。確かにRASPは無制限の数のレジスタにアクセス可能(例えば、レジスタから命令をフェッチするなど)だが、それはRASPがプログラム命令の「自己修正」を許可し、「データ」をゲーデル数で符号化している場合に限られる(図2、396ページ)。
ミンスキー(1967)は、RPT(繰り返し)命令を用いたよりコンピュータ的なモデルの文脈において、この問題の解決策を提示している(214ページ、259ページ参照)が、明確な解決策は提示していない。彼は次のように主張している。
彼は、 CLR(r)およびINC(r)と組み合わせることで任意の原始再帰関数を計算できる有界RPTを提案しています。また、上で引用したμ演算子の役割を果たす非有界RPTも提案しています。これはCLR(r)およびINC(r)と組み合わせることでμ再帰関数を計算できます。しかし、彼は「間接参照」やRAMモデルそのものについては議論していません。
ハートマニス (1971) の文献から、クック (1970 年、カリフォルニア大学バークレー校在学時の講義ノート) が間接アドレッシングの概念を確固たるものにしたことが分かります。これは、クックとレックハウ (1973) の論文でより明確になります。クックはレックハウの修士論文指導教官でした。ハートマニスのモデルはメルザック (1961) のモデルと非常に似ており、2つまたは3つのレジスタによる加算と減算、および2つのパラメータコピーを使用します。クックとレックハウのモデルでは、アキュムレータ「AC」を使用することで、パラメータ(プログラム命令で呼び出されるレジスタ)の数を1つの呼び出しに削減します。
解決策を一言で言えば、マシン/モデルを無制限の間接参照で設計することです。つまり、レジスタの数に関係なく、任意のレジスタに名前を 付ける(呼び出す)ことができる無制限の「アドレス」レジスタを提供します。これが機能するには、一般的に、無制限のレジスタは、潜在的に無限ループによってクリアされ、その後インクリメント(場合によってはデクリメント)される必要があります。この意味で、この解決策は、必要に応じて、目的のレジスタが見つかるまで無制限のレジスタ列を無限に探索できる無制限のμ演算子を表します。ポインタレジスタは他のレジスタと全く同じですが、1つの例外があります。「間接アドレッシング」と呼ばれる状況下では、ステートマシンのテーブル内のアドレスオペランドではなく、その内容をターゲットレジスタ(場合によっては自分自身も含む)のアドレスとして提供します。
1 つのレジスタに 1 つのモンスター数を配置するミンスキーのアプローチを避け、マシン モデルが「コンピューターのような」ものとなるように指定すると、再帰関数 ( μ 再帰関数とも呼ばれる) (全多様体と部分多様体の両方) を計算する場合に、この間接性の問題に直面することになります。
より単純なカウンタマシンモデルは、「場合分けによる定義」(Kleene (1952) p. 229およびBoolos-Burgess-Jeffrey p. 74で定義)と呼ばれる原始再帰「演算子」を用いることで、「限定された」形式の間接参照(ひいては原始再帰関数の サブクラスを計算する)を実行できます。このような「限定された間接参照」は、非常に手間のかかる退屈な作業です。「場合分けによる定義」では、ポインタレジスタの内容を、場合分け演算子が明示的に宣言する数値/名前と照合する試行を、成功するまで何度も繰り返すことで、マシンが判断/識別する必要があります。したがって、場合分けによる定義は、例えば下限アドレスから始まり、上限アドレスに向かって、一致を試みるたびにうんざりするほど続きます。
「制限付き」間接参照では部分再帰関数を計算できません。そのためには、制限なし間接参照、つまりμ 演算子が必要です。
チューリングと同等であるためには、カウンターマシンは、単一レジスタのミンスキー・ゲーデル数法という不都合な方法を用いるか、レジスタ列の終端を探索する能力を拡張し、必要であれば無限に探索できるようにする必要がある。(「外側」に何かを見つけられないことが、アルゴリズムが停止しないことを意味する。Kleene (1952) 316ページ以降、第12章 部分再帰関数、特に323~325ページを参照。)これについては、以下の例で詳しく説明する。
無制限の間接参照を実現するには、マシンモデルの「ハードウェア」変更が必要です。この変更を加えると、モデルはもはやカウンタマシンではなく、ランダムアクセスマシンになります。
例えばINCが指定された場合、有限ステートマシンの命令は、対象となるレジスタのアドレスがどこから取得されるかを指定する必要があります。この「どこから取得されるか」は、(i)明示的なラベルを提供するステートマシンの命令、または (ii)対象となるアドレスを内容とするポインタレジスタのいずれかです。命令がレジスタアドレスを指定する場合は常に、追加のパラメータ「i/d」(「indirect/direct」)も指定する必要があります。ある意味で、この新しい「i/d」パラメータは、命令で指定された直接アドレスを取得する方法と、ポインタレジスタから間接アドレスを取得する方法を切り替える「スイッチ」です(どのポインタレジスタを取得するかは、モデルによってはすべてのレジスタがポインタレジスタになる可能性があり、命令によって指定されます)。この「相互に排他的だが網羅的な選択」は、「場合分けによる定義」のもう一つの例であり、以下の例に示す算術的な等価性は、Kleene (1952) p. 229の定義から導き出されています。
追加された命令の中でおそらく最も有用なのはCOPY命令でしょう。実際、Elgot-Robinson (1964) はモデルP 0とP' 0にCOPY命令を組み込みました。一方、Cook-Reckhow (1973) はアキュムレータベースのモデルに、アキュムレータへの間接COPY命令とアキュムレータからの間接COPY命令という2つの間接命令のみを組み込みました。
命令の過剰:単一レジスタを操作する命令は、間接的な「デュアル」(条件付きジャンプと無条件ジャンプを含む、Elgot-Robinsonモデル参照)で拡張できるため、間接命令を含めると、単一パラメータ/レジスタ命令(例:INC (d, r)、INC (i, r))の数が倍増します。さらに悪いことに、2パラメータ/レジスタ命令には、それぞれ4種類のバリエーションが存在します。例:
同様に、2 つのソース レジスタ r s1 r s2と 1 つのデスティネーション レジスタ r dを使用する 3 つのレジスタ命令では、次の加算のように 8 種類の結果が生成されます。
結果は次のようになります:
1つのレジスタを「アキュムレータ」(下記参照)として指定し、許可される各種命令に厳しい制限を設けることで、直接操作と間接操作の過剰な量を大幅に削減できます。ただし、削減後の命令セットが十分であることを確認する必要があり、削減によって「重要な」操作あたりの命令数が増えることを考慮する必要があります。
歴史的慣例により、レジスタは、一連の算術演算中に文字通り数値を累算する「算術器官」であるアキュムレータ専用になります。
しかし、アキュムレータは算術演算「操作」ごとに命令数を増やすという犠牲を払います。特に、「レジスタr2が指すレジスタの内容を間接的にインクリメントする」といった「リード・モディファイ・ライト」命令において顕著です。「A」は「アキュムレータ」レジスタAを表します。
| ラベル | 命令 | あ | r2 | 378,426円 | 説明 | |
|---|---|---|---|---|---|---|
| . . . | 378,426 | 17 | ||||
| INCi ( r2 ): | CPY ( i, r2, d, A ) | 17 | 378,426 | 17 | r2の内容はr378,426を指し、内容は「17」です。これをAにコピーします。 | |
| INC (A) | 18 | 378,426 | 17 | Aのセメント含有量 | ||
| CPY ( d, A, i, r2 ) | 18 | 378,426 | 18 | r2の内容はr378,426を指しています。Aの内容をr378,426にコピーします。 |
アキュムレータに特定の名前(例えば「A」)を付けると、命令の中でアキュムレータを暗示することができます。例えば、
ただし、アキュムレータを呼び出さずに CPY 命令を記述すると、命令があいまいになるか、空のパラメータが必要になります。
歴史的には、これら2つのCPY命令にはそれぞれ異なる名前が付けられてきましたが、統一された慣例はありません。伝統的には(例えば、Knuth (1973) の仮想MIXコンピュータなど)、LOADとSTOREという2つの名前が使用されています。ここでは「i/d」パラメータを追加しています。
典型的なアキュムレータベースのモデルでは、2変数演算および定数演算(例:ADD (A, r)、SUB (A, r))はすべて、(i) アキュムレータの内容と、(ii) 指定されたレジスタの内容を使用します。1変数演算(例:INC (A)、DEC (A)、CLR (A))は、アキュムレータのみを使用します。どちらの命令タイプも、結果(例:和、差、積、商、剰余)をアキュムレータに格納します。
少なくとも 1 つのソース レジスタと宛先レジスタは常にアキュムレータ A であるため、必要に応じてニーモニックを省略できます。したがって、次のようになります。
モデルに無制限のアキュムレータがある場合、他のすべてのレジスタを制限できますか?間接アドレスを導出する少なくとも 1 つの無制限のレジスタを用意しない限り、制限できません。
ミニマリストのアプローチは、それ自体を使用することです (Schönhage はこれを実行します)。
別のアプローチ(Schönhage氏もこれを採用しています)は、特定のレジスタを「間接アドレスレジスタ」と宣言し、間接参照をこのレジスタに限定することです(Schonhage氏のRAM0モデルでは、間接命令と直接命令の両方にAレジスタとNレジスタの両方を使用します)。ここでも、新しいレジスタには慣例的な名前はありません。おそらく「iNdex」の「N」、あるいは「iNdirect」、あるいは「address Number」といった名前でしょう。
柔軟性を最大限に高めるために、アキュムレータ A の場合と同様に、N を増分、減分、クリア、テスト、直接コピーなどの対象となる単なる別のレジスタと見なします。ここでも、たとえば方向と間接指定を提供する単一パラメータに命令を縮小できます。
なぜこれがこんなに興味深いアプローチなのでしょうか?少なくとも2つの理由があります。
(1)パラメータを持たない命令セット:
Schönhageはこれを利用してRAM0命令セットを作成しました。以下のセクションをご覧ください。
(2)RAMをポストチューリングマシンに縮小する:
ミニマリストのふりをして、アキュムレータAと間接レジスタN(例:r = {r0, r1, r2, ... })を除くすべてのレジスタを、(非常に)有限な容量を持つ無限のピジョンホールの列に縮小します。これらのピジョンホールは、(非常に)有限な数値(例:{0, 1}という値を持つ1ビット)を保持することしかできません。同様に、アキュムレータも1ビットに縮小します。演算処理はレジスタ{A, N}に限定し、間接演算を使用してレジスタの内容をアキュムレータに取り込み、アキュムレータからレジスタに0または1を書き込みます。
さらに進んで、「ERASE」と「PRINT」という 2 つの「定数」レジスタを使用して A を完全に削除します: [ERASE]=0、[PRINT]=1。
COPY 命令の名前を変更し、INC (N) = RIGHT、DEC (N) = LEFT を呼び出すと、ポストチューリングマシンと同じ命令に加えて、追加の CLRN が得られます。
上のセクションでは、無制限の間接参照機能を持つRAMがポストチューリングマシンを生成することを非公式に示しました。ポストチューリングマシンはチューリングマシンと同等であるため、間接参照機能を持つRAMはチューリングマシンと同等であることが示されました。
ここでは、もう少し形式的なデモンストレーションを行います。まず、3つの予約レジスタ「E」、「P」、「N」と、その右側に1、2、…、nという無限のレジスタセットを持つモデルを設計します。レジスタ1、2、…、nは「テープのマス目」とみなします。レジスタ「N」は、「ヘッド」が現在監視している「スキャンされたマス目」を指します。「ヘッド」は条件ジャンプ内にあると考えることができます。間接アドレッシングを使用していることに注意してください(Elgot-Robinson、398ページ参照)。「N」を減分または増分すると、(見かけ上の)ヘッドはマス目に沿って「左」または「右」に移動します。間接CPYを使用して、「E」=0または「P」=1の内容を、Nが指す「スキャンされたマス目」に移動します。
テープが左端にあるという事実は、小さな問題を引き起こします。LEFT が発生するたびに、命令は「N」の内容がゼロであるかどうかをテストする必要があります。ゼロである場合は、そのカウントを「0」のままにする必要があります (これは設計者としての選択です。たとえば、マシン/モデルに「イベントをトリガー」させるように選択できます)。
以下の表は、ポストチューリング命令をRAM上の同等の命令に基づいて定義し、その動作例を示しています。レジスタr0~r5のテープ上のヘッドの(見かけ上の)位置は網掛けで示されています。
| ニモニック | ラベル: | E | P | 北 | r0 | r1 | r2 | r3 | r4 | r5 | 等 | レジスターでのアクション | 有限状態マシン命令レジスタ IR のアクション | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 始める: | 0 | 1 | 3 | 1 | 0 | |||||||||||
| R | 右: | INC (N) | 0 | 1 | 4 | 1 | 0 | [N] +1 → N | [IR] +1 → IR | |||||||
| P | 印刷: | CPY ( d, P, i, N ) | 0 | 1 | 4 | 1 | 1 | [P]=1 → [N]=r4 | [IR] +1 → IR | |||||||
| E | 消去: | CPY ( d, E, i, N ) | 0 | 1 | 4 | 1 | 0 | [E]=0 → [N]=r4 | [IR] +1 → IR | |||||||
| L | 左: | JZ ( i, N, 終わり ) | 0 | 1 | 4 | 1 | 0 | なし | IF N =r4] =0 THEN "end" → IR else [IR]+1 → IR | |||||||
| 12月(北) | 0 | 1 | 3 | 1 | 0 | [N] -1 → N | ||||||||||
| J0 (停止) | 空白の場合ジャンプ: | JZ ( i, N, 終わり ) | 0 | 1 | 3 | 1 | 0 | なし | IF N =r3] =0 THEN "end" → IR else [IR]+1 → IR | |||||||
| J1 (停止) | ジャンプマーク: | JZ ( i, N, 停止 ) | 0 | 1 | 3 | 1 | 0 | N =r3] → A | IF N =r3] =0 THEN "end" → IR else [IR]+1 → IR | |||||||
| 終わり | . . . など | 0 | 1 | 3 | 1 | 0 | ||||||||||
| 停止: | H | 0 | 1 | 3 | 1 | 0 | なし | [IR] +1 → IR |
このデモンストレーション全体を通して、有限状態マシンの TABLE 内の命令は制限付き、つまり有限であることに留意する必要があります。
CASE演算子を用いて間接CPY ( i, q, d, φ )を構築します。対象レジスタのアドレスはレジスタ「q」の内容によって指定されます。CASE演算子によってこの数値が決定されると、CPYはレジスタの内容をその数値で直接レジスタ「φ」に格納します。「y」という追加のレジスタが必要になります。これはアップカウンタとして機能します。
CASE演算子はKleene (1952) (p. 229) とBoolos-Burgess-Jeffrey (2002) (p. 74) で説明されており、後者はその有用性を強調しています。以下の定義はKleeneによるものですが、一般的な「IF-THEN-ELSE」構文を反映するように修正されています。
CASE 演算子は、"case_0" から "case_last" まで、どの "case" が満たされるかに応じて自然数を φ に "返します"。満たされるケースがない場合は、"default" (別名 "woops") と呼ばれる数値が φ に返されます (ここで、x は、レジスタ q と文字列 r0、... rlast など、いくつかのパラメータの選択を示します)。
場合別の定義φ ( x , y):
Kleene は、テストを実行する「述語」 Q n がすべて相互に排他的であることを要求します。つまり、「述語」は出力として { true、false } のみを生成する関数です。Boolos-Burgess-Jeffrey は、ケースが「網羅的」であるという要件を追加します。
まず、レジスタqに、ターゲットレジスタのアドレスを表す数値が格納されています。しかし、この数値は何でしょうか?「述語」は、JE (q, y, z) に続いて INC (y) と、順にこの数値をテストして、その値を見つけ出します。数値が明示的に特定されると、CASE演算子はこのレジスタの内容を φ に直接/明示的にコピーします。
Case_0 (y の再帰の基本ステップ) は次のようになります。
Case_n (誘導ステップ) は次のようになります。「n」、「n+1」、...、「last」の各インスタンスは明示的な自然数でなければならないことに注意してください。
Case_last は誘導を停止し、 CASE 演算子を制限します (これにより、「間接コピー」演算子も制限されます)。
もしCASEが無限に実行できるなら、それはμ演算子でしょう。しかし、それはできません。有限状態マシンの「状態レジスタ」が最大カウント(例えば65365 = 11111111,11111111 2)に達したか、テーブルの命令が尽きてしまったかのどちらかです。結局のところ、 CASEは有限マシンなのです。
よく見られる Cook および Rechkow モデルは、3 値レジスタの Malzek モデル (Knuth ニーモニックで記述されています。元の命令には TRA、Read、Print 以外のニーモニックはありませんでした) に少し似ています。
LOAD ( C, rd ) ; C → rdCは任意の整数LOAD ( 0, 5 )レジスタ 5 をクリアします。 ADD ( rs1, rs2, rd ) ; [rs1] + [rs2] → rdレジスタは同じでも異なっていても構いません。ADD ( A, A, A )レジスタ A の内容を 2 倍にします。 SUB ( rs1, rs2, rd ) ; [rs1] - [rs2] → rdレジスタは同じでも異なっていても構いません。SUB ( 3, 3, 3 )レジスタ 3 をクリアします。 COPY ( i, rp, d, rd ) ; [[rp] ] → rdポインタレジスタr pが指すソースレジスタの内容を間接的に宛先レジスタにコピーします。 COPY ( d, rs, i, rp ) ; [rs] → [rp]ソースレジスタr sの内容をポインタレジスタr pが指す宛先レジスタにコピーします。 JNZ ( r, Iz ) ;[r]が正の場合、条件付きジャンプを実行します。つまり、IF [r] > 0 であれば命令zにジャンプし、そうでなければシーケンスを続行します(CookとReckhowはこれを「Xj > 0の場合、制御をm行に転送する」と呼んでいます)。 READ ( rd ) ;「入力」を宛先レジスタr dにコピーする PRINT ( rs ) ;ソースレジスタ r sの内容を「出力」にコピーします。Schönhage (1980) は、SMMポインター マシンモデルの同等性の証明のために選択された、非常に原始的で原子化されたモデルについて説明しています。
RAM1 モデル: Schönhage 氏は、彼の構築を使用して、より一般的で使いやすい形式の「後継」のような RAM (この記事のニーモニックを使用) を形成する方法を示しています。
LDA k ; k --> A kは定数、例えば「47」のような明示的な数値である。 LDA ( d, r ) ; [r] → A ;Aを直接ロードする LDA ( i, r ) ; [[r]] → A ;間接的にAをロードする STA ( d, r ) ; [A] → r ;Aを直接保存する STA ( i, r ) ; [A] → [r] ;間接的にAを保存する JEA ( r, z ) ; IF [A] = [r] then Iz else continue INCA ; [A] + 1 --> A RAM0 モデル: Schönhage の RAM0 マシンには、1 文字で示される 6 つの命令があります (6 番目の「C xxx」は、「次のパラメータをスキップする」ことを意味するようです)。Schönhage は、アキュムレータを「z」、「N」を「n」などで指定しました。Schönhage のニーモニックではなく、上記で開発されたニーモニックを使用します。
(Z), CLRA: 0 → A(A), INCA: [A] +1 → A(N), CPYAN: [A] → N(A), LDAA: [[A]] → A ; Aの内容はレジスタアドレスを指し示します; レジスタの内容をAに格納します(S), STAN: [A] → [N] ; Nの内容はレジスタアドレスを指し示します。Aの内容をNが指すレジスタに格納します。(C), JAZ ( z ): [A] = 0 then go to Iz; 彼の扱いは曖昧間接参照は、(i) store_A_via_N STAN と連携した CPYAN (コンテンツ A を N にコピー/転送) と、(ii) 特有の間接参照命令から生じますLDAA ( [[A]] → [A] )。
無制限のレジスタ「アドレス」レジスタを持たないあらゆる種類のカウンタマシンは、レジスタ「r」を名前で指定しなければならないという定義上の事実は、モデルが「r」を有限数とすることを要求していることを示しています。ただし、rが「無制限」であるというのは、モデルがそのジョブを実行するために必要なレジスタの数に上限を示唆しないという意味です。例えば、r < 83,617,563,821,029,283,746 や r < 2^1,000,001 などである必要はありません。
間接アドレスを指定するレジスタのアドレスを提供するために無制限のレジスタを提供することで、この制限を回避できます。
いくつかの例外を除き、これらの参照はレジスター マシンのものと同じです。