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

时间:2019-09-18 04:14:54

标签: haskell lambda-calculus quickcheck

我有以下语法代表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演算的基准?

2 个答案:

答案 0 :(得分:2)

我真的不知道您可以重用一个库。该库可能还会使您陷入一种特殊的绑定构造方法中,例如De Bruijn,Names,(P)HOAS或bound

但是我知道Haskell中的一种实现确实会随机生成紧密且类型正确的术语:https://github.com/Gabriel439/Haskell-Morte-Library/blob/3c61df86985a7ccf97fe0765deac73f06b12c476/test/ClosedWellTyped.hs#L38

也许这足以让您滚动?

答案 1 :(得分:1)

是的,您需要的是QuickCheck库。

首先,我假设NameString的类型同义词? 当然,在STLC中生成lambda项会带来一个特殊的问题。 快速检查使您可以在Gen Monad中生成术语,从而可以合成术语。类型的默认Gen可以通过使类型类为Arbitrary的类型实例来声明。也就是说,一旦有了嵌套类型的生成器,就可以使用它来使用它创建值构造器的生成器。

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

intLambda :: Gen Expr
intLambda = Lam Tint <$> elements ["x","y"] <*> (boolExpr :: Gen Expr)

(请注意,我使用的是Appationative Notation,在此Monad中通常更优雅)。

Gen模块是the hackage documentation的一个很好的起点。许多QuickChecks模块特别适合执行测试,这似乎并不是您的主要考虑。