Tôi biết rằng, trong các ngôn ngữ lập trình bắt buộc, vòng lặp while-do đủ để xây dựng luồng điều khiển để làm cho ngôn ngữ trở nên hoàn chỉnh (theo như luồng điều khiển đi - tất nhiên chúng ta cũng cần bộ nhớ không giới hạn và các toán tử nhất định ...) . Ý chính của câu hỏi của tôi là: vòng lặp do-while có sức mạnh tính toán tương tự như vòng lặp while-do không? Nói cách khác, một ngôn ngữ có thể hoàn thành Turing nếu không thể bỏ qua các hướng dẫn hoàn toàn.
Tôi nhận ra rằng một số ngữ nghĩa ở đây có thể hơi mơ hồ, vì vậy hãy để tôi diễn đạt câu hỏi thực tế bằng một ví dụ cụ thể:
Brainfuck (BF) là một tarpit Turing trong đó luồng điều khiển duy nhất là vòng lặp while-do, được ký hiệu là [...]
(có một thông số ngôn ngữ hoàn chỉnh ở cuối câu hỏi, trong trường hợp bạn không quen thuộc với Brainfuck). Chúng ta hãy định nghĩa một ngôn ngữ mới BF *, nơi ,.+-<>
có cùng ngữ nghĩa như trong BF, nhưng thay vì []
chúng ta có ngôn ngữ {}
biểu thị một vòng lặp do-while. Đó là, sự khác biệt duy nhất với BF là mỗi vòng lặp được thực hiện ít nhất một lần trước khi các lần lặp tiếp theo có thể được bỏ qua.
BF * Turing đã hoàn thành chưa? Nếu đúng như vậy, tôi sẽ quan tâm đến cách tôi có thể dịch BF sang BF *. Nếu không, làm thế nào để tôi chứng minh điều đó?
Một số quan sát của riêng tôi:
- Không phải mọi chương trình BF đều có thể được dịch sang BF *. Chẳng hạn, không thể viết chương trình bằng BF * có thể đọc hoặc in một giá trị - nếu chương trình có khả năng in một hoặc nhiều giá trị, nó sẽ luôn in ít nhất một giá trị. Tuy nhiên, có thể có một tập hợp con Turing hoàn chỉnh của BF có thể được dịch sang BF *.
- Chúng ta không thể đơn giản dịch
[f]
(f
chương trình Brainfuck tùy ý chỉ bao gồm+-[]<>
) thành (trong nỗ lực hủy hiệu ứng của lần lặp đầu tiên), bởi vì a) không phải mọi hàm tính toán đều có nghịch đảo tính toán và b) ngay cả khi nó đã làm, sẽ không nhất thiết phải có ít vòng lặp hơn vì vậy áp dụng bước này một cách đệ quy không được đảm bảo chấm dứt ngay từ đầu.f-1{f}
f-1
f
Dưới đây là một tổng quan nhanh về ngôn ngữ Brainfuck. Brainfuck hoạt động trên một băng vô hạn trong đó mỗi ô chứa một giá trị byte, ban đầu bằng không. Tràn đầy bao quanh, do đó, tăng 255 cho 0 và ngược lại. Ngôn ngữ bao gồm 8 hướng dẫn:
+ Increment the current cell.
- Decrement the current cell.
> Move tape head to the right.
< Move tape head to the left.
, Input a character from STDIN into the current cell.
. Output the current cell as a character to STDOUT.
[ If the current cell is zero, jump past the matching ].
] If the current cell is non-zero, jump back to just behind the matching [.
[]
không chính xác xác định vòng lặp "while do" trong BF. như trong bảng của bạn, dấu ngoặc trái và phải đánh giá ô hiện tại zero / nonzero. Vì vậy, mô tả chính xác của {}
logic đánh giá niềng răng tương ứng là gì? đề nghị thêm cuộc đối thoại / thảo luận trong Trò chuyện Khoa học Máy tính . ngoài ra "các quan sát" của bạn giống như "các định đề" hoặc "các mệnh đề" mà không có bằng chứng.
{}
sẽ {
không làm gì cả và }
giống như ]
. Tôi sẽ không có nhiều thời gian trong vài ngày tới, nhưng tôi sẽ cùng bạn trò chuyện khi tôi tìm thấy chút thời gian.
{}
và lấy đi []
, là BF * Turing hoàn tất. với sự hiểu biết rằng BF []
là một cấu trúc chỉ giống như một cái gì đó tương tự / tương tự như một vòng lặp while-do trong các ngôn ngữ hoàn chỉnh Turing.