Escape from the trappit (Cops)

9

To jest wyzwanie polegające na zdefiniowaniu języków i udowodnieniu, że są one kompletne.

To jest wątek gliniarzy. Wątek rabusiów jest tutaj .

Gliny

Jako policjant przygotujesz dwie rzeczy:

  • Formalna specyfikacja języka programowania lub innego systemu obliczeniowego. (Systemy obliczeniowe są zdefiniowane poniżej.)

  • Dowód na to, że twój system jest kompletny, według nieco ścisłej definicji poniżej.

Opublikujesz specyfikację swojego języka, a złodzieje spróbują go „złamać”, udowadniając jego kompletność. Jeśli zgłoszenie nie zostanie złamane w ciągu tygodnia, możesz oznaczyć je jako bezpieczne i opublikować dowód. (Twoja odpowiedź może zostać unieważniona, jeśli ktoś znajdzie błąd w twoim dowodzie, chyba że możesz go naprawić).

To jest , więc zwycięzcą zostanie odpowiedź, która ma najwięcej głosów, i która nie jest pęknięta ani unieważniona. Wyzwanie jest otwarte - nie przyjmuję odpowiedzi.

Ze względu na to wyzwanie system obliczeniowy zostanie zdefiniowany jako cztery rzeczy:

  • „Zestaw programów” P. Będzie to niezliczony zestaw nieskończony, np. Łańcuchy, liczby całkowite, drzewa binarne, konfiguracje pikseli na siatce itp. (Ale patrz ograniczenie techniczne poniżej).

  • „Zestaw danych wejściowych” I, który będzie również licznym zestawem nieskończonym i nie musi być takim samym zestawem jak P(choć może być).

  • „Zestaw wyjściowy” O, który podobnie będzie licznym zestawem nieskończonym i może, ale nie musi być taki sam jak PlubI

  • Deterministycznej, mechanistyczny procedura wytwarzania wyjście oz programu pi wprowadzania i, w którym p, ii osą członkami P, Ii Oodpowiednio. Ta procedura powinna być taka, aby mogła być w zasadzie zaimplementowana na maszynie Turinga lub innym abstrakcyjnym modelu obliczeniowym. Procedura może oczywiście nie zostać zatrzymana, w zależności od programu i jego wkładu.

Zestawy P, Ii Omusi być taka, że można wyrazić je jako ciągi w przeliczalnych sposób. (W przypadku najbardziej rozsądnych wyborów nie będzie to miało znaczenia; ta reguła istnieje, aby uniemożliwić wybranie dziwnych zestawów, takich jak zestaw maszyn Turinga, które się nie zatrzymują).

Kompletność Turinga zostanie zdefiniowana następująco:

  • Dla każdej obliczalnej funkcji częściowej fod Ido Oistnieje program pw Ptaki sposób, że podany pi wprowadzony i, wyjście ma wartość f(i)if f(i). (W przeciwnym razie program się nie zatrzyma.)

Słowo „obliczalny” w powyższej definicji oznacza „można obliczyć za pomocą maszyny Turinga”.

Zauważ, że ani reguła 110, ani bitowy znacznik cykliczny nie jest zgodny z Turinga, ponieważ nie mają wymaganej struktury wejścia-wyjścia. Rachunek lambda jest zakończony według Turinga, o ile zdefiniujemy Ii Obędziemy liczbami kościelnymi . (Nie jest to kompletna metoda Turinga, jeśli weźmiemy Ii Obędziemy ogólnie wyrażeniami lambda.)

Pamiętaj, że nie musisz podawać implementacji swojego języka, ale jeśli chcesz, możesz dołączyć ją do swojej odpowiedzi. Nie należy jednak polegać na implementacji, aby w jakikolwiek sposób definiować język - specyfikacja powinna być sama w sobie kompletna, a jeśli istnieje sprzeczność między specyfikacją a implementacją, należy ją traktować jako błąd w implementacji.

Nataniel
źródło
9
Przykro mi, ale konkurs popularności jest obiektywnym kryterium wygranej. Bycie pop-conem nie stanowi wyzwania poza tematem i nigdy tego nie zrobiło. Najnowsza meta dyskusja ma konsensusu +27 za tym, więc mimo że pięć z was wolą go mieć różny naprawdę nie mają stanąć na nogi. Ponieważ pytanie to zostało zamknięte w stosunku do uzgodnionej polityki, proszę o jego ponowne otwarcie.
Nathaniel
2
(zwróć uwagę, że WhatWizard zamknął je z innego powodu.)
202729
2
Proszę nie używać głosów ścisłych jako przycisku „Nie zgadzam się” lub „Nie podoba mi się to”. Do egzekwowania zasad witryny należy stosować głosy zbliżone. Jeśli nie zgadzasz się z polityką, zabierz ją do meta - nie zamykaj wyzwań, które są na temat na podstawie konsensusu społeczności.
Mego
1
@Mego Głosowałem za zamknięciem tego tekstu jako zbyt szerokiego, ale uważam również, że jest to nie na temat naszych obecnych zasad dotyczących pop-kons. Oczekujemy, że konkursy popularności będą miały „Jasną specyfikację celu, który należy osiągnąć”, to pytanie brzmi „do X” w najbardziej kreatywny sposób. Jest dla mnie jasne, że nie ma innego celu niż poprawna odpowiedź i że tag pop-con jest dołączony tylko po to, aby był otwarty.
Ad Hoc Garf Hunter
2
@WhatWizard celem, który należy osiągnąć, jest nieoczywiste ukończenie Turinga, a nieoczywistość oceniana jest jako brak złamania w ciągu tygodnia. Czy to nie jest jasne?
Nathaniel

Odpowiedzi:

10

Arytmetyka z zasłoniętymi oczami

