Welches sind die grundlegenden Stapelmanipulationsoperationen?

8

Ich erstelle eine stapelorientierte virtuelle Maschine und habe Forth gelernt, um ein allgemeines Verständnis dafür zu erhalten, wie es funktionieren würde. Dann habe ich die wesentlichen Stapelmanipulationsvorgänge in die engere Wahl gezogen, die ich in meiner virtuellen Maschine implementieren müsste:

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

Ich glaube, dass die folgenden vier Stapelmanipulationsoperationen verwendet werden können, um jede andere Stapelmanipulationsoperation zu simulieren. Zum Beispiel:

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

Davon abgesehen wollte ich jedoch wissen, ob ich alle grundlegenden Stapelmanipulationsoperationen aufgelistet habe, die erforderlich sind, um den Stapel auf irgendeine mögliche Weise zu manipulieren.

Gibt es grundlegendere Stack-Manipulationsoperationen, die ich implementieren müsste, ohne die meine virtuelle Maschine nicht vollständig wäre?

Aadit M Shah
quelle
3
Möglicherweise interessieren Sie sich auch für Postcript.
Mouviciel
1
Sind einige der Alternativen in Ihrer zweiten Liste nicht sehr abhängig von der Länge des Stapels? Zum Beispiel rot rotals Alternative für -rot? Was passiert, wenn sich mehr als 3 Elemente auf dem Stapel befinden? Müssten Sie dann nicht rotso oft wie möglich Length-1, um dies zu erreichen -rot?
Marjan Venema
Ja, in der Tat. Deshalb habe ich die Antwort von @mouviciel akzeptiert. Statt dup, swapund rotich verwenden pick ( a_n ... a_0 n -- a_n ... a_0 a_n)und roll ( a_n ... a_0 n i )stattdessen. Wenn inegativ ist roll, werden die Elemente nach links verschoben. sonst rechts.
Aadit M Shah
In Bezug auf die Vollständigkeit von Turing - Sie könnten interessiert sein Gibt es Mindestkriterien für eine vollständige Programmiersprache von Turing? aus dem Computer Science Stack Exchange. CS.SE ist möglicherweise auch ein guter Ort, um nach den Vorgängen zu fragen, die erforderlich sind, damit eine Stapelmaschine Turing-vollständig ist.
1
Beachten Sie, dass SWAP mit DUP ROT ROT DROP implementiert werden kann.
Gort the Robot

Antworten:

5

Viele stapelbasierte Sprachen verwenden rollebenfalls eine verallgemeinerte Sprache rotfür eine beliebige Anzahl von Elementen im Stapel. Sie implementieren auch die umgekehrte Operation zum Drehen des Stapels in die andere Richtung.

Ich würde sagen, das rollist grundlegender als rot.

Ich habe jedoch keine Antwort auf Turingness davon.

Mouviciel
quelle
Ohne Verweise auf einen beliebigen Speicher ist das einzige, was Sie haben, ein PDA- Hinweis, dass die Rolle die Vollständigkeit erfüllt, wenn Sie die Größe des Stapels abfragen können, damit Sie auf ein beliebiges Element auf dem Stapel zugreifen können
Ratschenfreak
4

Brent Kirby legt in seiner Theorie der verketteten Kombinatoren eine Reihe von rechnerisch vollständigen Grundlagen für Stapeloperationen fest . Sie benötigen einen Begriff für das "Zitieren" von Stapelbegriffen. Unter Verwendung seiner Nomenklatur sind die folgenden Sätze von Kombinatoren alle Turing-vollständig:

            [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

Unter Verwendung meiner bevorzugten Nomenklatur ist ein praktischer vollständiger Satz zur Implementierung:

          A dup == A A
       A B swap == B A
         A drop ==
        A quote == [A]
[A] [B] compose == [A B]
      [A] apply == A
Jon Purdy
quelle