haskell - 自动和确定性地测试一个函数的关联性、交换性等

标签 haskell higher-order-functions halting-problem associativity commutativity

是否可以构造更高阶函数isAssociative它接受另一个有两个参数的函数并确定该函数是否是关联的?

类似的问题,但也适用于其他属性,例如交换性。

如果这是不可能的,有没有办法用任何语言自动化它?如果有我感兴趣的 Agda、Coq 或 Prolog 解决方案。

我可以设想一个蛮力解决方案,它检查每个可能的参数组合并且永不终止。但是在这种情况下,“永不终止”是一个不受欢迎的属性。

最佳答案

我想到的第一个解决方案是使用 QuickCheck .

quickCheck $ \(x, y, z) -> f x (f y z) == f (f x y) z
quickCheck $ \(x, y) -> f x y == f y x

在哪里 f是我们正在测试的功能。它既不能证明结合性也不能证明交换性;这只是编写您一直在考虑的蛮力解决方案的最简单方法。 QuickCheck 的优势在于它能够选择测试的参数,这些参数有望成为测试代码的极端案例。

一个 isAssociative您要求的可以定义为
isAssociative
  :: (Arbitrary t, Show t, Eq t) => (t -> t -> t) -> IO ()
isAssociative f = quickCheck $ \(x, y, z) -> f x (f y z) == f (f x y) z

它在 IO因为 QuickCheck 随机选择测试用例。

关于haskell - 自动和确定性地测试一个函数的关联性、交换性等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652590/

相关文章:

php - 用逗号分解字符串并从每个值中修剪潜在的空格

c++ - 为什么不能消除无限循环?

Scala 高阶函数有点困惑

haskell - 相当于 `_1`风格的元组镜头快捷方式的数据类?

haskell - 在 Haskell 中的列表末尾添加一个元素

haskell - 未找到 System.IO.UTF8(安装 PureScript)

haskell - 为什么 Haskell 在函数组合后不接受参数?

javascript - meteor -检测无限循环

computer-science - 究竟什么是停机问题?

haskell - 如何在 Haskell 中结合 List 和 State Monad