Che cosa otteniamo avendo "tipi dipendenti"?


13

Pensavo di aver capito bene la tipizzazione dipendente (DT), ma la risposta a questa domanda: /cstheory/30651/why-was-there-a-need-for-martin-l%C3% B6f-per-creare-teoria-del-tipo-intuitivo mi ha fatto pensare diversamente.

Dopo aver letto su DT e aver cercato di capire cosa sono, sto cercando di chiedermi, cosa otteniamo da questa nozione di DT? Sembrano essere più flessibili e potenti del semplice calcolo lambda tipizzato (STLC), anche se non riesco a capire esattamente "come / perché".

Cosa possiamo fare con i DT che non si possono fare con STLC? Sembra che l'aggiunta di DT renda la teoria più complicata, ma qual è il vantaggio?

Dalla risposta alla domanda sopra:

I tipi dipendenti furono proposti da de Bruijn e Howard che volevano estendere la corrispondenza Curry-Howard dalla logica proposizionale alla logica del primo ordine.

Questo sembra avere un senso ad un certo livello, ma non riesco ancora a cogliere il quadro generale di "come / perché"? Forse un esempio che mostra esplicitamente che l'estensione della corrispondenza CH alla logica FO potrebbe aiutare a capire il punto nel capire qual è il grosso problema con i DT? Non sono sicuro di comprendere anche questo.


1
Li hai cercati su Google? Hai mai sentito parlare di Coq, un teorema che proverà su tipi dipendenti? Sapevi che il teorema dei 4 colori ha dimostrato di usare Coq?
Dave Clarke

2
L'ho fatto davvero. Ciò che è difficile per Google è qual è quel "potere" extra (per mancanza di una parola migliore) che i DT prestano alla teoria dei tipi, in termini intuitivi?
Dottorato di ricerca

1
Perché? I tipi dipendenti consentono di digitare più programmi pur essendo sicuri. Come? Parametrizzando i tipi con i programmi.
Martin Berger,

@MartinBerger - Puoi per favore approfondire "più programmi"? Quale "altro" posso fare o necessitare, dal punto di vista teorico?
Dottorato di ricerca

2
@DaveClarke Il fatto che Coq, con i suoi tipi fantasiosi, sia stato usato per fare cose fantasiose non implica che quelle cose fantasiose richiedano quei tipi fantasiosi. Ad esempio Twelf ha avuto grandi successi (come una prova di correttezza di SML), ed è solo di secondo ordine, non di ordine superiore. Ho visto alcuni sistemi piuttosto grandi provati solo con la logica del primo ordine.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


22

λList23+4(α)10α23+4

La regola chiave che distingue i tipi dipendenti da quelli non dipendenti è l'applicazione:

ΓM:ABΓN:AΓMN:BΓM:ΠxA.BΓN:AΓMN:B{N/x}

Sulla sinistra hai lo STLC, dove i programmi nei locali 'confluiscono' solo nel programma della conclusione. Al contrario, nella regola di applicazione dipendente a destra, il programma dalla premessa giusta "scorre" nel tipo nella conclusione .1N1

Per poter parametrizzare i tipi in base ai programmi, la sintassi dei tipi dipendenti deve essere più ricca e per garantire che i tipi siano ben formati utilizziamo un secondo "sistema di battitura" chiamato tipi che vincola i tipi. Questo sistema di classificazione è essenzialmente STLC, ma "a un livello superiore".

Ci sono molte spiegazioni di tipi dipendenti. Qualche esempio.


1 In termini di colori: con tipi non dipendenti, le espressioni nere nella conclusione sono costruite da espressioni nere nei locali mentre le espressioni rosse nella conclusione sono costruite da espressioni rosse nei locali. Con tipi dipendenti i colori possono essere mescolati facendo in modo che parti nere della conclusione siano costruite da parti rosse e nere della premessa.


Ora, quello ha molto senso. Potrebbe essere stato ovvio, ma per qualche motivo non ci sono riuscito. Apprezzo il passaggio dal commento alla risposta. Sfortunatamente, la domanda è stata votata per la chiusura, ma sono contento per la risposta :)
Dottorato di ricerca

1
Non vado matto per il tuo esempio, dato che la lunghezza dell'elenco è solo qualcosa che potresti cancellare in tipi e ottenere programmi che parlano di elenchi ordinari (non indicizzati). Potrebbe essere utile notare che ci sono tipi che non rimangono ben scritti dopo questo tipo di cancellazione, ad esempio un programma di tipo , dove e . Arr nArr 0=natArr (n+1)=natArr n
cody

@cody Non sono sicuro di cosa intendi. I tipi dipendenti hanno (o possono essere impostati per avere) la cancellazione del tipo nel seguente senso: per tutti i caratteri P: iff , dove è la relazione di riduzione del tempo di esecuzione . (Questa è una descrizione semplificata in cui la funzione cancella i programmi con l'annotazione di tipo su "gli stessi" programmi senza annotazione.) Forse vuoi dire qualcosa di diverso? PVerase(P)erase(V)
Martin Berger,

@MartinBerger: sì, in questo caso sto parlando di cancellare le dipendenze in tipi dipendenti per ottenere tipi semplici. L'unico esempio che posso indicare in questo momento è la prova che normalizza iff normalizza (ad esempio nel libro di Barendregt ). C o CFωCoC
cody

@cody Penso che sia insolito chiamare questo tipo di cancellazione. Qual è un nome migliore? Forse la semplificazione del tipo?
Martin Berger,

2

Pensa alle dichiarazioni di tipo come nient'altro che alle asserzioni. Attualmente, tutto ciò che puoi dire sono cose come isInt32 (), isCharPtr (), ecc. Queste varie asserzioni sono scelte per essere verificabili in fase di compilazione. Ma questo concetto può essere esteso a cose come: isCharPtr () && isNotNull (). Puntatori nullable sono un grosso problema. I puntatori non devono essere nullable come posizione predefinita, con i puntatori nullable essendo un tipo non dichiarabile senza sapere se è nullo o meno. Problemi simili sono cose come: isPositiveInteger () o isEvenNaturalNumber ().

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.