Perché Coq ha Prop?


35

Coq ha un tipo Prop di proposizioni irrilevanti che vengono scartate durante l'estrazione. Quali sono i motivi per avere questo se usiamo Coq solo per prove. Prop è impredicativo, quindi Prop: Prop, tuttavia, Coq infetta automaticamente gli indici dell'universo e possiamo usare il Tipo (i) invece ovunque. Sembra che Prop complica molto tutto.

Ho letto che ci sono ragioni filosofiche per separare Set e Prop nel libro di Luo, tuttavia non li ho trovati nel libro. Quali sono?


6
"Se usiamo Coq solo per prove": penso che tu abbia identificato un punto chiave qui. Coq non viene utilizzato solo per le prove.
Gilles 'SO-smetti di essere malvagio' il

Risposte:


34

è molto utile per l'estrazione del programma perché ci consente di eliminare parti di codice inutili. Ad esempio, per estrarre un algoritmo di ordinamento proveremmo l'affermazione "per ogni elenco esiste un elenco k tale che k è ordinato e k è un permutatiom di ". Se lo scriviamo in Coq ed estraiamo senza usarePropkkk , otterremo:Prop

  1. "per tutti c'è k " ci darà una mappa che porta gli elenchi in elenchi,ksort
  2. "tale che sia ordinato" fornirà una funzione che attraversa k e verifica che sia ordinato, ekverifyk
  3. " è una permutazione di " darà una permutazione che prende da a k . Si noti che non è solo una mappatura, ma anche la mappatura inversa insieme ai programmi che verificano che le due mappe siano realmente inverse.kpikpi

Mentre le cose extra non sono del tutto inutili, in molte applicazioni vogliamo liberarcene e mantenerci giuste sort. Questo può essere realizzato se usiamo per indicare " k è ordinato" e " k è una permutazione di ", ma non "per tuttiPropkk c'è k ".k

In generale, un modo comune per estrarre il codice è quello di considerare un'istruzione del modulo dove x è input, y è output e ϕ ( x , y ) spiega cosa significa che y è un output corretto. (Nell'esempio precedente A e B sono i tipi di elenchi e ϕ ( , k ) è " k è ordinato e k è una permutazione di .") Se ϕ è in P r o p, l' estrazione fornisce una mappa f :x:A.y:B.ϕ(x,y)xyϕ(x,y)yABϕ(,k)kkϕProp tale chef:AB vale per ogni x A . Se ϕ è in S e t, otteniamo anche una funzione g tale che g ( x ) è la prova che ϕ ( x , f ( x ) ) vale, per tuttiϕ(x,f(x))xAϕSetgg(x)ϕ(x,f(x))xA. Spesso la prova è inutilmente computazionale e preferiamo liberarcene, specialmente quando è annidata profondamente in qualche altra affermazione. ci dà la possibilità di farlo.Prop

Aggiunto 2015/07/29: V'è un problema se potremmo evitare complessivamente ottimizzando automaticamente via "codice estratto inutile". In una certa misura possiamo farlo, ad esempio tutto il codice estratto dal frammento negativo della logica (materiale creato dal tipo vuoto, tipo di unità, prodotti) è inutile in quanto si sposta semplicemente attorno all'unità. Ma ci sono autentiche decisioni di progettazione che bisogna prendere quando si usa P r o p . Ecco un esempio semplice, in cui Σ significa che siamo in T y p e e significa che siamo in P r o pPropPropΣTypeProp . Se estraiamo da otterremo un programma che decompone n nel suo bit più basso b e i rimanenti bit k , ovvero calcola tutto. Se estraiamo da Π n : N Σ b : { 0 , 1 }k : N

Πn:NΣb:{0,1}Σk:Nn=2k+b
nbk il programma calcolerà solo il bit più basso b . La macchina non può dire quale sia quella corretta, l'utente deve dirgli quello che vuole.
Πn:NΣb:{0,1}k:Nn=2k+b
b

1
Sono leggermente confuso. Stai dicendo che senza sarebbe impossibile riconoscere nel programma estratto che g ( x ) non contribuisce all'output (cioè che si limita a verificarlo)? Ci sono scenari in cui non si sarebbe in grado di estrarre tale codice inutile attraverso i soliti mezzi disponibili per gli ottimizzatori di codice? Propg(x)
utente

1
Dal programma estratto si potrebbe dire "Voglio " e tornare indietro da lì. Non sono stato in grado di escogitare uno scenario così intricato che non potremmo ottimizzare nulla che non contribuisca direttamente a determinare la permutazione senza che sia effettivamente necessario per calcolare detta permutazione (dal punto di vista dell'ottimizzazione globale, comunque ). k
utente

1
Non hai l'informazione "Voglio ". Questo è un presupposto extra, e ovviamente una volta che ti dicono quale risultato particolare vogliono, puoi semplicemente ottimizzare il codice morto. In realtà, ho pensato a una risposta migliore: è una domanda di design che le cose da mettere in P r o p . Devi sapere cosa vuole l'utente e ti dice cosa vuole usando P r o p . È facile trovare esempi in cui esistono diverse opzioni. Ne aggiungerò uno alla mia risposta. kPropProp
Andrej Bauer,

2
Per quanto ne so nessuno può davvero dire come estrarre qualsiasi cosa da tipi. È chiaro che contengono alcuni contenuti computazionali, ma non quello che potrebbe essere. (1)
Andrej Bauer,

3
Ah ok. Usare come un modo per specificare le decisioni di progettazione ha molto più senso per me che come un modo di eliminare il codice inutile. Prop
utente

19

èimpredicativo, che crea un sistema di prove molto espressivo. Tuttavia è "troppo" espressivo nel senso seguente:Prop

impredicative Prop+large elimination+excluded middle

è incoerente. Di solito si desidera mantenere la possibilità di aggiungere il centro escluso, quindi una soluzione è mantenere l'eliminazione di grandi dimensioni e rendere predicativo Prop. L'altro è sopprimere l'eliminazione di grandi dimensioni.

Coq ha fatto entrambe le cose! Hanno rinominato il predicativo Prop in Set e disabilitato l'eliminazione di grandi dimensioni in Prop.

L'espressività acquisita dall'impedicatività è "rassicurante", nel senso che il 99% della matematica "ragionevole" può essere formalizzata con essa, ed è noto che è coerente rispetto alla teoria degli insiemi. Questo rende probabile che non lo indeboliranno in qualcosa come Agda, che ha solo universi predicativi.


8
Oh, e ho dimenticato di dire: è non è il caso che Prop : Prop, che sarebbe incoerente. Piuttosto le quantificazioni su tutte le proposizioni sono di nuovo una proposizione.
cody

Potresti indicarmi altre risorse su questo? Tutto quello che riesco a trovare sembra molto sparso.
user833970

1
@ user833970 delle cose specifiche che vorresti puntatori? Temo che non ci sia davvero un riferimento onnicomprensivo per la meta-teoria dei tipi dipendenti. Questa discussione (che indica qui!) Potrebbe essere utile: github.com/FStarLang/FStar/issues/360
cody

grazie, sto lavorando al documento sul paradosso di Berardi ora, penso che chiarirà la mia confusione.
user833970

14

Anche se non sei interessato ad estrarre programmi, il fatto che Propsia impredicativo ti consente di costruire alcuni modelli che non puoi costruire usando una torre predicativa di universi. IIRC Thorsten Altenkirch ha un modello di Sistema F che utilizza l'impredicatività di Coq.

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.