Haskellの部分和問題の解を見つけるためのアルゴリズムを書きました。署名は
subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]
QuickCheckはそれをテストするのに適しているようです。たとえば、私はここで私がチェックできるプロパティの1つです:
prop_sumEqualsS l s = case subsetSum l s of
Just solution -> (sum solution) == s
Nothing -> True
問題は、アルゴリズムが非常に計算集約的であり、大きな入力リストを使用して100個のテストを実行すると、実行に時間がかかることです。
QuickCheck 1を試してみたところ、すぐに実行されましたが、テストに使用されたデータセットは非常に小さかったです。QuickCheck 2に移行した後は、逆の問題のようです。QCのマニュアルはありますが、古くなっているようで(日付情報がありません)、QC2にどれだけ当てはまるのかわかりません。チュートリアルはHaskellWikiで入手できますが、詳細はあまりなく、インスタンス化に関するいくつかの単語がありますArbitrary
。
だから私は2つの質問があります:
- QuickCheck 2のどのような変更により、QuickCheckよりも大幅に遅くなりますか?
- データセットの作成を制御して、特定のテストに役立つようにするための最良の方法は何ですか?
編集:より具体的には、-10000から10000までの整数を含む、0から100までのリストサイズでソリューションをテストしたいと思います。