Quantificazione universale / esistenziale?


11

Sto lottando per capire lo scopo della quantificazione universale ed esistenziale dei tipi. Sto giocando con la scrittura di un linguaggio giocattolo basato sul calcolo delle costruzioni . Ho letto di Morte e Henk per aiutarmi a capire meglio.

Non capisco perché il CoC abbia sia l'astrazione lambda che forall.

(λx:A.B)
(x:A.B)

Mi sembra che lambda si dedichi forall in un sistema in cui i tipi vengono passati manualmente. In altre parole, ciò che segue

(x:.λa:x.a)

Potrebbe essere sostituito con

(λx:.λa:x.a)

Se è stato applicato per la prima volta al tipo utilizzato.

Cosa mi sto perdendo? Quali articoli, blog o articoli ci sono da leggere che potrebbero aiutarmi?

Grazie.

Risposte:


12

Aiuta a ricordare che (o come a volte vedi) è un tipo. Si sta generalizzando . Quindi, mentre ha perfettamente senso dire , non ha senso dire perché è solo un tipo. Non diresti perché non è per il calcolo di per sé, è lì per classificare i termini lambda che possono essere applicati in questo modo .Π(λx:A.M) N(x:A.M) N...(AB) N

Questo è stato qualcosa che mi ha inciampato, ma è così che viene definito il calcolo delle costruzioni (così come qualsiasi altro sistema tipicamente dipendente).

I due programmi che hai scritto hanno intenzioni molto diverse e il primo è mal scritto. Non ha senso dire perché richiede entrambi i suoi argomenti per tipo, il che significa che se deve essere ben scritto, dobbiamo avere . Tuttavia, non è un tipo, può sempre e solo essere assegnato un tipo del modulo , mai . Il secondo invece è quasi (penso che tu intendessi restituire non ) è una funzione e viene dato un tipo usando due s.x:A. λx. xx:A.BB:λx.xx:A.Bax


Sì, intendevo restituire . a
oconnor0,

@ oconnor0 Ha senso :)
Daniel Gratzer,

Non esattamente. Sono ancora un po 'confuso. Potrei doverci pensare di più. Ho cambiato entrambi i programmi di esempio per restituire anziché poiché stavo cercando di implementare . :)axid
oconnor0,

Penso che, ad un certo livello, volessi rendere termini e tipi la stessa cosa. Tra la tua risposta e cs.stackexchange.com/questions/49531/… Penso di vedere dove sono andato storto. Voglio farlo in un sistema fortemente normalizzante.
ottobre

5

Tieni presente che i tipi esistenziali e universali sono piuttosto diversi. È la logica costruttiva, non la logica classica e nella logica costruttiva and non sono correlate come nella logica classica.

x:A.B(x) è il tipo di programmi che ricevono un oggetto di tipo e restituiscono un oggetto di tipo . La cosa importante qui è che il tipo dipende da e non è lo stesso per tutti . Può variare a seconda di cosa sia . Per un input potremmo generare un numero intero. Per un altro potremmo produrre un numero reale. Per ancora un altro potremmo generare una funzione su numeri reali. Se non varia con , è possibile utilizzare in luogo che è il tipo di funzioni da a .AB(x)B(x) xxxxB(x)xABAB

x:A.B(x) è la versione dipendente della disgiunzione (costruttiva). Si può pensare di costruttivo disgiunzione di due tipi e come l'unione disgiunta di e . è l'unione disgiunta di un insieme di tipi indicizzati da . Il fatto che il furgone di tipo vari a seconda del valore di rende un tipo dipendente. Confronta con il caso in cui non dipende da : . Ne stiamo prendendo una copiaABABABx:A.B(x)B(x)x:AB(x)x:ABx:Ax:A.BB per ogni . Questo è isomorfo a .x:AA×B

Ora puoi chiederti perché abbiamo bisogno di prodotti dipendenti e tipi di somma? Perché ci danno più potere espressivo. Ora possiamo ignorare completamente i tipi e avere una teoria dei tipi non tipizzata / programmazione funzionale. Ma ciò elimina in primo luogo i vantaggi di avere tipi, ad esempio non saprai se tutti i programmi verranno sempre chiusi (forte normalizzazione). Vedi Cubo Lambda e Tipo dipendente . Penso che un buon modo per comprendere bene i tipi dipendenti sia quello di esaminare le regole per introdurre ed eliminare i tipi dipendenti nella teoria dei tipi di Martin-Lof .

Il punto principale dei tipi dipendenti è: vogliamo rimanere all'interno di una buona teoria tipizzata per vari motivi (ad es. Evitare bug, prove automatiche di risoluzione, ecc.). Non vogliamo andare a qualcosa di simile al calcolo lambda non tipizzato dove possiamo esprimere come quelli che hai dichiarato e cose molto più potenti. Possiamo dire che i tipi dipendenti sono stati inventati per consentire di esprimere più cose pur rimanendo all'interno di una bella teoria dei tipi.


1
Cosa significa "∃x: AB (x) ∃x: AB (x) è la versione dipendente della disgiunzione (costruttiva)". significare?
ottobre
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.