Đó là các hoạt động thao tác ngăn xếp cơ bản?


8

Tôi đang tạo một máy ảo định hướng ngăn xếp, và vì vậy tôi bắt đầu học Forth để hiểu một cách tổng quát về cách nó sẽ hoạt động. Sau đó, tôi liệt kê danh sách các thao tác thao tác ngăn xếp cần thiết mà tôi sẽ cần thực hiện trong máy ảo của mình:

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

Tôi tin rằng bốn thao tác thao tác ngăn xếp sau đây có thể được sử dụng để mô phỏng mọi thao tác thao tác ngăn xếp khác. Ví dụ:

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

Điều đó đang được nói tuy nhiên tôi muốn biết liệu tôi đã liệt kê tất cả các hoạt động thao tác ngăn xếp cơ bản cần thiết để thao tác ngăn xếp theo bất kỳ cách nào có thể.

Có bất kỳ thao tác thao tác ngăn xếp cơ bản nào nữa mà tôi sẽ cần phải thực hiện, mà không có máy ảo nào của tôi sẽ không hoàn thành?


3
Bạn có thể quan tâm đến Postcript là tốt.
mouviciel

1
Không có một số lựa chọn thay thế trong danh sách thứ hai của bạn phụ thuộc rất nhiều vào độ dài của ngăn xếp? Ví dụ rot rotnhư là một thay thế cho -rot? Điều gì xảy ra khi có nhiều hơn 3 mục trên ngăn xếp? Sau đó, bạn có phải rotthường xuyên Length-1đạt được -rotkhông?
Marjan Venema

Vâng, thực sự. Đó là lý do tại sao tôi chấp nhận câu trả lời @mouviciel cung cấp. Thay vì dup, swaprottôi sử dụng pick ( a_n ... a_0 n -- a_n ... a_0 a_n)roll ( a_n ... a_0 n i )thay vào đó. Nếu ilà âm thì rolldịch chuyển các phần tử sang trái; khác bên phải.
Aadit M Shah

Đối với tính đầy đủ của Turing - bạn có thể quan tâm đến Có tiêu chí tối thiểu nào để ngôn ngữ lập trình được Turing hoàn thành không? từ trao đổi Stack Khoa học Máy tính. CS.SE cũng có thể là một nơi tốt để yêu cầu các hoạt động cần thiết cho máy stack được hoàn thành Turing.

1
Lưu ý rằng SWAP có thể được thực hiện với DUP ROT ROT DROP.
Gort Robot

Câu trả lời:


5

Nhiều ngôn ngữ dựa trên ngăn xếp rollcũng sử dụng , đó là một khái quát rotvề số lượng phần tử tùy ý trong ngăn xếp. Họ cũng thực hiện các hoạt động ngược lại để xoay ngăn xếp theo cách khác.

Tôi sẽ nói rằng đó rolllà cơ bản hơn rot.

Tôi không có câu trả lời mặc dù về Turingness của điều này.


không có tài liệu tham khảo nào đó cho bộ nhớ tùy ý, điều duy nhất bạn có là một lưu ý của PDA rằng cuộn sẽ đáp ứng tính hoàn chỉnh nếu bạn có thể truy vấn kích thước của ngăn xếp để bạn có thể truy cập phần tử tùy ý trên ngăn xếp
ratchet freak

4

Brent Kirby thiết lập một số cơ sở tính toán hoàn chỉnh của các hoạt động ngăn xếp trong Lý thuyết kết hợp liên kết của mình . Bạn cần một số khái niệm về trích dẫn trên sàn gỗ của các thuật ngữ stack. Sử dụng danh pháp của mình, các bộ tổ hợp sau đây đều hoàn chỉnh Turing:

            [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

Sử dụng danh pháp ưa thích của tôi, một bộ hoàn chỉnh thuận tiện để thực hiện là:

          A dup == A A
       A B swap == B A
         A drop ==
        A quote == [A]
[A] [B] compose == [A B]
      [A] apply == A
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.