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


  1. 以下代码中应该传递给Co任意的ex是什么?

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

  3. 写正确吗?如果不正确,怎么写?

    其中types=[f,g]::[函数]

  4. 变体可以接受函数吗?正如我所知,generate函数经常使用><或QuickCheck 源代码中所述的变体

错误:

<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

[更新]

但它没有实现Co任意http://www.google.com.hk/url?sa=t&rct=j&q=QuickCheck+meiser.pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fww.st.cs.uni saarland.de%2Edu%2Fseminare%2F22005%2Advanced 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

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类型的文档。CCD_ 12存在单态函数。QuickCheck不能生成不同类型的随机函数,只能生成特定类型的函数。但.多态的,因此无法从上下文中推断出f的特定类型。因此,您需要为fg选择一些任意类型,并在属性的类型签名中指定它。

此外,顶级定义不需要let。Let只能在let..in形式的表达式内部和在没有indo块内部使用。

注意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为你生成函数。

最新更新