quickCheck 英文生成

英文生成

PAIP (Paradigms of Artificial Intelligence Programming) の第2章 「簡単な Lisp プログラムの例」では、ランダムな英文を生成するプログラムを取り上げています。勉強のため、この英文生成プログラムを Haskell で書いてみました。コードは以下に置きました。

正攻法

PAIP ではまず、Lisp の関数と(小さな)英文法を直接対応させた解が示されます。これを直接 Haskell に翻訳したのが simple.hs です。Haskell は純粋関数型言語のため、Lisp のように気軽にランダムな要素を返す関数は書けません。ここでは quickCheck の elements 関数を用い、Gen String 型の関数としました。実際にランダムな要素を生成するには sample または sample' 関数を用います。sample2.hs は同じ内容を liftM2 を使って書いたものです。

ルールベース

PAIP では次に、直接 Lisp 関数を書く自由度の低いやり方から、ルールベースのより柔軟性のあるやり方を示します。これはデータとして英文生成ルールを持たせ、プログラムはこのルールを参照して動作するやり方です。Lisp では、シンボルとリストで非常に分かりやすく、直接的にルールを表現することができます。
このルールベースの Haskell 版が rule.hs です。試行錯誤した結果のため、Lisp 版とだいぶ違っています。PAIP で示されている同じルールを用いて木を生成する例も含めています。