Jeśli mamy dowolny dowolny program komputerowy, który może modyfikować jego instrukcje, czy można symulować ten program za pomocą programu, który nie może modyfikować jego instrukcji?
Edytować:
Jestem nowy w stosie wymiany, więc nie jestem pewien, czy mogę zadawać NOWE pytanie tutaj, ale oto: Ok, więc dowód, że jest to możliwe, jest naprawdę prosty, jak pokazaliście. Zastanawiam się teraz: czy istnieją problemy, w przypadku których bardziej efektywne (i do jakiego stopnia) jest użycie najbardziej wydajnego algorytmu samodmodyfikującego w celu rozwiązania problemu, w porównaniu z najbardziej wydajnym algorytmem niemodyfikującym równoważącym dane wejściowe i wyjściowe?
źródło
Każdy model obliczeniowy z pełnym Turingiem, który nie ma modyfikującego kodu (lub „kodu”) służy jako dowód na to stwierdzenie. Nie wiem, że każdy ze standardowych modeli (TM, RAM, ...) nie mają kodu modyfikacji, więc nie musimy szukać zbyt daleko.
Aby uzyskać program w dowolnym języku, który masz na myśli, skompiluj z takiego modelu (i upewnij się, że kompilator nie wprowadza modyfikacji kodu).
Jest to, oczywiście, egzystencjalny argumentem: nie jest odpowiednikiem programu. Ale wiemy również, że istnieją rekurencyjne (tj. Obliczalne) kompilatory między dowolnymi dwoma językami kompletnymi Turinga, więc w ten sposób otrzymujesz program o takiej formie (czytaj: w języku), jaki chcesz.
źródło
Aby dodać odpowiedź Davida Richerby :
Gdyby prawdą było, że nie można modelować algorytmów samomodyfikujących za pomocą algorytmów niemodyfikujących, wówczas algorytmy te musiałyby zostać wykonane na czymś, co również samo-modyfikuje się. Musiałyby to być żółwie do samego końca.
Jak wspomniałem w moim komentarzu, algorytm samodmodyfikujący może być wykonany na procesorze, który sam przestrzega reguł algorytmu statycznego (zakodowanego w jego konstrukcji), który „mówi” mu, jak wykonywać instrukcje maszynowe.
źródło
cat
. (Nie ma