Perché Agda e Coq non sono d'accordo sulla rigidità positiva?


24

Mi sono imbattuto in un disaccordo confuso tra Agda e Coq che non è ovviamente correlato alle distinzioni più note tra le loro teorie del tipo (ad esempio, la (im) predicatività, l'induzione-ricorsione, ecc.).

In particolare, Agda accetta la seguente definizione:

  data Ty : Set0 -> Set0 where
    c1 : Ty ℕ
    c2 : Ty (Ty ℕ)

mentre la definizione equivalente di Coq viene respinta perché la comparsa di [Ty _] come indice di se stesso in c2 è considerata una violazione della positività rigorosa.

  Inductive Ty : Set -> Set :=
    | c1 : Ty nat
    | c2 : Ty (Ty nat).

In realtà, questo caso è quasi letteralmente un esempio tratto dalla Sezione 14.1.2.1 di Coq'Art di violazione della positività rigorosa:

  Inductive T : Set -> Set := c : (T (T nat)).

Ma non vedo i motivi di questa differenza tra le teorie dei tipi. Il classico esempio di dimostrazione di False utilizzando una ricorrenza negativa di un tipo in un argomento del costruttore mi è chiaro, ma non riesco a capire come si possa derivare una contraddizione da questo stile di indicizzazione (indipendentemente da argomenti del costruttore altrimenti strettamente positivi).

Sfogliando la letteratura, il primo documento delle famiglie induttive di Dybjer fa un commento disinvolto sulla soluzione di Paulin-Mohring nel documento CID che ha restrizioni leggermente diverse, e suggerisce vagamente che le differenze potrebbero essere correlate all'impredicatività, ma non si sviluppa ulteriormente. Il documento di Dybjer sembra consentire questo, mentre Paulin-Mohring lo proibisce chiaramente.

Apparentemente non sono il primo a notare questa differenza di opinioni e alcuni credono che questa definizione non dovrebbe essere consentita in nessuno dei due sistemi ( https://lists.chalmers.se/pipermail/agda/2012/004249.html ), ma Non ho trovato alcuna spiegazione del perché sia ​​il suono in un sistema ma non nell'altro, o solo una differenza di opinione.

Quindi suppongo di avere diverse domande:

  1. È un esempio di un tipo monotono, ma non strettamente positivo? (In Coq; chiaramente Agda lo considera strettamente positivo)
  2. Perché Agda lo consente mentre Coq lo rifiuta? È semplicemente una differenza idiosincratica nell'interpretazione di "rigorosamente positivo", c'è una sottile differenza tra Coq e Agda che la fa suonare in Agda e non fondata in Coq, o è una questione di gusti guidata da particolari preferenze teoriche?
  3. Esiste una differenza significativa tra la prima definizione di cui sopra e l'equivalente definizione induttiva-ricorsiva di seguito?

Definizione induttiva-ricorsiva:

  mutual
    data U : Set0 -> Set0 where
      c : (i : Fin 2) -> U (T i)
    T : Fin 2 -> Set0
    T zero = ℕ
    T (suc zero) = U ℕ

Sono felice di avere indicazioni sulla letteratura pertinente.

Grazie in anticipo.


1
Per quanto ne so, Coq è più rigoroso di quello che la teoria sottostante consente, perché era più facile da implementare e abbastanza utile nella pratica. Questa risposta su un caso diverso ma correlato è per quanto riguarda la mia comprensione.
Gilles 'SO- smetti di essere malvagio' il

1
Questa definizione non è accettata dall'attuale versione di sviluppo di Agda:Ty is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.
gallais,

2
Sì, hai ragione, qualcun altro me lo ha fatto notare ieri sera. Stavo usando il pacchetto 2.3.0.1 di Debian, ma 2.3.2.1 di Cabal respinge sia le definizioni dirette che quelle IR. Sembra che un bug apparentemente non correlato abbia reso il controllo della positività sugli indici più rigoroso: code.google.com/p/agda/issues/detail?id=690 Dato che è stato discusso nell'elenco senza essere esplicitamente contrassegnato come un problema di solidità, sono ancora chiedendosi se il tipo stesso è suono.
Colin Gordon,

Risposte:


10

Il problema sembra essere la confusione derivante da una confluenza di due fattori:

  1. Stavo usando una versione non aggiornata di Agda (2.3.0.1). Sembra che prima della 2.3.2, Agda semplicemente non stesse controllando la rigida positività degli indici dei risultati del costruttore (vedi il bug che ho collegato altrove nel thread).
  2. Una lettura più ravvicinata del documento sulle famiglie induttive di Dybjer suggerisce che potrebbe aver inteso che il tipo induttivo che si sta definendo non fosse vincolato quando si digitano gli indici di un risultato del costruttore . La sezione 3.2.1 fornisce lo schema per i costruttori induttivi in ​​prosa, e apparentemente ho letto male il linguaggio che descrive gli ambienti vincolanti di ogni parte dello schema.

Questa lettura più ravvicinata è ovviamente coerente con il controllo eseguito da Coq e (versioni recenti di) Agda, che proibisce qualsiasi comparsa di T nei propri indici.


4

Una possibile ragione della differenza, come suggeriscono le tue osservazioni, è l'impredicabilità. Coq storicamente aveva un set impredicativo (credo ancora disponibile come bandiera!)

Citando il libro di Adam Chlipala http://adam.chlipala.net/cpdt/html/Universes.html

Gli strumenti Coq supportano un flag da riga di comando -impredicative-set, che modifica Gallina in un modo più fondamentale rendendo Set impredicativo. Un termine come forall T: Set, T ha tipo Set e le definizioni induttive in Set possono avere costruttori che quantificano su argomenti di qualsiasi tipo. Per mantenere la coerenza, è necessario imporre una restrizione di eliminazione, analogamente alla restrizione per Prop. La restrizione si applica solo ai grandi tipi induttivi, dove alcuni costruttori quantifica su un tipo di tipo Tipo. In tali casi, un valore in questo tipo induttivo può essere adattato al modello solo per produrre un tipo di risultato il cui tipo è Set o Prop. Questa regola contrasta con la regola per Prop, dove la restrizione si applica anche a tipi induttivi non di grandi dimensioni, e dove il tipo di risultato può avere solo tipo Prop. Nelle vecchie versioni di Coq, Set era impredicativo per impostazione predefinita. Le versioni successive rendono Set predittivo per evitare incoerenze con alcuni assiomi classici. In particolare, bisogna fare attenzione quando si utilizza il set impredicativo con assiomi di scelta. In combinazione con estensioni medie o predicate escluse, può derivarne un'incoerenza. Il Set di Impredicative può essere utile per modellare concetti matematici intrinsecamente impredicativi, ma quasi tutti gli sviluppi di Coq vanno bene senza di essa.


Dal suono della correzione di bug che ho trovato sopra, sembra che Agda semplicemente non stesse controllando la positività degli indici per i risultati del costruttore. Il che in realtà non indica se il mio tipo proposto in monotono, ma suggerisce che non è legato all'impredicatività.
Colin Gordon,

2
E sì, -impredicative-set rende Set impredicativo in Coq.
Colin Gordon,
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.