Haskell 从语法生成随机项(简单类型的lambda演算)

Haskell 从语法生成随机项(简单类型的lambda演算),haskell,lambda-calculus,quickcheck,Haskell,Lambda Calculus,Quickcheck,下面的语法表示Haskell中的简单类型lambda演算(STLC)。我在文献中看到了很多关于如何生成随机lambda术语的文章,但我想知道Haskell中是否有库可以从下面的语法生成随机实例?我只对生成一次程序感兴趣 我看到了一个名为QuickCheck的库,但它可以用于此目的吗 data Vtype = Tint | Tbool | Tfun Vtype Vtype deriving (Eq, Data) data Expr

下面的语法表示Haskell中的简单类型lambda演算(STLC)。我在文献中看到了很多关于如何生成随机lambda术语的文章,但我想知道Haskell中是否有库可以从下面的语法生成随机实例?我只对生成一次程序感兴趣

我看到了一个名为QuickCheck的库,但它可以用于此目的吗

data Vtype = Tint
           | Tbool
           | Tfun Vtype Vtype
           deriving (Eq, Data)

data Expr = Vi Int
          | Vb Bool
          | Vv Name
          | App Expr Expr
          | Lam Vtype Name Expr
          deriving (Eq, Data)

我的第二个问题是,我知道Java和Python等语言有很多基准测试可用,但我试图为lambda演算寻找类似的基准测试,但什么也找不到。STLC或非类型lambda演算的基准测试是否有可能可用?

我真的不知道有哪个库可以重复使用。该库可能还会将您锁定在绑定构造的特定方法上,如De Bruijn、Names、(P)HOAS或
bound

然而,我知道Haskell中有一个实现,它确实随机生成紧密的、类型良好的术语:


也许这就足够让您开始工作了?

是的,快速检查库正是您所需要的

首先,我假设
Name
String
的类型同义词? 当然,在STLC中生成lambda术语会带来一个特殊的问题。 Quickcheck允许您在
Gen
Monad中生成术语,允许合成生成术语。类型的默认
Gen
s可以通过使typeclass的所述类型实例为任意的
来声明。也就是说,一旦有了嵌套类型的生成器,就可以使用它来创建值构造函数的生成器

举个例子,我们可以为lambda抽象编写一个生成器,使用名为x或y的
Tint
类型的参数并返回Bool(假设您编写了一个生成器
boolExpr
),如下所示:

intLambda::Gen Expr
intLambda=Lam色调元素[“x”,“y”](boolExpr::Gen Expr)
(注意,我使用的是应用符号,在这个单子中它通常更优雅。)


开始使用
Gen
模块是一个好地方。许多快速检查模块都是专门用于执行测试的,这似乎不是您主要关心的问题。

是的,有一些库用于此目的,您可能需要首先学习如何使用快速检查或其他一些随机性库。是否只生成类型良好的术语,或者垃圾也可以吗?最好是类型良好的术语,但即使不可以,我也可以使用任意随机术语,然后使用我的类型检查筛选它们。您可以使用。几年前我写了一篇关于它的文章。并不是说他的语言包括绑定结构Lam。请注意,这并不需要产生语义正确的程序。因此,生成的生成器生成非平凡lambda项的速度将非常慢。此外,它在隐藏复杂性方面也有点误导性:提出
[“x”,“y”]
是这里的难点,并且取决于
boolExpr
的结果,以获得任何合理的实现。@SebastianGraf,这就是为什么我说在STLC中生成lambda术语会带来一个特殊的问题。我举了一个相当虚假的例子,只是为了说明图书馆的能力。我完全同意,编写一个好的生成器是很难的,但这是OP需要解决的问题。
intLambda :: Gen Expr
intLambda = Lam Tint <$> elements ["x","y"] <*> (boolExpr :: Gen Expr)