2013-05-01から1ヶ月間の記事一覧

quickCheck 英文生成

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

quickCheck - Lisp のコンス

Lisp のコンスを用いたバージョン。ほぼ PAIP 2.3 を直訳したつもり。 まず実例。ex 、ex' 関数は共に Object -> Object -> IO Object で、QuickCheck の sample' 関数を使っている。ex は文を、ex' は解析木を吐く。 *EnglishRule13> ex simpleGrammar (S "…

quickCheck - Cons 版

コンスセルを使った版。途中。 module EnglishRule12 where import qualified Test.QuickCheck as Q import Control.Monad import Data.List import Data.Tree -- data data Object = Nil | S String | I Int | Object :. Object deriving (Eq) -- infixr 0 …

quickCheck 英文生成

まだバグがあるが改良版。 module EnglishRule7 where import Test.QuickCheck import Control.Monad import Data.List -- data type Name = String data Rule = Word [String] | Rule [[String]] deriving (Eq, Show) type Grammar = [(String, Rule)] simp…

quickCheck - 英文生成(4)

PAIP では同じ英文生成のルールデータを用いて、解析木(Parse Tree)を生成する。わたしの作ったデータ構造だとちょっと上手くいかなかったため、Rule データ型を改良して名前を持てるようにした。 module EnglishRule6 where import Test.QuickCheck import …

quickCheck 入門 - 英文生成(3)

少し考え方を変え、定義をそのままデータ構造にした。Grammar データを単なる Rule の配列でなくタプルのリストにしているのは、あとからルールを参照するため。 module EnglishRule3 where import Test.QuickCheck import Control.Monad import Data.List d…

quickCheck 入門 - 英文生成(2)

Maybe 型を使ってみた途中版。無駄なスペースが生成されるバグあり。あまり整頓された感じはしない。 module EnglishRule2 where import Test.QuickCheck import Control.Monad import Data.List import Control.Applicative data Sym = Sym String deriving…

quickCheck 入門 - 英文生成

英文生成の簡単な版は、QuickCheck を使うことで以下のように書けた(PAIP 2.2 A Straightforward Solution)。 module English where import Test.QuickCheck import Control.Monad verb = elements ["hit", "took", "saw", "liked"] :: Gen String noun = el…

quickCheck 入門

Haskell の quickCheck の簡単な例を作った。 式 データ型 Obj は、Nil 、数、シンボル、コンスセルの何れかであり、コンスセルはデータ型 Obj 二つからなる。 module ConsCell where import Test.QuickCheck import Control.Monad data Obj = Nil | N Int |…

三味線の譜面

PostScript