Qual è lo scopo previsto per il tipo So
? Traslitterazione in Agda:Quindi: qual è il punto?
data So : Bool → Set where
oh : So true
So
solleva una proposta booleano fino ad un uno logico. Il documento introduttivo di Oury e Swierstra The Power of Pi fornisce un esempio di un'algebra relazionale indicizzata dalle colonne delle tabelle. Prendendo il prodotto di due tabelle richiede che essi hanno diverse colonne, per i quali usano So
:
Schema = List (String × U) -- U is the universe of SQL types
-- false iff the schemas share any column names
disjoint : Schema -> Schema -> Bool
disjoint = ...
data RA : Schema → Set where
-- ...
Product : ∀ {s s'} → {So (disjoint s s')} → RA s → RA s' → RA (append s s')
io sono abituato a costruire i termini prova per le cose che voglio dimostrare le mie programmi. Sembra più naturale per la costruzione di una relazione logica su Schema
s per garantire la sconnessione:
Disjoint : Rel Schema _
Disjoint s s' = All (λ x -> x ∉ cols s) (cols s')
where cols = map proj₁
So
sembra avere gravi svantaggi rispetto ad una "corretta" a prova di termine: pattern matching on oh
non ti dà alcuna informazione con cui è possibile effettuare un altro controllo di tipo termine (Does?) - che significherebbe valori So
non possono partecipare utilmente in prova interattiva. Confrontalo con l'utilità computazionale di Disjoint
, che è rappresentata come un elenco di prove che ogni colonna in s'
non viene visualizzata in s
.
io in realtà non credono che la specifica So (disjoint s s')
è più semplice da scrivere rispetto Disjoint s s'
- è necessario definire la funzione booleana disjoint
senza l'aiuto del tipo-checker - e in ogni caso Disjoint
paga per sé quando si desidera manipolare le prove in esso contenute.
Sono anche scettico sul fatto che So
consente di risparmiare quando si sta costruendo un Product
. Per dare un valore di So (disjoint s s')
, è ancora necessario eseguire una corrispondenza di modelli sufficiente su s
e s'
per soddisfare il correttore di tipi in cui sono effettivamente disgiunti. Sembra uno spreco per scartare le prove così generate.
So
sembra ingombrante sia per gli autori che per gli utenti del codice in cui è distribuito. 'Quindi', in quali circostanze vorrei utilizzare So
?
Inoltre, ogni prova di "Così b" è proposizionalmente uguale a qualsiasi altro, che non è necessariamente il caso dell'effettiva "evidenza" di qualunque proprietà b codifica. A volte lo vuoi. – Saizan
@Saizan, buon punto. Questa proprietà è anche sfruttata al secondo link nella mia risposta. Hai in mente un buon caso d'uso? – user3237465
Mi sembra che ci sia qualcosa di più profondo qui sulla relazione tra tipi definiti induttivamente con 'data' e quelli definiti ricorsivamente nelle funzioni. Potresti approfondire il motivo per cui Agda è felice di dedurre un valore "So" con la tua definizione ma non con il mio? –