Perché due punti per indicare che un valore appartiene a un tipo?


19

Pierce (2002) introduce la relazione di battitura a pagina 92 ​​scrivendo:

La relazione di battitura per le espressioni aritmetiche, scritta "t: T", è definita da un insieme di regole di inferenza che assegnano i tipi ai termini

e la nota dice: Il simbolo viene spesso usato al posto di:. La mia domanda è semplicemente perché i teorici dei tipi preferiscono usare: over ? Se un tipo è un insieme di valori, ha perfettamente senso scrivere , non è necessaria una nuova notazione.T t TTtT

È simile a come alcuni scrittori cs preferiscono anche pensato che sia un abuso di notazione e dovrebbe essere scritto ?3n2=O(n2)3n2O(n2)


7
L'adesione predicato di può essere sia vera o falsa, mentre una digitazione dichiarazione è generalmente interepreted come una dichiarazione di fatto che è dichiarata per essere vero o di essa la verità può essere derivato da puramente mezzi sintattici. Al contrario, si tratta di un numero primo, per il quale non è sufficiente alcun metodo sintattico di appartenenza. xX x:X
Musa Al-hassy,

4
@ MusaAl-hassy: è una falsa dichiarazione di ciò che sta succedendo. Non è dichiarato vero, poiché ciò significherebbe che posso "dichiarare" che " false: int", per esempio. Né è il caso che il giudizio debba necessariamente essere derivato da "mezzi puramente sintattici", ad esempio nel caso della teoria dei tipi interna di una categoria con le famiglie.
Andrej Bauer,


2
Per aggiungere al commento di @ MusaAl-hassy, ​​nella teoria computazionale del tipo di Bob Constable, Stuart Allen, Bob Harper, et al., è usato abitualmente per scrivere giudizi perché è più simile a un predicato di appartenenza (vedi questo discorso, diapositiva 25 , per un esempio).
xrq

3
Sicuramente è anche un abuso di notazione e dovrebbe davvero essere scritto ? (I matematici potrebbero preferire .)λ n .3 n 2O ( λ n . N 2 ) n 3 n 2O ( n n 2 )3n2O(n2)λn.3n2O(λn.n2)n3n2O(nn2)
Oscar Cunningham,

Risposte:


12

Perché ciò che è alla destra dei due punti non è necessariamente un insieme e ciò che è alla sinistra dei due punti non è necessariamente un membro di quell'insieme.

La teoria dei tipi è nata all'inizio del XX secolo come approccio alla fondazione della matematica. Bertrand Russel scoprì un paradosso nella teoria degli insiemi ingenui e lavorò sulla teoria dei tipi come un modo per limitare il potere espressivo della teoria degli insiemi per evitare questo (e qualsiasi altro) paradosso. Nel corso degli anni, Russel e altri hanno definito molte teorie di tipi. In alcune teorie dei tipi, i tipi sono insiemi con determinate proprietà, ma in altri sono un diverso tipo di bestia.

In particolare, molte teorie dei tipi hanno una formulazione sintattica . Ci sono regole che fanno sì che una cosa abbia un tipo. Quando le regole di battitura utilizzate come base per una teoria, è importante distinguere cosa dicono le regole di battitura da ciò che si potrebbe dedurre applicando ulteriori conoscenze esterne. Ciò è particolarmente importante se le regole di battitura sono alla base di una teoria della dimostrazione: i teoremi che si basano sulla teoria degli insiemi con la logica classica e l'assioma della scelta possono o meno contenere una logica costruttiva, per esempio. Uno dei documenti fondamentali in questo settore è Church 's A Formulation of the Simple Theory of Types (1940)

Forse il modo in cui la distinzione tra tipi e set è più evidente è che la regola più semplice per gli insiemi, vale a dire che due insiemi sono uguali se hanno gli stessi elementi, di solito non si applica ai tipi. Vedi la risposta di Andrej Bauer qui e la sua risposta su una domanda correlata per alcuni esempi. Quel secondo thread ha altre risposte che vale la pena leggere.

In un calcolo tipizzato, dire che i tipi sono insiemi significa in effetti dare una semantica ai tipi. Dare a un calcolo una semantica di tipo teorico non è banale. Ad esempio, supponiamo di definire una lingua con funzioni. Che set è un tipo di funzione? Le funzioni totali sono determinate dal loro grafico, come ci viene insegnato nella teoria degli insiemi 101. Ma che dire delle funzioni parziali? Vuoi dare a tutte le funzioni non terminanti la stessa semantica? Non è possibile interpretare i tipi come set per un calcolo che consente funzioni ricorsive fino a quando non si risponde a tale domanda. Dare una semantica denotazionale ai linguaggi di programmazione o ai calcoli era un problema difficile nei primi anni '70. L'articolo fondamentale qui è Verso una semantica matematica per linguaggi informatici (1971) diDana Scott e Christopher Strachey . Il wikibook di Haskell ha una buona presentazione dell'argomento.

