Dlaczego dwukropek oznacza, że ​​wartość należy do typu?

19

Pierce (2002) wprowadza relację pisania na stronie 92, pisząc:

Relacja typowania wyrażeń arytmetycznych, zapisana „t: T”, jest zdefiniowana przez zestaw reguł wnioskowania przypisujących typy do terminów

a przypis mówi: Symbol jest często używany zamiast:. Moje pytanie brzmi po prostu, dlaczego teoretycy tekstu wolą używać: ponad ? Jeśli typ jest zbiorem wartości, wówczas idealnie jest napisać , nie jest wymagana nowa notacja.TtT

Czy jest to podobne do tego, jak niektórzy pisarze cs wolą nawet sądząc, że jest to nadużycie zapisu i powinno być napisane ?3n2=O(n2)3n2O(n2)

Björn Lindqvist
źródło
7
Predykat członkostwa xX może mieć wartość prawda lub fałsz, podczas gdy deklaracja typu x:X jest ogólnie interpretowana jako stwierdzenie faktyczne, które jest zadeklarowane jako prawdziwe lub jego prawda może być uzyskana za pomocą środków czysto składniowych. Porównaj to z liczbą pierwszą, dla której nie wystarczy składniowa metoda członkostwa.
Musa Al-hassy
4
@ MusaAl-hassy: to fałszywe przedstawienie tego, co się dzieje. Nie jest to deklarowane jako prawdziwe, ponieważ oznaczałoby to, że mogę na przykład „zadeklarować”, że „ false: int”. Nie jest też tak, że osąd musi koniecznie pochodzić z „czysto syntaktycznych środków”, na przykład w przypadku wewnętrznej teorii typów kategorii z rodzinami.
Andrej Bauer,
3
Powiązane pytanie na cs.se: Jaka jest dokładnie różnica semantyczna między zestawem a typem?
Dyskretna jaszczurka
2
Aby dodać do komentarza @ MusaAl-hassy, ​​w teorii typu obliczeniowego Boba Constable'a, Stuarta Allena, Boba Harpera i in., jest rutynowo stosowany do pisania osądów, ponieważ jest bardziej podobny do predykatu członkostwa (patrz ten wykład, slajd 25, dla przykładu).
xrq
3
Z pewnością 3n2O(n2) jest również nadużyciem notacji i czy naprawdę powinno być napisane ? (Matematycy mogą preferować n 3 n 2O ( n n 2 ) .)λn.3n2O(λn.n2)n3n2O(nn2)
Oscar Cunningham

Odpowiedzi:

12

Ponieważ to, co znajduje się po prawej stronie jelita grubego, niekoniecznie musi być zbiorem, a to, co jest po lewej stronie jelita grubego, niekoniecznie jest członkiem tego zestawu.

Teoria typów rozpoczęła się na początku XX wieku jako podejście do podstaw matematyki. Bertrand Russel odkrył paradoks w naiwnej teorii zbiorów i pracował nad teorią typów jako sposobem ograniczenia mocy ekspresyjnej teorii zbiorów, aby uniknąć tego (i każdego innego) paradoksu. Przez lata Russel i inni zdefiniowali wiele teorii typów. W niektórych teoriach typów typy są zestawami o określonych właściwościach, ale w innych są innym rodzajem bestii.

W szczególności wiele teorii typów ma sformułowanie składniowe . Istnieją reguły, które powodują, że coś ma typ. Kiedy reguły pisania są podstawą teorii, ważne jest, aby odróżnić to, co mówią reguły pisania od tego, co można wywnioskować, stosując dodatkową wiedzę zewnętrzną. Jest to szczególnie ważne, jeśli reguły typowania są podstawą teorii dowodu: twierdzenia, które są oparte na teorii mnogości z logiką klasyczną i aksjomatem wyboru, mogą na przykład zawierać logikę konstruktywną. Jednym z przełomowych prac z tej dziedziny jest Kościół „s preparat o prostej teorii typów (1940)

Być może sposób, w jaki rozróżnienie między typami i zestawami jest najbardziej widoczne, polega na tym, że najbardziej podstawowa reguła dla zbiorów, a mianowicie, że dwa zestawy są równe, jeśli mają te same elementy, zwykle nie ma zastosowania do typów. Zobacz odpowiedź Andreja Bauera tutaj i jego odpowiedź na powiązane pytanie w celu uzyskania przykładów. Ten drugi wątek zawiera inne odpowiedzi, które warto przeczytać.

