Differenza tra tipo dipendente, tipo di raffinamento e logica Hoare


18

Conosco poca teoria dei tipi dipendenti. Da Wikipedia:

Un tipo dipendente è un tipo la cui definizione dipende da un valore.

E dal mio corso di teoria dei tipi ricordo che un tipo dipendente è:

Famiglia di tipi indicizzata da un tipo.

Ma ho una confusione per quanto riguarda i tipi dipendenti, i tipi di raffinamento e la logica rauca.

Perché dal tipo Depenedent vs refinement i tipi di raffinamento sembrano una logica Hoare. Cosa offre più tipi di raffinamento del potere oltre a consentire solo di affermare il predicato che deve essere soddisfatto (che sembra quasi uguale a Hoare Logic)?

Quale ulteriore cosa dà quel tipo dipendente rispetto ai tipi di raffinamento? Ed è il tipo Dipendente più potente dei tipi di perfezionamento + Risolutore Sat / Vincolo.

qualcuno può liberare l'aria con esempi.

Risposte:


18

C'è un recente lavoro di Paul-André Melliès e Noam Zeilberger che esplora questo aspetto . In particolare gli articoli Functor sono sistemi di raffinamento del tipo e un teorema della dualità Isbell per i sistemi di affinamento del tipo . C'è anche un video di un discorso sul primo.

Penso che ci sia molta confusione riguardo ai tipi di raffinamento dovuti al fatto che le persone pensino a sistemi particolari come rappresentativi, il che fa sì che gli obiettivi e i dettagli di quei sistemi particolari vengano attribuiti all'idea generale. In breve, i sistemi di affinamento del tipo classificano i termini che esistono in modo indipendente mentre i tipi (non affinamento), dipendenti o meno, fanno parte dei termini. Questo può sembrare familiare e forse anche un po 'contraddittorio.

La parte apparentemente potenzialmente familiare e forse contraddittoria si manifesta se vedi i tipi alla Curry (estrinsecamente) rispetto ai tipi alla Chiesa (intrinsecamente). Quando pensiamo ai tipi à la Curry, pensiamo ai tipi come a classificare termini non tipizzati che hanno già un significato. Nei tipi alla Chiesa, gli unici termini che esistono sono termini ben tipizzati, ovvero i vincoli di tipo fanno parte della nostra sintassi. Quindi quello che sto dicendo è che un sistema di tipo in stile Curry è in realtà un sistema di raffinamento del tipo che affina termini non tipizzati, mentre un sistema di tipo in stile Chiesa non è un sistema di affinamento del tipo. Ciò significa che, ad esempio, possiamo pensare al calcolo lambda semplicemente digitato come un sistema di raffinamento del tipo o come un sistema di tipo non di raffinamento.

Naturalmente, nessuno dice che i nostri termini debbano essere termini non tipizzati. Potremmo anche applicare un sistema di affinamento dei tipi a termini digitati e, storicamente, questo è il contesto in cui sono sorti i tipi di affinamento (con quel nome). Tuttavia, le applicazioni di digitazione soft illustrano qualcosa di più vicino alla situazione sopra descritta.

Finora non ho detto nulla sui tipi dipendenti. Il motivo è che si tratta di una preoccupazione completamente ortogonale. Direi che i sistemi di tipo dipendenti archetipici sono di solito presentati in stile Church, e quindi non sono sistemi di affinamento dei tipi, ma NuPRL (basato sulla teoria computazionale del tipo , una variante della teoria dei tipi più archetipica dipendente, teoria dei tipi di Martin-Löf) è palesemente un sistema di raffinamento di tipo come ho descritto. I termini in NuPRL potrebbero non avere nemmeno tipi! Certo, anche il fatto che "PRL" sta per "Logica di perfezionamento del programma" potrebbe essere un suggerimento. D'altro canto, Tipi di perfezionamento per ML descrive un sistema di tipi di perfezionamento, possibilmente l'origine del termine, che non è in alcun modo un sistema di tipo dipendente.

Per quanto riguarda le triple Hoare, sono un sistema di raffinamento del tipo. In realtà sono usati come esempio di un sistema di raffinamento del tipo nel primo documento. Tuttavia, Hoare Type Theory fornisce qualcosa che può essere visto come un sistema di tipo non-refinement per una lingua con triple Hoare.

Per avere una risposta sulla "potenza" di sistemi diversi, è necessario specificare un sistema (i) di tipo specifico (famiglia di) dipendente e un sistema (i) di tipo (i) di raffinamento particolare (famiglia). Il termine "sistema di tipo dipendente" copre una classe molto ampia di sistemi di tipo e "sistemi di affinamento del tipo" è ancora più ampio. Anche allora, i termini non si escludono a vicenda, quindi non sarebbe un confronto tra "sistemi di tipo dipendenti" e "sistemi di tipo di raffinamento". Tuttavia, se per "sistema di tipo dipendente" stai pensando a qualcosa come Coq , e per "sistema di tipo di perfezionamento" qualcosa come tipi di liquidoallora è piuttosto unilaterale. Coq è generalmente considerato abbastanza potente da gestire praticamente tutta la matematica in pratica; potresti letteralmente implementare e dimostrare un risolutore SMT corretto all'interno di Coq e quindi utilizzarlo; e può essere formulato un analogo molto vicino al tipo di sottoinsieme. (NuPRL ha letteralmente tipi di sottogruppi.) Dall'altro lato, i solutori di SMT sono generalmente limitati a teorie decidibili in cui Coq non ha tale limitazione; e molti sistemi come i tipi di liquidi hanno un linguaggio limitato e non estensibile per specificare i predicati. (Naturalmente, per "sistema di tipo dipendente" si potrebbe intendere ML dipendente , e per "sistema di perfezionamento del tipo" NuPRL [che è anche un sistema di tipo dipendente] che sarebbe unilaterale nell'altro modo.)


1
Grazie mille, davvero aiutato. Sì, leggevo i Tipi dipendenti nella programmazione pratica (popl '99) e si confondeva. Saluti.
Pushpa

1
Questa è una risposta FANTASTICA. grazie per averlo scritto.
Jonathan Sterling,
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.