Ho scritto un algoritmo per trovare una soluzione al problema della somma dei sottoinsiemi in Haskell. La firma èControllo del modo in cui i dati del test vengono generati in QuickCheck
subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]
QuickCheck sembra essere una buona misura per testare questo. Per esempio ho qui è una delle proprietà che ho potuto verificare:
prop_sumEqualsS l s = case subsetSum l s of
Just solution -> (sum solution) == s
Nothing -> True
Il problema è che l'algoritmo è abbastanza computazionalmente intensive e l'esecuzione di 100 test con grandi liste di input prende le età per l'esecuzione.
Ho provato con QuickCheck 1 ed è stato eseguito rapidamente, ma i set di dati utilizzati per il test erano molto piccoli. Dopo essersi trasferito su QuickCheck 2 sembra essere il problema opposto. C'è il a manual per il controllo qualità ma sembra essere vecchio (non ci sono informazioni sulla data) e non so quanto ancora si applichi a QC2. A Tutorial è disponibile su Haskell Wiki ma non ci sono molti dettagli, solo poche parole sulla creazione di istanze Arbitrary
.
Così ho due domande:
- Cosa cambia in QuickCheck 2 farlo diventare così molto più lento di QuickCheck?
- Qual è il modo migliore per controllare la creazione di insiemi di dati per renderli utili per un determinato test?
Edit: Per essere più precisi, vorrei provare la mia soluzione con una dimensione lista da 0 a 100, contenente interi tra -10000 e 10000.
vostre domande sembra un po 'vaga per il contesto di QuickCheck; forse sarebbe meglio chiedere una domanda di test generale. Ci sono alcuni problemi con il tuo approccio attuale però: non sarà controllare che la soluzione è in realtà un sottoinsieme, o che se la funzione restituisce Nulla allora non c'è di fatto nessuna soluzione. – gatoatigrado
@gatoatigrado La proprietà era solo un esempio. Credo che controllare che la soluzione sia un sottoinsieme appartiene a un'altra proprietà. Ho sbagliato? Non vedo un modo semplice per verificare che quando non viene restituito nulla, non c'è in effetti alcuna soluzione, tranne risolvendo il problema con un altro algoritmo. Questo sembra un po 'ridondante. – Antoine
http://stackoverflow.com/questions/10712373/cookbook-for-converting-from-quickcheck1-to-quickcheck2 – gliptak