module Lambda.CFG4 where
data S
data NP
data VP
data TV
class Symantics repr where
john, mary :: repr NP
like :: repr TV
r2 :: repr TV -> repr NP -> repr VP
r1 :: repr NP -> repr VP -> repr S
sentence = r1 john (r2 like mary)
data EN a = EN { unEN :: String }
instance Symantics EN where
john = EN "John"
mary = EN "Mary"
like = EN "likes"
r2 (EN f) (EN x) = EN (f ++ " " ++ x)
r1 (EN x) (EN f) = EN (x ++ " " ++ f)
instance Show (EN a) where
show = unEN
sentence_en = sentence :: EN S
type family Tr (a :: *) :: *
type instance Tr S = Bool
type instance Tr NP = Entity
type instance Tr VP = Entity -> Bool
type instance Tr TV = Entity -> Entity -> Bool
data Sem a = Sem { unSem :: Tr a }
data Entity = John | Mary
deriving (Eq, Show)
instance Symantics Sem where
john = Sem John
mary = Sem Mary
like = Sem (\o s -> elem (s,o) [(John,Mary), (Mary,John)])
r2 (Sem f) (Sem x) = Sem (f x)
r1 (Sem x) (Sem f) = Sem (f x)
instance Show (Sem S) where
show (Sem x) = show x
sentence_sem = sentence :: Sem S