module Sentence where -- Grammar for the animal sentence language: -- -- s ::= n v n | s `and` s -- n ::= `cats` | `dogs` | `ducks` -- v ::= `chase` | `cuddle` data Sentence = NVN Noun Verb Noun | And Sentence Sentence deriving (Eq,Show) data Noun = Cats | Dogs | Ducks deriving (Eq,Show) data Verb = Chase | Cuddle deriving (Eq,Show) -- | The sentence: cats cuddle ducks and dogs cuddle ducks ex1 :: Sentence ex1 = And (NVN Cats Cuddle Ducks) (NVN Dogs Cuddle Ducks) -- | The sentence: dogs chase cats and cats chase ducks and ducks chase cats ex2 :: Sentence ex2 = And (NVN Dogs Chase Cats) (And (NVN Cats Chase Ducks) (NVN Ducks Chase Cats)) -- ex2 = And (And (NVN Dogs Chase Cats) (NVN Cats Chase Ducks)) (NVN Ducks Chase Cats) -- | Build a sentence that is a conjunction of other sentences. conjunction :: [Sentence] -> Maybe Sentence conjunction [] = Nothing conjunction (h:t) = case conjunction t of Nothing -> Just h Just s -> Just (And h s) -- | Pretty print a sentence. pretty :: Sentence -> String pretty (NVN s v o) = prettyNoun s ++ " " ++ prettyVerb v ++ " " ++ prettyNoun o pretty (And l r) = pretty l ++ " and " ++ pretty r -- | Pretty print a noun. prettyNoun :: Noun -> String prettyNoun Cats = "cats" prettyNoun Dogs = "dogs" prettyNoun Ducks = "ducks" -- | Pretty print a verb. prettyVerb :: Verb -> String prettyVerb Chase = "chase" prettyVerb Cuddle = "cuddle" -- | Does the sentence contain only cuddling? isNice :: Sentence -> Bool isNice (NVN _ Chase _) = False isNice (NVN _ Cuddle _) = True isNice (And l r) = isNice l && isNice r