content: import Test.FitSpec
  
  propertiesN :: (Bool -> Bool) -> [Property]
  propertiesN not =
    [ property $ \p -> not (not p) == p
    , property $ \p -> not p /= p
    , property $       not True == False
    ]
  
  propertiesNA :: (Bool -> Bool) -> (Bool -> Bool -> Bool) -> [Property]
  propertiesNA not (&&) =
    [ property $ \p     -> not (not p)     == p
    , property $ \p q   -> p && q          == q && p
    , property $ \p     -> p && p          == p
    , property $ \p     -> p && False      == False
    , property $ \p q r -> p && (q && r)   == (p && q) && r
    , property $ \p     -> p && not p      == False
    , property $ \p     -> p && not False  == p
    ]
  
  propertiesNAO :: (Bool->Bool) -> (Bool->Bool->Bool) -> (Bool->Bool->Bool)
                -> [Property]
  propertiesNAO not (&&) (||) =
    [ property $                not True == False
    , property $ \p     ->   not (not p) == p
  
    , property $ \p q   ->        p && q == q && p
    , property $ \p     ->        p && p == p
    , property $ \p     ->     p && True == p
    , property $ \p     ->    p && False == False
    , property $ \p q r -> p && (q && r) == q && (p && r)
  
    , property $ \p q   ->        p || q == q || p
    , property $ \p     ->        p || p == p
    , property $ \p     ->     p || True == True
    , property $ \p     ->    p || False == p
    , property $ \p q r -> p || (q || r) == q || (p || r)
  
    , property $ \p q   -> p && (p || q) == p
    , property $ \p q   -> p || (p && q) == p
    , property $ \p     ->    p && not p == False
    ]
  
  main = do
    as <- getArgsWith args { names = ["not p","p && q","p || q"]
                           , nMutants = 100
                           , nTests   = 100
                           , timeout  = 0 }
    let run f ps = reportWith as f ps
    case concat $ extra as of
      "nao" -> run (not,(&&),(||)) (uncurry3 propertiesNAO)
      "na"  -> run (not,(&&))      (uncurry  propertiesNA)
      _     -> run  not                      propertiesN
  
  uncurry3 :: (a -> b -> c -> d) -> (a, b, c) -> d
  uncurry3 f (x,y,z) = f x y z
  