W rachunku typowym stwierdzenie, że typy są zestawami, w rzeczywistości daje semantykę typom. Podanie rachunku semantyki teoretycznej nie jest trywialne. Załóżmy na przykład, że definiujesz język z funkcjami. Jaki zestaw jest rodzajem funkcji? Funkcje całkowite są określone na podstawie ich wykresu, jak uczymy w teorii mnogości 101. Ale co z funkcjami częściowymi? Czy chcesz nadać wszystkim nie kończącym się funkcjom tę samą semantykę? Nie można interpretować typów jako zestawów dla rachunku różniczkowego, który umożliwia funkcje rekurencyjne, dopóki nie odpowiesz na to pytanie. Nadanie językom programowania lub rachunkom denotacyjnej semantyki było trudnym problemem na początku lat siedemdziesiątych. Artykuł podsumowujący jest w kierunku semantyki matematycznej dla języków komputerowych (1971) autorstwaDana Scott i Christopher Strachey . Haskell Wikibook ma dobrą prezentację tematu.

Jak napisałem powyżej, drugą częścią odpowiedzi jest to, że nawet jeśli zdołałeś nadać typom semantykę teoretyczną, to rzecz po lewej stronie dwukropka nie zawsze jest elementem zestawu. Wartości mają typy, ale także inne rzeczy, takie jak wyrażenia i zmienne . Na przykład wyrażenie w typowym języku programowania ma typ, nawet jeśli się nie kończy. Może być skłonny do scalenia integeri Z , ale (x := 0; while true; do x := x + 1; x)nie jest elementem Z .

Nie wiem, kiedy pojawiła się notacja dwukropka dla typów. Jest teraz standardem w semantyce i powszechny w językach programowania, ale ani Russel, ani Church nie użyli go. Algol go nie używał, ale mocno inspirowany Algolem język, którym posługiwał się Pascal w 1971 roku. Podejrzewam, że nie był to pierwszy, ponieważ wiele prac teoretycznych z wczesnych lat 70. używa tego zapisu, ale nie znam wcześniejsze użycie. Co ciekawe, nastąpiło to wkrótce po ujednoliceniu koncepcji typów z programowania i logiki - jak pokazuje Simon Martini w kilku typach typów w językach programowania , tak zwany „typ” w językach programowania do lat sześćdziesiątych pochodzi z języka ojczystego użycie słowa, a nie z teorii typów.

Gilles „SO- przestań być zły”
źródło
37

Głównym powodem preferowania zapisu dwukropka t:T od relacji członkostwa tT jest to, że relacja członkostwa może wprowadzać w błąd, ponieważ typy nie są (tylko) kolekcjami .

[ Uzupełnienie: Należy zauważyć, że teoria typów historycznych została napisana przy użyciu . Koncepcja typu Martina-Löfa miała konstruktywnie wychwytywać zbiory, a Russell i Whitehead już używali ϵ do członkostwa w klasie. Interesujące byłoby wyśledzenie momentu, w którym : stał się bardziej rozpowszechniony niż .]

Typ opisuje pewien rodzaj konstrukcji, tj. Jak tworzyć obiekty o określonej strukturze, jak z nich korzystać i jakie równania się z nimi wiążą.

Na przykład typ produktu A×B ma zasady wprowadzania, które wyjaśniają, jak tworzyć uporządkowane pary, oraz zasady eliminacji wyjaśniające, że możemy rzutować pierwszy i drugi komponent z dowolnego elementuA×B . DefinicjaA×B jestniezaczynają się od słów „zbierania wszystkich ...” i nie robi to znaczy nigdzie czegoś podobnego „wszystkie elementyA×B są pary” (ale tonastępujez definicji, że każdy elementA×B jestpropozycjonalnierówna parze). Przeciwnie, teoretyczna definicja X×Y jest określona jako „zbiór wszystkich uporządkowanych par ...”.

Oznaczenie t:T , oznacza, że t ma strukturę opisaną przez T .

Typ T nie należy mylić z jego przedłużeniem , która stanowi zbiór wszystkich obiektów typu T . Typ nie jest określony przez jego rozszerzenie, tak jak grupa nie jest określona przez jego zestaw nośny. Ponadto może się zdarzyć, że dwa typy mają to samo rozszerzenie, ale są różne, na przykład:

  1. Rodzaj wszystkich parzystych liczb pierwszych większych niż dwa: Σ(n:N).isprime(n)×iseven(n)×(n>2) .
  2. Rodzaj wszystkich liczb nieparzystych mniejszych niż dwa: Σ(n:N).isprime(n)×isodd(n)×(n<2) .

