Tecniche di prova per dimostrare che il controllo del tipo dipendente è decidibile


10

Sono in una situazione in cui devo dimostrare che il controllo del tipo è decidibile per un calcolo tipicamente dipendente sul quale sto lavorando. Finora sono stato in grado di dimostrare che il sistema si sta fortemente normalizzando, e quindi che l'uguaglianza di definizione è decidibile.

In molti riferimenti che ho letto, la decidibilità del controllo tipografico è elencata come un corollario di forte normalizzazione, e ci credo in quei casi, ma mi chiedo come si possa effettivamente mostrare questo.

In particolare, sono bloccato su quanto segue:

  • Solo perché termini ben digitati si stanno fortemente normalizzando, ciò non significa che l'algoritmo non eseguirà il loop per sempre su input non ben digitati
  • Dal momento che le relazioni logiche vengono generalmente utilizzate per mostrare una forte normalizzazione, non c'è una metrica decrescente conveniente mentre progrediamo nei termini di controllo dei caratteri. Quindi, anche se le mie regole di tipo sono dirette dalla sintassi, non vi è alcuna garanzia che l'applicazione delle regole finirà per terminare.

Mi chiedo, qualcuno ha un buon riferimento a una prova della decidibilità del controllo dei caratteri per un linguaggio tipicamente dipendente? Se è un piccolo calcolo di base, va bene. Tutto ciò che discute delle tecniche di prova per mostrare la decidibilità sarebbe fantastico.


7
I soliti algoritmi di controllo del tipo bidirezionale non tentano mai di normalizzare un termine (o un tipo) senza prima verificare che sia ben digitato (o ben formato). Non devi preoccuparti di normalizzare i termini non tipizzati.
Andrej Bauer,

7
Per quanto riguarda l'applicazione delle regole: tutte le regole di tipo e termine riducono l'obiettivo, tranne la conversione di tipo. Pertanto, dobbiamo controllare la conversione dei tipi, cosa che facciamo utilizzando un approccio bidirezionale.
Andrej Bauer,

Risposte:


9

C'è davvero una sottigliezza qui, anche se le cose funzionano bene nel caso del controllo del tipo. Scriverò qui il problema, poiché sembra emergere in molti thread correlati, e cercherò di spiegare perché le cose vanno bene quando si verifica il tipo in una teoria del tipo dipendente "standard" (sarò deliberatamente vago, poiché questi problemi tendono a insorgere indipendentemente):

DΓt:ADΓA:ssutBΔDΔu:B

Questo bel fatto è in qualche modo difficile da dimostrare, e compensato da un contro-fatto piuttosto brutto:

Fatto 2: In generale, e non sono derivazioni secondarie di !DD D

Ciò dipende in parte dalla formulazione precisa del sistema di tipi, ma la maggior parte dei sistemi "operativi" implementati nella pratica soddisfano il Fatto 2.

Ciò significa che non è possibile "passare a sotto-termini" quando si ragiona per induzione su derivazioni, o concludere che l'affermazione induttiva è vera sul tipo di termine di cui si sta provando a dimostrare qualcosa.

Questo fatto ti morde piuttosto duramente quando cerchi di dimostrare dichiarazioni apparentemente innocenti, ad esempio che i sistemi con conversione tipizzata sono equivalenti a quelli con conversione non tipizzata.

Tuttavia , nel caso dell'inferenza di tipo, è possibile fornire un algoritmo di inferenza di tipo e ordinamento simultaneo (il tipo di tipo) mediante induzione sulla struttura del termine, che può comportare un algoritmo orientato al tipo come suggerisce Andrej. Per un dato termine (e contesto , o fallisci o trovi tale che e . Non è necessario utilizzare l'ipotesi induttiva per trovare quest'ultimo derivazione, e quindi in particolare si evita il problema spiegato sopra.tΓA,sΓt:AΓA:s

Il caso cruciale (e l'unico caso che richiede davvero la conversione) è l'applicazione:

infer(t u):
   type_t, sort_t <- infer(t)
   type_t' <- normalize(type_t)
   type_u, sort_u <- infer(u)
   type_u' <- normalize(type_u)
   if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
      return B, sort_t (or the appropriate sort)
   else fail

Ogni chiamata alla normalizzazione è stata fatta a parole ben scritte, poiché questo è l'invariante inferdel successo.


A proposito, mentre è implementato, Coq non ha un controllo del tipo decidibile, poiché normalizza il corpo delle fixistruzioni prima di provare a controllarle.

Ad ogni modo, i limiti delle forme normali di termini ben scritti sono così astronomici, che il teorema di decidibilità è comunque prevalentemente accademico a questo punto. In pratica, esegui l'algoritmo di controllo del tipo per tutto il tempo in cui hai pazienza e provi un percorso diverso se non è ancora finito.


Ho trovato la tua risposta molto utile, grazie. Ho due domande: 1. Che cosa significa "sistemi operativi"? Qual è l'alternativa? 2. Puoi essere più esplicito con l'esempio: cosa significa (quale fatto stiamo cercando di dimostrare?) "I sistemi con conversione tipizzata sono equivalenti a quelli con conversione non tipizzata"? Grazie!
Łukasz Lew,

1
@ ŁukaszLew L'alternativa a un sistema operativo (uno implementato nella pratica, ad esempio il software Coq o Agda) sarebbe un sistema teorico, che è utile per dimostrare le proprietà meta-teoriche, ma è inefficiente o scomodo da usare nella pratica. Provare l'equivalenza di un sistema operativo e teorico è spesso una parte importante della progettazione di un sistema. Ne parlo di più qui: cstheory.stackexchange.com/a/41457/3984
cody

Penso che valga la pena menzionare il più semplice, più facile di Lennart Augustsson ! . Questa è un'implementazione minima di Haskell del controllo del tipo e alcune deduzioni per il calcolo lambda tipicamente dipendente. C'è un codice che corrisponde da vicino al codice infer(t u):; per trovarlo, cerca " tCheck r (App f a) =". Per un'implementazione più completa ma ancora semplice puoi controllare MortetypeWith .
Łukasz Lew,

1
@ ŁukaszLew Il problema di conversione tipizzato vs non tipizzato è una domanda aperta ben nota che riguarda 2 formulazioni di teorie dei tipi ed è stata risolta piuttosto di recente: pauillac.inria.fr/~herbelin/articles/…
cody

Cosa significa ? ut
Jonaprieto,
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.