gpt4 book ai didi

haskell - quickCheck 命题逻辑生成器

转载 作者:行者123 更新时间:2023-12-04 08:53:32 26 4
gpt4 key购买 nike

所以我有这个 quickCheck 命题逻辑生成器:

instance Arbitrary Form where
arbitrary = genForm

genForm = sized genForm'
genForm' 0 = fmap Prop (choose (1,15))
genForm' n | n > 15 = genForm' (n `div` 2)
genForm' n | n > 0 =
oneof [fmap Prop (choose (1,15)),
fmap Neg subform,
fmap Cnj subforms,
fmap Dsj subforms,
liftM2 Impl subform subform,
liftM2 Equiv subform subform]
where subform = genForm' (n `div` 2)
subforms = resize (n `div` 2) (vector (n `div` 2))
数据类型定义如下:
type Name = Int

data Form = Prop Name
| Neg Form
| Cnj [Form]
| Dsj [Form]
| Impl Form Form
| Equiv Form Form
deriving (Eq,Ord)
问题是这个生成器会以以下形式生成: +[] (一无所有)。我不希望我的运算符(operator)没有嵌套 Prop成员,因为它使命题公式无效。我想确保没有没有 Prop 的选项成员在最后。
我的想法是这个问题来自 resize (div n 2) .当 n甚至这最终会击中 0而不是进一步生成并因此创建一个空成员。删除 resize不会有帮助,因为它不会生成结尾的“树”。所以它似乎是需要的,但应该以某种方式进行调整。
但是我不太擅长 Haskell,而且我在调试/阅读文档方面遇到了困难。

最佳答案

申请 vector非零参数:

subforms = resize (n `div` 2) (vector (1 + (n `div` 2)))
或使用 listOf1 arbitrary 而不是 vector
subforms = resize (n `div` 2) (listOf1 arbitrary)

来自后续评论:

even need the generated amount to be at least >2


申请 vector到长度 >= 2:
subforms = resize (n `div` 2) (vector (2 + (n `div` 2)))
或者在前面显式附加两个元素(使用 listOf 允许长度也改变):
subforms = resize (n `div` 2) (listOf2 arbitrary)
where
listOf2 :: Gen a -> Gen [a]
listOf2 gen = liftA2 (:) gen (liftA2 (:) gen (listOf gen))
-- 1. (listOf gen) to generate a list
-- 2. Call gen twice to generate two more elements
-- 3. Append everything together with `(:)`

关于haskell - quickCheck 命题逻辑生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63972160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com