Mọi thuật toán tự sửa đổi có thể được mô hình hóa bằng thuật toán không tự sửa đổi không?


12

Nếu chúng ta có bất kỳ chương trình máy tính tùy ý nào có thể sửa đổi hướng dẫn của nó, liệu có thể mô phỏng chương trình đó với một chương trình không thể sửa đổi hướng dẫn của nó không?


Biên tập:

Tôi chưa quen với stackexchange nên không chắc chắn liệu tôi có được phép hỏi một câu hỏi MỚI ở đây không, nhưng ở đây là: Ok vì vậy bằng chứng rằng nó có thể thực sự rất đơn giản như các bạn đã chỉ ra. Bây giờ, tôi tự hỏi: Có vấn đề nào hiệu quả hơn (và ở mức độ nào) để sử dụng thuật toán tự sửa đổi hiệu quả nhất để giải quyết vấn đề, so với thuật toán không tự điều chỉnh hiệu quả nhất tương đương đầu vào-đầu ra?

Câu trả lời:


29

Vâng nó có thể. Bạn có thể mô phỏng chương trình bằng cách sử dụng trình thông dịch cho ngôn ngữ được viết. Bây giờ, chương trình (trình thông dịch) đã được sửa và điều từng là chương trình tự sửa đổi giờ là dữ liệu của trình thông dịch.

Đặc biệt, bạn hoàn toàn có thể có một máy Turing phổ dụng cho phép TM mô phỏng để sửa đổi mô tả của chính nó. (Ý tôi là mô tả của máy mô phỏng; không phải UTM.)


11
Bạn thậm chí không cần người phiên dịch giả thuyết. Một CPU thực thi thuật toán tự sửa đổi của bạn, chính nó là một cỗ máy thực thi một thuật toán cố định (quy định cách nó thực thi các hướng dẫn)
Alexander - Tái lập lại

1
@AlexanderMomchliov tồn tại các CPU có thể sửa đổi các phần của lệnh được đặt khi đang di chuyển (nhưng vâng, ý tưởng là như nhau - phần lập trình là dữ liệu, vi điều khiển chạy nó là trình thông dịch - mặc dù chỉ vào một vi điều khiển bên trong một tế bào FPGA có thể là khó khăn)
John Dvorak

để trả lời: "bạn hoàn toàn có thể có một máy Turing phổ dụng cho phép TM mô phỏng để sửa đổi mô tả của chính nó." Tôi đang suy nghĩ: không phải điều này đặt ra câu hỏi sao? bởi vì bây giờ bạn vẫn cần chứng minh rằng TM đang được mô phỏng thực sự có thể mô hình hóa thuật toán tự sửa đổi, phải không? Vẫn có thể có một chương trình tự sửa đổi KHÔNG phải là máy Turing, vì vậy chúng tôi không thể sử dụng tính hoàn chỉnh của Turing để cho thấy rằng nó có thể được mô phỏng, vì tính hoàn chỉnh của Turing liên quan đến mô phỏng của TM và tự sửa đổi algo không phải là một TM.
dùng56834

@ Lập trình2134 Nó không đặt ra câu hỏi nào cả. Bất cứ CPU nào bạn nghĩ bạn đang chạy chương trình tự sửa đổi của mình, tôi có thể mô phỏng CPU đó trên máy Turing. Để giải thích nó theo một cách khác, chương trình ban đầu là một chuỗi các hướng dẫn hữu hạn, một số trong đó xảy ra sửa đổi chính chương trình. Mỗi hướng dẫn có thể được mô phỏng bằng UTM, mỗi sửa đổi có thể được mô phỏng và mỗi hướng dẫn sửa đổi có thể được mô phỏng. Không có gì, ở bất kỳ giai đoạn nào của quá trình này, vượt quá sức mạnh của máy Turing.
David Richerby

10

Bất kỳ mô hình tính toán hoàn chỉnh Turing nào không có mã sửa đổi (hoặc "mã") đều đóng vai trò là bằng chứng của tuyên bố đó. Tôi không biết rằng bất kỳ của các mô hình tiêu chuẩn (TM, RAM, ...) làm có thay đổi mã, vì vậy chúng tôi không cần phải nhìn quá xa.

Để có được một chương trình bằng bất kỳ ngôn ngữ nào bạn có, hãy biên dịch từ một mô hình như vậy (và đảm bảo rằng trình biên dịch không đưa ra sửa đổi mã).


Đây là, tất nhiên, một cuộc tranh cãi hiện sinh: có một chương trình tương đương. Nhưng chúng tôi cũng biết rằng có các trình biên dịch đệ quy (tức là có thể tính toán) giữa bất kỳ hai ngôn ngữ hoàn chỉnh Turing nào, vì vậy đó là cách bạn có được một chương trình có dạng (đọc: bằng ngôn ngữ) mà bạn muốn.


4

Để thêm vào câu trả lời của David Richerby :

Nếu đúng là không có thuật toán tự sửa đổi nào không thể được mô hình hóa bằng các thuật toán không tự sửa đổi, thì các thuật toán đó sẽ phải được thực thi trên một cái gì đó cũng tự sửa đổi. Nó phải là rùa cho đến hết.

Như tôi đã đề cập trong nhận xét của mình, thuật toán tự sửa đổi có thể được thực thi trên bộ xử lý tuân theo các quy tắc của thuật toán tĩnh (được mã hóa trong thiết kế của nó) để "cho" biết cách thực hiện các lệnh máy.


1
Tôi nghĩ rằng đó có thể là một đường phân chia thú vị. Tôi nghĩ người ta có thể lập luận rằng "cuộc sống" là một thuật toán tự điều chỉnh không thể được mô hình hóa bằng các thuật toán không tự sửa đổi, nhưng một lần nữa, "cuộc sống" thường không được coi là một thuật toán.
Cort Ammon

2
@CortAmmon: Nếu chúng ta xem "cuộc sống" là một thuật toán, thì đầu vào và đầu ra của nó là gì? Làm thế nào người ta có thể chứng minh rằng bất kỳ thuật toán tương đương (có nghĩa là, bất kỳ thuật toán nào tạo ra cùng một đầu ra khi được cung cấp cùng một đầu vào) phải tự sửa đổi?
ruakh

@ruakh Nếu tôi cho rằng cuộc sống là một thuật toán tự sửa đổi, các đầu vào sẽ là chính nó, và đầu ra của nó sẽ là chính nó. Chứng minh rằng nó không thể được giảm xuống thành một thuật toán không tự sửa đổi sẽ khó hơn, nhưng tôi nghĩ đó là một giả thuyết phổ biến. Rốt cuộc, có bao nhiêu người muốn tin rằng họ có thể rút gọn thành một thuật toán có thể chạy trên máy tính?
Cort Ammon

1
@CortAmmon: Tôi không thể rút gọn thành thuật toán chạy trên máy tính vì thuật toán đó không còn là "tôi"; Tôi nhiều hơn đầu vào và đầu ra của tôi. Nhưng nếu chúng ta bắt đầu từ giả định rằng tôi chỉ là một thuật toán, sau đó tacking trên "có thể chạy trên một máy tính" không thực sự thay đổi bất cứ điều gì. R:
ruakh

1
@CortAmmon Một chương trình tự xuất ra chính nó là đầu vào cat. (Không có ý định chơi chữ, mặc dù mèo
tình cờ
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.