Là một máy stack với một iterator đọc chuyển tiếp Turing đã hoàn thành?


7

Người ta biết rằng một máy có một ngăn xếp duy nhất không chỉ lưu trữ không giới hạn là không hoàn thành Turing, nếu nó chỉ có thể đọc từ đầu ngăn xếp. Tôi muốn một cỗ máy mạnh hơn một chút so với máy stack, nhưng vẫn chưa hoàn thành Turing. (Tôi tự hỏi liệu có tồn tại một cỗ máy hoàn chỉnh không Turing hay không, có thể mô phỏng một cách xác định bất kỳ automata đẩy xuống không xác định nào với một sự chậm lại đa thức duy nhất.) Phần mở rộng lành tính nhất (đơn giản) xuất hiện trong tâm trí tôi là một (duy nhất) chuyển tiếp đọc lặp.

Hãy để tôi giải thích chi tiết thực hiện, để làm cho nó rõ ràng những gì tôi có nghĩa là bởi một trình vòng lặp đọc phía trước. Một danh sách liên kết đơn có thể được sử dụng để thực hiện một ngăn xếp. Hãy để danh sách được thực hiện bởi một con trỏ pTop, bằng 0 hoặc trỏ đến một SListnút. Một SListnút bao gồm một trường tải trọng valuevà một trường con trỏ pNext, trong đó pNextbằng 0 hoặc trỏ đến một SListnút. Hãy để trình đọc đọc chuyển tiếp được thực hiện bởi một con trỏ pRead, bằng 0 hoặc trỏ đến một SListnút. Các con trỏ pToppReadkhông thể được truy cập trực tiếp, nhưng chỉ có thể được sử dụng thông qua các phương pháp sau:

  • Push(val)tạo một SListnút mới nvới n.value = valn.pNext = pTop, và bộ pTop = &n.
  • Pop()hủy bỏ nếu pTop == 0hoặc pRead == pTop. Mặt khác, nó đọc val = pTop->valuepTopNext = pTop->pNextgiải phóng SListnút được chỉ bởi pTop, đặt pTop = pTopNextvà trả về val.
  • ReadBegin()bộ pRead = pTop.
  • ReadNext()bỏ thai nếu pRead == 0. Nếu không thì nó đọc val = pRead->value, đặt pRead = pRead->pNextvà trả về val.
  • ReadFinished()trả về truenếu pRead == 0, và falsenếu không.

Tôi nên làm rõ điều đó ban đầu pTop == 0pRead == 0. Một phương pháp ReadCancel()mà bộ pRead = 0cũng có thể là một ý tưởng tốt, vì nếu không thì hủy bỏ của Pop()cho pRead == pTopcó thể gây phiền nhiễu.
Thomas Klimpel

3
Giữa máy tự động đẩy xuống và máy Turing trong hệ thống phân cấp Chomsky là máy Turing không xác định giới hạn tuyến tính, tương ứng với ngôn ngữ nhạy cảm theo ngữ cảnh .
Pål GD

1
Có automata với một chồng các ngăn xếp, nhưng tôi quên tên. Ngoài ra, tôi nhớ heap automata "homebrew" của chúng tôi .
Raphael

@ThomasKlimpel chỉ nhận ra rằng có một lỗi trong câu trả lời của tôi, nhưng không phải là một thảm họa, bạn vẫn rõ ràng về sự hoàn chỉnh của Turing, nhưng mô hình của bạn mạnh hơn một chút so với tôi nghĩ trước đây (tôi hiểu sai về tài sản không xóa , một cách thực sự ngu ngốc trong nhận thức muộn màng).
Luke Mathieson

1
@ThomasKlimpel, một người đứng thứ hai, user23013 là chính xác (xem câu trả lời của anh ta), mô hình của bạn đã hoàn thành Turing - điều đáng mừng là bạn có hai con trỏ vào ngăn xếp, trong khi Stack Automata chỉ có một (vì vậy nó có thể di chuyển xung quanh ngăn xếp, nhưng chỉ có thể bật / đẩy ở trên cùng).
Luke Mathieson

