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)
k ::= ∗
A ::= p | A → B
e ::= x | λx:A.e | e e
Jest to podstawowy typowy rachunek lambda. Istnieje jeden rodzaj ∗
, który jest rodzajem typów. Same typy to typy atomowe p
i typy funkcji A → B
. Terminy to zmienne, abstrakcje lub aplikacje.
λω_ (STLC + operatory wyższego rodzaju)
k ::= ∗ | k → k
A ::= a | p | A → B | λa:k.A | A B
e ::= x | λx:A.e | e e
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)
k ::= ∗
A ::= a | p | A → B | ∀a:k. A
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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ów e [A]
.
Ten system jest znacznie potężniejszy niż STLC - jest tak silny, jak arytmetyka drugiego rzędu.
λω (System F-omega)
k ::= ∗ | k → k
A ::= a | p | A → B | ∀a:k. A | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | Λx:A.B | A [e]
e ::= x | λx:A.e | e e
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)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e]
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e
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 typu A [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)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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 aplikacji e [A]
do tego.
Rodzaje tego systemu są znacznie bardziej wyraziste niż w F-omega, ale ma tę samą siłę obliczeniową.
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?