大久保弘崇
ex2.2
最終更新:
hirotakaohkubo
-
view
2.5
意図している「テストデータのねじれ」が何なのか想像できない。
それさえ判れば書けるのだが。
「キューの中身が全て同じ値だと違いが起きない」とかか?
それさえ判れば書けるのだが。
「キューの中身が全て同じ値だと違いが起きない」とかか?
2.6
公式にある解答例。ただし「あまり賢くない」と書いてある。
-- A not-very-intelligent answer to Exercise 2.6 - try to improve it
instance Arbitrary Form where
arbitrary = sized arbForm
arbForm 0 = liftM Var arbitrary
arbForm n | n > 0 = frequency [(1, liftM Var arbitrary),
(2, liftM2 (: &) subForm subForm),
(2, liftM Not subForm)]
where subForm = arbForm (n `div` 2)
sizeの減らし方が大雑把だという意味なら、次のようにするのはどうか。
instance Arbitrary Form where
arbitrary = sized arbForm
arbForm 0 = liftM Var arbitrary
arbForm n | n > 0 = frequency [ (1, liftM Not (arbForm (n − 1)))
, (1, liftM2 (: &) subForm subForm)]
where subForm = arbForm (n `div` 2)
しかしこれでは完全木しか作れないので、やはりfrequencyでもVarを出す可能性を残す必要がある、
ような気がする。
ような気がする。
自分用メモ
n `div` 2 で同じ大きさの木を両方で作る代わりに、
nを超えない整数kをランダムに選び、左をk,右をn-kの大きさの木にすればよいのではないか?
n `div` 2 で同じ大きさの木を両方で作る代わりに、
nを超えない整数kをランダムに選び、左をk,右をn-kの大きさの木にすればよいのではないか?
2.7
「モデルのサイズ」を付置した変数の数と仮定する。
prop_Complete :: Form -> Property
prop_Complete p = forAll (valuationOver (names p)) $ \ val ->
val |= p ==> collect (l2m (length (names p))) $
any (\ val' -> val' `covers` val) (models p)
where
l2m k = let i = k `div` 5 * 5 in show i ++ " - " ++ show (i+4)