To jest policjanci i złodzieje 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 konkurs popularności, 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 jakP(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 jakPlubIDeterministycznej, mechanistyczny procedura wytwarzania wyjście
oz programupi wprowadzaniai, w którymp,iiosą członkamiP,IiOodpowiednio. 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
fodIdoOistnieje programpwPtaki sposób, że podanypi wprowadzonyi, wyjście ma wartośćf(i)iff(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.