Câu trả lời:


5

Mô hình của bạn là Turing - hoàn thành, thật không may.

Bạn có thể mô phỏng một hàng đợi trong cấu trúc dữ liệu của mình bằng thuật toán sau. Nó giới thiệu 3 biểu tượng ngăn xếp mới: .d,x,y

Enqueue(val)chỉ là Push(val).

Dành cho Dequeue():

  1. ReadBegin().
  2. Đếm số lượng của bất cứ thứ gì khác - số lượng dtrong toàn bộ ngăn xếp (nên luôn luôn không âm). Đẩyy hoặc pop x Cho mọi dvà đẩy x hoặc pop ycho bất cứ điều gì khác. Luôn luôn thích pop để đẩy. Cuối cùng sẽ không có bất kỳy trong ngăn xếp và kết quả sẽ là số x trên đỉnh của ngăn xếp.
  3. ReadBegin().
  4. Trong khi pToplà mộtx:
    1. Lặp lại ReadNext()cho đến khi nó trả lại một cái gì đó khácxd.
    2. Pop().
  5. Đẩy một d.
  6. Kết quả cuối cùng ReadNext()được trả về là kết quả của Dequeue.

Bằng chứng là đơn giản. Kiểm tra lịch sử sửa đổi để biết phiên bản phức tạp hơn trước tiên giảm nó thành phiên bản hai chiều.


Tìm thấy sự khác biệt, bạn đã đúng, mô hình của OP đã hoàn tất. Stack Automaton không có đầu đọc thứ hai để quét ngăn xếp, nó chỉ có thể di chuyển đầu bình thường lên và xuống, nhưng chỉ có thể đẩy ở trên cùng.
Luke Mathieson

5

Mô hình của bạn đã hoàn tất Turing (không giống như những gì tôi nghĩ trước đây), hãy xem câu trả lời của người dùng23013 một bản phác thảo bằng chứng (điều cốt lõi là bạn có thể mô phỏng hàng đợi và hàng tự động hoàn thành Turing).

Có một số cách làm suy yếu mô hình của bạn để giảm xuống tương đương với automata ràng buộc tuyến tính hoặc thấp hơn.

Ginsburg, Greibach & Harrison [1] đưa ra một cỗ máy gọi là "Stack Automaton" là một thiết bị PDA có hai khả năng bổ sung: 1. Đầu vào có thể di chuyển sang trái sang phải (để nó có thể quét các phần được nhìn thấy trước đó của đầu vào). 2. Đầu đọc / ghi trên ngăn xếp có thể quét qua ngăn xếp ở chế độ chỉ đọc, nhưng việc đẩy và bật vẫn chỉ xảy ra ở trên cùng. Lưu ý sự khác biệt chính ở đây với mô hình của bạn, điều này làm tôi bối rối trước đó: ngăn xếp chỉ có một đầu / con trỏ mà nó có thể di chuyển lên và xuống ngăn xếp, trong khi mô hình của bạn có hai, đủ để làm cho mô hình Turing của bạn hoàn tất. Họ cũng đưa ra một mô hình khác [2], trong đó đầu vào chỉ có thể được đọc từ trái sang phải, nhưng quét ngăn xếp chỉ đọc bổ sung vẫn có sẵn.

Trong Hình 2 của [1], họ đưa ra ngăn chặn (được chứng minh trong Phần 5 giống nhau, có lẽ với một số phần trong [2]) và các ngôn ngữ automata ngăn xếp không hai chiều được chứa trong R. Tuy nhiên, chúng tương đương với automata ràng buộc tuyến tính không điều kiện, vì vậy chúng nhận ra các ngôn ngữ nhạy cảm ngữ cảnh.

