Просто для справки вот пример, который включает списки:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
notLargeOrBothNotEmpty :: Property
notLargeOrBothNotEmpty = property $ do
xs <- forAll randomIntLists
ys <- forAll randomIntLists
assert $ length xs < 4 && (xs /= [] && ys /=[])
where
randomIntLists = Gen.frequency
[ (1, Gen.list (Range.constant 0 1) randomInt)
, (10, Gen.list (Range.constant 1 100) randomInt)
]
randomInt = Gen.integral (Range.constat 1 10)
main :: IO Bool
main = checkParallel $
Group "Test.Example" [("Produce a minimal counter-example", notLargeOrBothNotEmpty)]
Так что ежик иногда возвращает в качестве контрпримеров списки ( [ 1 , 1 , 1 , 1 ], [])
.Однако ([], [])
является меньшим контрпримером (о котором иногда также сообщает hedgehog
).100
В этом случае условие, которое нарушает свойство:
4 <= length xs || (xs == [] && ys == [])
Если изначально найден контрпример, где ys /= []
и 4 <= length xs
, попытка интегрированного сокращениясначала уменьшите xs
, а затем продолжите сжатие ys
, сохраняя xs
постоянным, как описано в посте, который я цитировал в своем первоначальном вопросе.