Prawdopodobnie dość łatwy język na początek, relatywnie mówiąc. (Istnieją ograniczenia dotyczące tego, jak trudny mogę uczynić język, ponieważ sam muszę to udowodnić - Turing - ukończ!)

Dla tego języka zestaw programów jest zestawem programów arytmetycznych z zasłoniętymi oczami, jak podano w sekcji „program” poniżej, zestaw wejściowy jest zbiorem liczb całkowitych dodatnich, a zestaw wyjściowy jest zbiorem liczb całkowitych (cały zestaw, nie tylko dodatnie liczby całkowite).

Ten język jest dość interesujący - może nawet praktycznie przydatny - ponieważ ma mniej lub bardziej całkowity brak kontroli, ponieważ jest całkowicie oparty na obliczeniach na liczbach, których nie widać. To czyni go potencjalnie użytecznym jako język do implementacji programów w systemach homomorficznego szyfrowania .

Specyfikacja

Blindfolded Arithmetic to ezoteryczny język programowania o następujących specyfikacjach:

Przechowywanie danych

Stan działającego programu arytmetycznego z zasłoniętymi oczami składa się z sześciu zmiennych, z których każda może przechowywać liczbę całkowitą. (Nie ma żadnych ograniczeń na to jak duże lub małe Liczby te mogą się, w szczególności, mogą iść negatyw). Zmienne są nazywane a, b, c, d, e, i i.

Na początku programu, aaby ewłącznie każdy zainicjowany na 0 i ijest inicjowany do liczby całkowitej dodatniej zaczerpnięte z danych wprowadzanych przez użytkownika. (Jeśli dane wejściowe nie są dostępne, iinicjowane jest na 1.)

Jeśli program zaprzestanie wykonywania (może to nastąpić tylko z powodu dzielenia przez zero), wartość iwyjściowa bezpośrednio przed próbą podziału jest używana jako wynik programu.

Program

Program arytmetyczny z zasłoniętymi oczami to lista poleceń, z których każda ma jedną z następujących postaci (gdzie v można zastąpić dowolną nazwą zmiennej, potencjalnie inną nazwą za każdym razem, gdy jest używana):

  • v = v + v
  • v = v - v
  • v = v * v
  • v = v / v

Zauważ, że każdy operand poleceń musi być zmienną; ten język nie pozwala na użycie literalnych liczb całkowitych.

Wykonanie programu odbywa się poprzez uruchomienie każdego z poleceń w sekwencji, a następnie zapętlenie z powrotem do początku i kontynuowanie uruchamiania poleceń w sekwencji, ad infinitum (lub dopóki nie nastąpi próba podzielenia przez zero, co zakończy program) .

Każde polecenie ma taką samą semantykę, jakiej można się spodziewać po notacji, która nie różni się od tej używanej przez większość praktycznych języków programowania: pobierane są wartości drugiej i trzeciej zmiennej podanej w poleceniu, operacja arytmetyczna (dodawanie / odejmowanie / multiply / divide odpowiednio dla czterech form poleceń) jest do nich stosowany, a wynikowa wartość przechowywana w pierwszej zmiennej. Dzielenie tutaj jest dzieleniem całkowitym, zaokrąglanym w kierunku 0.

Nie ma żadnego przepływu sterującego innego niż wyjście z programu; polecenia zawsze zmieniają się kolejno, aż do wystąpienia podziału przez zero (jeśli występuje) i kończy program. W szczególności nie ma możliwości bezpośredniego odczytu zmiennych, a jedynie wykorzystania ich jako źródła obliczeń, których wyniki wpływają na wartości przypisane innym zmiennym.

ais523
źródło
Czy możesz sprawdzić, czy w mojej odpowiedzi czegoś brakuje?
user202729,
@ user202729: (komentuje tutaj, ponieważ nie mam tam przedstawiciela, aby skomentować) Nie można symulować „ruchu, jeśli fałsz” z „przerzucenia” i „ruchu, jeśli jest prawdziwy”, ponieważ nie można cofnąć przerzucenia po przeprowadzce Będziesz więc potrzebował innego sposobu, aby sobie z tym poradzić (np. Sposób na odwrócenie testów, co nie powinno być trudne). Co ważniejsze, jest to dowód kompletności Turinga pod względem zachowania zatrzymania, ale definicja w pytaniu wymaga, abyś mógł również wykonywać operacje wejścia / wyjścia, więc musisz udowodnić, że możesz to zrobić.
ais523
Mam nadzieję, że część I / O (teraz) jest w porządku. Jeśli chodzi o drugi problem, zdaję sobie sprawę, że wewnętrzne, jeśli nawet nie są konieczne, stany pośrednie rozwiązują wszystkie problemy (chociaż nie jestem pewien, jak to powiedzieć)
user202729
@ user202729: nadal nie jest w pełni poprawne (np. pytanie wymaga, abyś mógł wypisać liczby ujemne, a także musisz zmienić cel, iaby numer stanu - który zawsze będzie „zatrzymał” - nie będzie być częścią wyniku), ale jest wystarczająco blisko, że nie oznaczę tego jako bezpiecznego, ponieważ wyraźnie dostaniesz pełny crack, mając wystarczająco dużo czasu i wystarczającego wyjaśnienia zasad. Nie chcę wygrać tego wyzwania pod względem technicznym.
ais523
Jest to bardzo zbliżone do ograniczeń, które stosuje de.ioccc.org/years-spoiler.html#1992_buzzard.1 . Ta implementacja używa liczb całkowitych o stałym rozmiarze, a zatem nie jest kompletna dla Turinga, a ta jest poważnie ograniczona pod względem liczby zmiennych, ale myślę, że dowód jest jednak podobny.
b_jonas