基本的なスタック操作操作はどれですか?


8

私はスタック指向の仮想マシンを作成しているので、それがどのように機能するかについての一般的な理解のためにForthを学び始めました。次に、仮想マシンに実装する必要のある重要なスタック操作操作をリストしました。

drop ( a -- )
dup  ( a -- a a )
swap ( a b -- b a )
rot  ( a b c -- b c a )

次の4つのスタック操作操作を使用して、他のスタック操作操作をシミュレートできると思います。例えば:

nip  ( a b -- b )       swap drop
-rot ( a b c -- c a b ) rot rot
tuck ( a b -- b a b )   dup -rot
over ( a b -- a b a )   swap tuck

とはいえ、スタックを操作するために必要な基本的なスタック操作操作をすべてリストしたかどうかを知りたかったのです。

実装する必要のある基本的なスタック操作操作はありますか?それがないと、私の仮想マシンは完全なチューリングではありませんか?


3
Postcriptにも興味があるかもしれません。
mouviciel 2012

1
2番目のリストのいくつかの選択肢は、スタックの長さに大きく依存していませんか?たとえばrot rotの代わりとして-rot?スタックに4つ以上のアイテムがあるとどうなりますか?あなたがしてする必要はないrotとしてしばしばLength-1倍を達成するのは-rot
Marjan Venema

はい、そうです。そのため、@ mouvicielの回答を受け入れました。代わりにdupswapそしてrot私が使用pick ( a_n ... a_0 n -- a_n ... a_0 a_n)してroll ( a_n ... a_0 n i )代わりに。iが負の場合roll、要素を左にシフトします。他の右側に。
Aadit M Shah

チューリング完全性について-あなたは興味があるかもしれませんプログラミング言語がチューリング完全であるための最低基準はありますか?コンピュータサイエンススタック交換から。また、CS.SEは、スタックマシンを完全にチューリングするために必要な操作を要求するのに適した場所かもしれません。

1
SWAPはDUP ROT ROT DROPで実装できることに注意してください。
Gort the Robot

回答:


5

多くのスタックベースの言語も使用rollします。これはrot、スタック内の任意の数の要素に一般化されています。また、スタックを逆方向に回転させるための逆の操作も実装します。

それrollはよりも基本的だと思いrotます。

これのチューリング性については私には答えがありません。


何らかの種類の任意のメモリへの参照がなければ、スタックのサイズを照会してスタック上の任意の要素にアクセスできる場合、ロールが完全性を満足させるPDAのノートのみが存在します
ラチェットフリーク

4

ブレント・カービーは、彼のTheory of Concatenative Combinatorsで、スタック操作の多くの計算的に完全なベースを確立しています。スタック用語の「引用」の概念が必要です。彼の命名法を使用すると、次のコンビネータのセットはすべてチューリング完全です。

            [B] [A] cons == [[B] A]
            [B] [A] sip  == [B] A [B]
            [B] [A] k    == A

    [D] [C] [B] [A] s'   == [[D] C] A [D] B
            [B] [A] k    == A

            [B] [A] cake == [[B] A] [A [B]]
            [B] [A] k    == A

[E] [D] [C] [B] [A] j'   == [[D] A [E] B] [C] B
                [A] i    == A

            [B] [A] take == [A [B]]
            [B] [A] cat  == [B A]
                [A] i    == A

            [B] [A] cons == [[B] A]
            [B] [A] sap  == A B

私の好みの命名法を使用すると、実装するのに便利な完全なセットは次のとおりです。

          A dup == A A
       A B swap == B A
         A drop ==
        A quote == [A]
[A] [B] compose == [A B]
      [A] apply == A
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.