Rozszerzenie obu jest puste, ale nie są tego samego typu.

Istnieją dalsze różnice między teorią typu : a teorią zbioru . Obiekt w teorii mnogości istnieje niezależnie od tego, co określa ona należy, a może należeć do kilku zestawów. W przeciwieństwie do większości teorie typu zaspokoić wyjątkowość wpisywać: jeśli t : T i t : U ówczesnego T U . Innymi słowy, konstrukcja teoretyczna typu t ma dokładnie jeden typ T , aw rzeczywistości nie ma sposobu, aby mieć tylko obiekt t bez jego (jednoznacznie określonego) typu.at:Tt:UTUtTt

Inną różnicą jest to, że w teorii mnogości możemy zaprzeczyć faktu, że pisząc ¬ ( aA¬(aA) lubaA . Nie jest to możliwe w teorii typów, ponieważt:T jestosądem,który można uzyskać na podstawie reguł teorii typów, ale w teorii typów nie ma niczego, co pozwalałoby stwierdzić, że coś nie zostało wyprowadzone. Kiedy dziecko robi coś z klocków LEGO, z dumą biegnie do rodziców, aby pokazać im konstrukcję, ale nigdy nie biegnie do rodziców, aby pokazać im, czego nie zrobili.

Andrej Bauer
źródło
1
Andrej, świetna odpowiedź. Czy zdarza ci się znać historyczne pochodzenie zapisu dwukropka?
Andreas Rossberg
Niestety nie. Teoria typów Kościoła używała indeksów dolnych, tj. dla zmiennej typu α . Russell i Whitehead użyli ϵ do relacji przynależności do klasy. Algol 68 stawia typy przed nazwami zmiennych. W 1972 Martin-LOF teorii typów zastosowań xααϵ , a więc nie wersja 1984 , ale [1994 WO] używa okrężnicy.
Andrej Bauer,
1
Więc twoim argumentem jest to, że typ jest jak grupa? To ma sens, ale notacja jest powszechna w algebrze abstrakcyjnej. gG
Björn Lindqvist
2
@ BjörnLindqvist: Nie sądzę, aby ta odpowiedź była pełną historią. Nawet w matematyce używamy standardowych „ ” w celu zasygnalizowania, że F jest funkcją z S na T . Dlaczego nie użyliśmy „ f ( S T ) ” lub czegoś takiego? Po prostu tego nie zrobiliśmy. Oczywiście istnieje dobry powód, aby unikać używania „ ” w prezentacji niektórych rodzajów teorii typów, po prostu dlatego, że nie chcemy, aby ludzie nauczani przez ZFC myśleli, że to jak zestawy ZFC, co oczywiście nie jest walizka. Ale to nie znaczy, że jelita grubego nie ma jużf:STfSTf(ST)były szeroko stosowane na długo zanim popularna stała się teoria typów.
user21820
1
@ user21820 „Dlaczego nie użyliśmy ?” Po prostu spekuluję: ponieważ matematycy nigdy nie uważali S T za zbiór. Historia tego zapisu znajduje się tutaj . Wątpię, aby dwukropek z f : S T był inspiracją dla teoretyków typów. Bardziej prawdopodobne jest, że dwukropek teoretyków typów ma związek z faktem, że nie jest znakiem ASCII. f(ST)STf:ST
Michael
5

Björn,

Prawdopodobnie istnieje wcześniejsze odniesienie, ale z jednej strony dwukropek był używany w języku programowania Pascal:

Pierwszy hit Google'a dla Pascala

Bjørn Kjos-Hanssen
źródło
2
Czy nie było wcześniejszych języków programowania :?
Andrej Bauer,
@AndrejBauer rzeczywiście napisałem „Prawdopodobnie wcześniejsza wzmianka, ale ...”, aby uchronić się przed tym prawdopodobnym faktem.
Bjørn Kjos-Hanssen
@AndrejBauer Algol nie. Czy był :używany w pracach teoretycznych przed 1970 rokiem?
Gilles „SO- przestań być zły”
1
Fortran ma, REAL :: xale nie wiem, czy stało się to przed Pascalem.
Michael
1
@Michael Fortran pojawił się wcześniej niż Pascal (ok. 1955 vs. ok. 1970), ale myślę, że ta specyficzna składnia została wprowadzona tylko w Fortran 90, a więc znacznie później niż Pascal. Zobacz np. Tutaj fortranwiki.org/fortran/show/Modernizing+Old+Fortran
Federico Poloni