如何用QuickCheck伪造函数组合的交换性

时间:2011-11-18 09:49:13

标签: haskell quickcheck

  1. 应该传递给以下代码的CoArbitrary的ex是什么?

  2. 如何在Test.QuickCheck.Function中使用函数来表示命题中的f和g?

  3. 编写是否正确,如果不是,怎么写?

    其中types = [f,g] :: [Function]

  4. 变体可以接受功能吗?因为我知道生成函数经常使用><或QuickCheck源代码中所述的变体

  5. 错误:

    <interactive>:1:12:
        No instance for (Eq (b0 -> b0))
          arising from a use of `prop_commutative'
        Possible fix: add an instance declaration for (Eq (b0 -> b0))
        In the first argument of `quickCheck', namely `prop_commutative'
        In the expression: quickCheck prop_commutative
        In an equation for `it': it = quickCheck prop_commutative
    

    [更新]

    但未实施CoArbitrary http://www.google.com.hk/url?sa=t&rct=j&q=QuickCheck+meiser.pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fwww.st.cs.uni-saarland.de%2Fedu%2Fseminare%2F2005%2Fadvanced-fp%2Fslides%2Fmeiser.pdf&ei=hhfHTo_ZDdCciAethMjqDw&usg=AFQjCNFF467CXacWGMkN8jvgqatkcLcVcg

    另一篇文章模仿Function中的示例,在'='处解析错误 在ghci let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f)可以运行

    代码:

    import Test.QuickCheck.Function
    import Test.QuickCheck.Gen
    import Test.QuickCheck
    
    let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f)
    
    main = quickCheck prop_commutative
    

2 个答案:

答案 0 :(得分:3)

QuickCheck查找反例。因此,您需要对所寻求的财产进行否定:

prop1 f g x = not $ (f . g) x == (g . f) x

此特定属性未指定函数类型 - a -> a的任何函数都可以工作。因此,您需要为fg或整个函数prop1指定类型。

  1. 您无法比较f . gg . f的相等性,因为它们都是函数,而且对于Haskell中具有无限域的函数,您不能对Eq有明智的定义。您还需要随机生成参数,并通过比较结果来比较f . gg . f函数 通过将随机参数传递给两者。

  2. 阅读Fun _ f类型的documentationf有一个单态函数。 QuickCheck无法生成不同类型的随机函数 - 它只能生成某种特定类型的函数。但.多态,因此无法从上下文推断出特定类型的f。因此,您需要为fg选择一些任意类型,并在属性的类型签名中指定它。

  3. 此外,顶级定义不需要let。我们只能在let..indo块内部的表达式中使用in

答案 1 :(得分:-1)

从nponeccop收到一条说明,我建议使用这个模板:

import Test.QuickCheck

prop_commutative f g x = ...

main = quickCheck $ prop_commutative f g
  where f x = ...
        g x = ...

这种方法要求您提出一个反例。这很简单:想想两个函数,当两种方式组合时,不会产生相同的结果。这种方法也利用了部分应用。我已将两个函数交给prop_commutative,只留下x,以便生成并测试quickCheck。

但这可能太简单了。如果你能做到这一点,那么下一步就是删除特定的反例并找出如何让quickCheck为你生成函数。