Sono abbastanza nuovo in Coq e sto cercando di sviluppare un framework basato sulla mia ricerca. Il mio lavoro è abbastanza definito e ho problemi a codificarlo a causa del modo in cui Coq sembra trattare gli insiemi.Formulazioni coerenti di insiemi in Coq?
ci sono Type
e Set
, che loro chiamano 'tipi', e li può usare per definire una nuova serie:
Variable X: Type.
E poi c'è una codifica libreria (sub) definisce come 'Ensembles', che sono funzioni da alcuni Type
a Prop
. In altre parole, essi sono predicati su un Type
:
Variable Y: Ensemble X.
Ensemble
s sentono più come corrette insiemi matematici. Inoltre, sono basati su molte altre librerie. Ho cercato di focalizzarmi su di loro: definire un set universale U: Set
, e quindi limitarmi a (sotto) Ensemble
s su U
. Ma no. Ensemble
s non possono essere utilizzati come tipi per altre variabili, né di definire nuovi sottoinsiemi:
Variable y: Y. (* Error *)
Variable Z: Ensemble Y. (* Error *)
Ora, so che ci sono diversi modi per aggirare questo. La domanda "Subset parameter" ne offre due. Entrambi usano la coercizione. Il primo si attacca a Set
s. Il secondo essenzialmente utilizza Ensemble
s (sebbene non per nome). Ma entrambi richiedono un certo macchinario per realizzare qualcosa di così semplice.
Domanda: Qual è il modo consigliato di gestire in modo coerente (ed elegante) i set?
Esempio: Ecco un esempio di quello che voglio fare: Assumiamo un insieme DD. Definire una coppia dm = (D, <) dove D è un sottoinsieme finito di DD e < è un ordine parziale rigoroso su D.
Sono sicuro che con abbastanza armeggiare con coercizioni o altre strutture, potrei realizzarlo; ma non in un modo particolarmente leggibile; e senza una buona intuizione su come manipolare ulteriormente la struttura. Ad esempio, i seguenti tipi di controlli:
Record OrderedSet {DD: Set} : Type := {
D : (Ensemble DD);
order : (relation {d | In _ D d});
is_finite : (Finite _ D);
is_strict_partial : (is_strict_partial_order order)
}.
Ma non sono così sicuro che sia quello che voglio; e certamente non sembra molto carino. Si noti che sto andando avanti e indietro tra Set
e Ensemble
in modo apparentemente arbitrario.
Ci sono un sacco di librerie là fuori che usano Ensemble
s, quindi ci deve essere un buon modo per trattarle, ma quelle librerie non sembrano essere documentate molto bene (o ... affatto).
Aggiornamento: Per complicare ulteriormente le cose, sembra che ci siano anche altre implementazioni, come MSets. Questo sembra essere completamente separato e incompatibile con Ensemble
. Utilizza anche bool
anziché Prop
per qualche motivo. C'è anche FSets, ma sembra essere una versione obsoleta di MSets.
Ciao Adam! Condivido la tua visione generale su 'Set' vs.' Ensemble'. Ma questo non mi dà un buon modo per (per esempio) usare un Ensemble come un tipo per una nuova variabile che si comporta come un sottoinsieme. Bene, non senza una coercizione. Forse non c'è modo di aggirare questo? – mhelvens
Intendi per la parte sottoinsieme nella tua * Domanda *? Bene, il tuo ordine è comunque parziale, quindi c'è qualcosa che ti impedisce di definire il tuo ordine sull'intero universo _DD_ invece? Penso che sarebbe un modo più consueto di farlo, a meno che non ci siano alcuni vincoli aggiuntivi che non hai menzionato? – akoprowski
Bene, tutte le parti della mia domanda, in realtà. L'esempio era proprio questo: un esempio. Mi piacerebbe un modo per passare in modo coerente tra (sotto) set e (sotto) tipi senza doverlo capire caso per caso. --- Ma riguardo a quell'ordine parziale: è un ordine parziale finito specificato manualmente (per andare con il set finito). Se lo digito come un ordine su DD, potrebbe ordinare elementi al di fuori del set * D *. Non sono sicuro che ciò significherebbe qualche prova in futuro ... ma non è particolarmente elegante. – mhelvens