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 jakP
lubI
Deterministycznej, mechanistyczny procedura wytwarzania wyjście
o
z programup
i wprowadzaniai
, w którymp
,i
io
są członkamiP
,I
iO
odpowiednio. 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
, I
i O
musi 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
f
odI
doO
istnieje programp
wP
taki sposób, że podanyp
i 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 I
i O
będziemy liczbami kościelnymi . (Nie jest to kompletna metoda Turinga, jeśli weźmiemy I
i O
bę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.