CoC jest zwieńczeniem wszystkich trzech wymiarów Lambda Cube. To wcale nie jest dla mnie oczywiste. Wydaje mi się, że rozumiem poszczególne wymiary, a połączenie dowolnych dwóch wydaje się skutkować względnie prostym zjednoczeniem (może czegoś mi brakuje?). Ale kiedy patrzę na CoC, zamiast wyglądać jak połączenie wszystkich trzech, wygląda to zupełnie inaczej. Z jakiego wymiaru pochodzą typy, podpory i małe / duże typy? Gdzie zniknęły produkty zależne? I dlaczego skupia się na propozycjach i dowodach zamiast typów i programów? Czy istnieje coś równoważnego, co koncentruje się na typach i programach?
Edycja: W przypadku, gdy nie jest to jasne, proszę o wyjaśnienie, w jaki sposób CoC jest równoważne z prostym połączeniem wymiarów Kostki Lambda. I czy istnieje gdzieś faktyczny związek wszystkich trzech (gdzieś pod względem programów i typów, a nie dowodów i propozycji)? Jest to odpowiedź na komentarze do pytania, a nie na bieżące odpowiedzi.
soft-question
. Nie widzę tu właściwie pytania technicznego. Być może możesz być bardziej szczegółowy w kwestii tego, o co pytasz?Odpowiedzi:
Po pierwsze, aby powtórzyć jeden z punktów Cody, Rachunek konstrukcji indukcyjnych (na których opiera się jądro Coqa) bardzo różni się od Rachunku konstrukcji. Najlepiej jest zacząć od teorii typów Martina-Löfa od wszechświatów, a następnie dodać prop sort na dole hierarchii typów. Jest to zupełnie inna bestia niż oryginalny CoC, który najlepiej jest uważać za zależną wersję F-omegi. (Na przykład CiC ma modele teoretyczne, a CoC nie.)
To powiedziawszy, sześcian lambda (którego członkiem jest CoC) jest zazwyczaj przedstawiany jako system czystego rodzaju ze względu na oszczędność pod względem liczby zasad pisania. Traktując rodzaje, typy i terminy jako elementy tej samej kategorii składniowej, możesz zapisać o wiele mniej reguł, a twoje dowody również stają się nieco mniej zbędne.
Jednak dla zrozumienia pomocne może być wyraźne oddzielenie różnych kategorii. Możemy wprowadzić trzy kategorie składniowe, rodzaje (z podziałem na metazmowę
k
), typy (z podziałem na metawazęA
) i terminy (z podziałem na metaznaturęe
). Następnie wszystkie osiem systemów można rozumieć jako wariacje tego, co jest dozwolone na każdym z trzech poziomów.λ → (Rachunek prosty lambda)
Jest to podstawowy typowy rachunek lambda. Istnieje jeden rodzaj
∗
, który jest rodzajem typów. Same typy to typy atomowep
i typy funkcjiA → B
. Terminy to zmienne, abstrakcje lub aplikacje.λω_ (STLC + operatory wyższego rodzaju)
STLC pozwala na abstrakcję tylko na poziomie terminów. Jeśli dodamy go na poziomie typów, dodamy nowy rodzaj,
k → k
który jest typem funkcji na poziomie typu, a także abstrakcjęλa:k.A
i aplikacjęA B
na poziomie typu. Więc teraz nie mamy polimorfizmu, ale mamy operatory typu.Jeśli pamięć służy, ten system nie ma więcej mocy obliczeniowej niż STLC; po prostu daje możliwość skracania typów.
λ2 (System F)
Zamiast dodawać operatory typu, moglibyśmy dodać polimorfizm. Na poziomie typu dodajemy,
∀a:k. A
który jest wzorem typu polimorficznego, a na poziomie terminu dodajemy abstrakcję do typówΛa:k. e
i aplikacji typówe [A]
.Ten system jest znacznie potężniejszy niż STLC - jest tak silny, jak arytmetyka drugiego rzędu.
λω (System F-omega)
Jeśli mamy zarówno operatory typu, jak i polimorfizm, otrzymujemy F-omegę. Ten system jest mniej więcej teorią typu jądra większości współczesnych języków funkcjonalnych (takich jak ML i Haskell). Jest również znacznie potężniejszy niż System F - jest równoważny siłą arytmetyki wyższego rzędu.
λP (LF)
Zamiast polimorfizmu moglibyśmy pójść w kierunku zależności od prostego rachunku różniczkowego lambda. Jeśli zezwoliłeś typowi funkcji na użycie jej argumentu w typie zwracanym (tzn.
Πx:A. B(x)
Zamiast pisaćA → B
), to otrzymasz λP. Aby było to naprawdę przydatne, musimy rozszerzyć zestaw rodzajów o rodzaj operatorów typów, które przyjmują warunki jako argumentyΠx:A. k
, dlatego też musimy dodać odpowiednią abstrakcjęΛx:A.B
i aplikację równieżA [e]
na poziomie typu.Ten system jest czasem nazywany LF lub Edinburgh Logical Framework.
Ma taką samą moc obliczeniową jak prosty rachunek lambda.
λP2 (bez nazwy specjalnej)
Możemy również dodać polimorfizm do λP, aby uzyskać λP2. Ten system nie jest często używany, więc nie ma określonej nazwy. (Jeden artykuł, który przeczytałem, który go wykorzystał, to indukcja Hermana Geuversa, nie jest możliwy do uzyskania w teorii zależnych typów drugiego rzędu .)
Ten system ma taką samą wytrzymałość jak System F.
λPω_ (bez nazwy specjalnej)
Możemy również dodać operatory typu do λP, aby uzyskać λPω_. Wymaga to dodania rodzaju
Πa:k. k'
dla operatorów typów oraz odpowiedniej abstrakcjiΛx:A.B
i aplikacji na poziomie typuA [e]
.Ponieważ ponownie nie ma skoku w sile obliczeniowej nad STLC, system ten powinien również stanowić dobrą podstawę dla logicznej struktury, ale nikt tego nie zrobił.
λPω (rachunek konstrukcji)
Wreszcie dochodzimy do λPω, rachunku konstrukcji, poprzez pobranie λPω_ i dodanie wcześniejszego typu polimorficznego
∀a:k.A
oraz abstrakcji na poziomie terminówΛa:k. e
i aplikacjie [A]
do tego.Rodzaje tego systemu są znacznie bardziej wyraziste niż w F-omega, ale ma tę samą siłę obliczeniową.
źródło
Najpierw jednak należy prawdopodobnie spróbować rozwiązać różne problemy. Interaktywna przysłowia twierdzeń Coqa opiera się na podstawowej teorii typów, czasem z miłością nazywanej rachunkiem konstrukcji indukcyjnych z wszechświatami . Zauważysz, że jest to coś więcej niż tylko „rachunek konstrukcji”, i rzeczywiście, jest tam o wiele więcej rzeczy niż tylko CoC. W szczególności myślę, że masz wątpliwości co do tego, które funkcje są właściwe w CoC. W szczególności rozróżnienie Set / Prop i wszechświaty nie pojawiają się w CoC.
Nie podam tutaj pełnego przeglądu systemów Pure Type, ale ważna zasada (dla funkcjonalnych PTS, takich jak CoC) jest następująca
Mamy więc 4 reguły, które odpowiadają 4 różnym celom:
Wyjaśnię każde z nich bardziej szczegółowo.
Dzięki tym dodatkowym rodzajom i regułom otrzymujesz coś, co nie jest PTS, ale czymś bliskim. Jest to (prawie) rozszerzony rachunek konstrukcji , który jest bliższy podstawie Coq. Dużym brakującym elementem są typy indukcyjne, o których tutaj nie będę rozmawiać.
Edycja: Istnieje całkiem niezłe odniesienie, które opisuje różne funkcje języków programowania w ramach PTS, opisując PTS, który jest dobrym kandydatem do pośredniej reprezentacji funkcjonalnego języka programowania:
Henk: A Typed Intermediate Language , SP Jones i E. Meijer.
źródło