Come ho scritto sopra, una seconda parte della risposta è che anche se sei riuscito a dare ai tipi una semantica teorica set, la cosa a sinistra dei due punti non è sempre un elemento dell'insieme. I valori hanno tipi, ma anche altre cose, come espressioni e variabili . Ad esempio, un'espressione in un linguaggio di programmazione tipizzato ha un tipo anche se non termina. Potresti voler confondere integere , ma non è un elemento di .ZZ(x := 0; while true; do x := x + 1; x)Z

Non so quando è nata la notazione del colon per i tipi. Ora è standard nella semantica e comune nei linguaggi di programmazione, ma né Russel né Church lo hanno usato. L'Algol non lo usò, ma il linguaggio fortemente ispirato all'Algol Pascal nel 1971. Sospetto che non sia stato il primo, però, perché molti documenti teorici dei primi anni '70 usano la notazione, ma non conosco un uso precedente. È interessante notare che questo è stato subito dopo l'unificazione dei concetti di tipi dalla programmazione e dalla logica - come mostra Simon Martini in Diversi tipi di tipi nei linguaggi di programmazione , quello che era chiamato un "tipo" nei linguaggi di programmazione fino agli anni '60 veniva dal volgare uso della parola e non dalla teoria dei tipi.


37

Il motivo principale per preferire la notazione dei due punti alla relazione di appartenenza è che la relazione di appartenenza può essere fuorviante perché i tipi non sono (solo) raccolte .t:TtT

[ Supplemento: dovrei notare che la teoria dei tipi storicamente è stata scritta usando . La concezione del tipo di Martin-Löf aveva lo scopo di catturare i set in modo costruttivo, e già Russell e Whitehead usavano per il memebrship di classe. Sarebbe interessante rintracciare il momento in cui diventato più prevalente di .]ϵ:

Un tipo descrive un certo tipo di costruzione, cioè come creare oggetti con una determinata struttura, come usarli e quali equazioni hanno su di loro.

Per esempio un tipo di prodotto ha regole introduzione che spiegano come fare coppie ordinate e regole eliminazione spiegano che possiamo proiettare il primo ed il secondo componente da qualsiasi elemento di . La definizione di non non inizia con le parole "la raccolta di tutti ..." e non lo fa dire nulla di simile da nessuna parte "tutti gli elementi di A × B sono coppie" (ma si segue dalla definizione che ogni elemento di A × B è proposizionalmente uguale a una coppia). In constrast, la definizione set-teorica di X × YA×BA×BA×BA×BA×BX×Y è indicato come "l'insieme di tutte le coppie ordinate ...".

La notazione t:T indica il fatto che t ha la struttura descritta da T .

Un tipo T non deve essere confusa con la sua estensione , che è l'insieme di tutti gli oggetti di tipo T . Un tipo non è determinato dalla sua estensione, proprio come un gruppo non è determinato dal suo set di portanti. Inoltre, può accadere che due tipi abbiano la stessa estensione, ma siano diversi, ad esempio:

  1. Σ(n:N).isprime(n)×iseven(n)×(n>2)
  2. Σ(n:N).isprime(n)×isodd(n)×(n<2)

L'estensione di entrambi è vuota, ma non sono dello stesso tipo.

:at:Tt:UTUtTt

aA¬(aA)aAt:T


1
Andrej, ottima risposta. Ti capita di conoscere l'origine storica della notazione del colon?
Andreas Rossberg,

xααϵ

1
gG

2
f:STfSTf(ST)ampiamente usato molto prima che la teoria dei tipi diventasse popolare.
user21820,

1
f(ST)STf:ST

5

Björn,

Probabilmente c'è un riferimento precedente ma, per prima cosa, i due punti sono stati usati nel linguaggio di programmazione Pascal:

Primo successo di Google per Pascal


2
Non c'erano linguaggi di programmazione precedenti che usavano :?
Andrej Bauer,

@AndrejBauer, in effetti, ho scritto "Probabilmente c'è un riferimento precedente ma ..." per evitare questo fatto probabile.
Bjørn Kjos-Hanssen

@AndrejBauer Algol no. Era :usato nei documenti teorici prima degli anni '70?
Gilles 'SO- smetti di essere malvagio'

1
Fortran ha REAL :: xma non so se questo è venuto prima di Pascal.
Michael,

1
@Michael Fortran è venuto prima di Pascal (circa 1955 contro circa 1970), ma penso che questa sintassi specifica sia stata introdotta solo in Fortran 90, quindi molto più tardi di Pascal. Vedi ad esempio qui fortranwiki.org/fortran/show/Modernizing+Old+Fortran
Federico Poloni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.