Automata stack stack hai chiều và không điều kiện và automata stack quyết định hai chiều dường như là tương đương nhau, tuy nhiên việc thay đổi đầu vào thành một chiều tạo ra sự khác biệt đáng kể. Tập hợp các ngôn ngữ automata ngăn xếp không điều kiện một chiều là một tập hợp con nghiêm ngặt của các ngôn ngữ nhạy cảm ngữ cảnh (tôi không thể đặt ngón tay của mình vào chính xác ở đâu) và tập hợp các automata ngăn xếp xác định một chiều (tương đương với mô hình của bạn ) ngôn ngữ là một tập hợp con nghiêm ngặt của tập hợp các ngôn ngữ automata ngăn xếp không điều kiện một chiều.

Một loại yếu hơn một lần nữa, nằm dưới đây là các automata ngăn xếp không xóa, chỉ có thể ghi vào ngăn xếp.

Hopcroft & Ullman chỉ ra rằng các ngôn ngữ được công nhận bởi automata ngăn xếp xác định không xóa tương ứng với DSPMộtCE(nđăng nhậpn) và automata ngăn không xóa không xóa tương ứng với DSPMộtCE(n2).

Phụ lục

Sau khi đào sâu hơn, các slide bài giảng này cho thấy rằng automata ngăn xếp không xác định một chiều yếu hơn hẳn so với phiên bản hai chiều, vì vậy nhận ra một cái gì đó ít hơnDSPMộtCE(nđăng nhậpn).

Tôi cũng tìm thấy thêm các bài báo Hopcroft & Ullman [4,5], có thể cung cấp thêm một vài manh mối, nhưng dường như nó sẽ tiếp tuyến vào thời điểm này. [5] ít nhất chứng minh một số tương đương của một số Stack Automata với LBA.

Người giới thiệu

  1. Seymour Ginsburg, Sheila A. Greibach và Michael A. Harrison, "Stack Automata và biên dịch". Tạp chí ACM, 14 (1): 172 Từ201, 1967.
  2. Seymour Ginsburg, Sheila A. Greibach và Michael A. Harrison, "Tự động ngăn xếp một chiều". Tạp chí ACM, 14 (2): 389 Hay418, 1967.
  3. John E. Hopcroft, Jeffrey D. Ullman, "Noneraing Stack Automata" . JCSS, 1 (2): 166 Từ186, 1967.
  4. John E. Hopcroft, Jeffrey D. Ullman, "Xác định ngăn xếp tự động và người vận hành đơn vị" , JCSS, 2: 1-12, 1968.
  5. John E. Hopcroft, Jeffrey D. Ullman, "Hai kết quả trên máy tự động ngăn xếp một chiều" , Hội nghị chuyên đề về chuyển đổi và lý thuyết tự động (SWAT - nhưng không phải là SWAT), 1967.

Nhưng mô hình trong câu hỏi này không phải là không xóa, tương đương với phiên bản hai chiều của nó (bằng cách ghi và đếm các thao tác đẩy / bật / lên / xuống trong ngăn xếp).
dùng23013

@ user23013 đúng, tôi hiểu sai phần không xóa.
Luke Mathieson

Chỉ cần cố gắng để xem tại sao kết luận của tôi không đồng ý với bạn và tôi tin chắc rằng mô hình này thực tế đã hoàn thành Turing. Để xác nhận: nơi nào nói máy tự động ngăn xếp hai chiều không thể sử dụng ngăn xếp như một hàng đợi (đặt con trỏ phụ ở dưới cùng và không bao giờ di chuyển xuống)? Nếu nó bị cấm bằng cách nào đó, tôi nghĩ rằng điều đó không được chỉ định trong câu hỏi này.
dùng23013

@ user23013 con trỏ thứ hai chỉ được đọc, không có thao tác để thêm bất cứ thứ gì vào đâu pRead. (theo tôi hiểu)
Luke Mathieson

Nhưng pToppReadlà hai con trỏ riêng biệt. Bạn có thể enqueue tại pTopvà dequeue (bằng cách di chuyển lên và bỏ qua bất cứ điều gì bên dưới) tại pRead? (Nếu là hai chiều.)
user23013
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.