packages feed

FM-SBLEX-3.0: src/fsv/Types.hs

module Types where

import General
import Invariant

-- Noun parameters.

data Gender = Masc | Fem | Neut
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Number = Sg | Pl
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data NumberD = Sing | Dual | Plu
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Species = Indef | Def
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Case = Nom | Gen | Dat | Ack
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data NN_Form = NN_C Number Case Species
  deriving (Eq, Ord, Show, Read)

instance Param Gender   where 
    values = enum
    prValue Masc = "m"
    prValue Fem = "f"
    prValue Neut = "n"
instance Param Number   where 
    values = enum
    prValue Sg = "sg"
    prValue Pl = "pl"
instance Param NumberD  where 
    values = enum
    prValue Sing = "sg"
    prValue Dual = "dl"
    prValue Plu  = "pl"
instance Param Species  
    where values = enum
          prValue Indef = "indef"
          prValue Def = "def"
instance Param Case     
    where values = enum
          prValue Nom = "nom" 
          prValue Gen = "gen"
          prValue Dat = "dat"
          prValue Ack = "ack"

instance Param NN_Form 
  where values = [NN_C a b c | c <- values, a <- values, b <- values]
	prValue (NN_C a b c) = unwords [prValue a, prValue b, prValue c]

type NN = NN_Form -> Str

data Modus = Ind | Conj
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Vox = Act | Pass
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Grade = Posit | Compar | Superl
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Person = P1 | P2 | P3
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

data Person12 = Pers1 | Pers2
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param Modus    where 
    values = enum
    prValue Ind = "ind"
    prValue Conj = "konj"
instance Param Vox      where 
    values = enum
    prValue Act  = "akt"
    prValue Pass = "pass"
instance Param Grade    where 
    values = enum
    prValue Posit  = "pos"
    prValue Compar = "komp"
    prValue Superl = "super"
instance Param Person   where 
    values = enum
    prValue P1 = "p1"
    prValue P2 = "p2"
    prValue P3 = "p3"
instance Param Person12 where 
    values = enum
    prValue Pers1 = "p1"
    prValue Pers2 = "p2"
-- adjectives

type AV = AdjForm -> Str

data AdjForm =
  StrongPos Gender Number Case 
  | WeakPos   Gender Number Case 
  | Comp      Gender Number Case 
  | Super 
  deriving (Eq, Ord, Show, Read)

instance Param AdjForm where 
  values =            
    [WeakPos   a b c | a <- values, b <- values, c <- values] ++
    [StrongPos a b c | a <- values, b <- values, c <- values] ++
    [Comp      a b c | a <- values, b <- values, c <- values] ++ [Super]
  prValue (WeakPos a b c)   = "pos weak "   ++ prValue a ++ " " ++ prValue b ++ " " ++ prValue c
  prValue (StrongPos a b c) = "pos strong " ++ prValue a ++ " " ++ prValue b ++ " " ++ prValue c
  prValue (Comp a b c)      = "comp "       ++ prValue a ++ " " ++ prValue b ++ " " ++ prValue c
  prValue (Super)           = "super"

type Numeral = NumeralForm -> Str

data NumeralForm = NumF Case Gender
 deriving (Show,Eq)

instance Param NumeralForm where
  values = [NumF a b | b <- values, a <- values]
  prValue (NumF c g) = prValue c ++ " " ++ prValue g


type Ordinal = OrdinalForm -> Str

data OrdinalForm = OrdF Gender Number Case
    deriving (Show,Eq)

instance Param OrdinalForm where
  values = [OrdF a b c | a <- values, b <- values, c <- values]
  prValue (OrdF g n c) = prValue g ++ " " ++ prValue n ++ " " ++ prValue c

-- verbs

type Verb = VerbForm -> Str

data VerbForm = 
   PresSg     Modus  Vox
 | PresPl     Person Modus Vox
 | PretInd    Number Person Vox
 | Inf Vox
 | PretConjSg Vox
 | PretConjPl Person Vox
 | ImperSg
 | ImperPl Person12
  deriving (Eq, Ord, Show, Read)

instance Param VerbForm where
  values = [PresSg     m v | v <- values, m <- values]              ++
           [PresPl   p m v | v <- values, m <- values, p <- values] ++
           [PretInd  n p v | v <- values, n <- values, p <- values] ++
           [PretConjSg   v | v <- values]                           ++
           [PretConjPl p v | v <- values, p <- values]              ++
           [Inf v | v <- values] ++
           [ImperSg] ++ 
           [ImperPl p | p <- values]
  prValue (PresSg m v)      = unwords ["pres",prValue m, prValue Sg, prValue v]
  prValue (PresPl p m v)    = unwords ["pres",prValue m, prValue Pl, prValue p, prValue v]
  prValue (PretInd n p v)   = unwords ["pret",prValue Ind, prValue n, prValue p, prValue v]
  prValue (PretConjSg v)    = unwords ["pret",prValue Conj, prValue Sg,prValue v] 
  prValue (PretConjPl p v)  = unwords ["pret",prValue Conj, prValue Pl,prValue p,prValue v] 
  prValue (ImperSg)         = unwords ["imper",prValue Sg]
  prValue (ImperPl p)       = unwords ["imper",prValue Pl, prValue p]
  prValue (Inf v)           = unwords ["inf",prValue v]

--- Pronoun

type Pronoun = PNForm -> Str

data PNForm = PNF Gender Number Case
   deriving (Eq,Ord,Show,Read)

instance Param PNForm where
   values = [PNF g n c | g <- values, n <- values, c <- values]
   prValue (PNF g n c) = unwords [prValue g, prValue n, prValue c]

type PPronoun = PPNForm -> Str

data PPNForm = First  NumberD Case |
               Second NumberD Case |
               Refl     NumberD Case
   deriving (Eq,Ord,Show,Read)

instance Param PPNForm where
   values = [First n c | n <- values, c <- values] ++
            [Second n c | n <- values, c <- values] ++
            [Refl n c | n <- values, c <- values]
   prValue (First n c)  = unwords ["p1",prValue n, prValue c]
   prValue (Second n c) = unwords ["p2",prValue n, prValue c]
   prValue (Refl n c)   = unwords ["refl",prValue n, prValue c]


type Adverb = AdverbForm -> Str

data AdverbForm = AdverbForm Grade
  deriving (Eq, Ord, Show, Read)

instance Param AdverbForm where 
    values = [AdverbForm g | g <- values]
    prValue (AdverbForm g) = prValue g

{-

-- price to pay for hierarchical types: if we want to define non-passive verbs
passiveForms :: [VerbForm]
passiveForms = 
  map VF (concat [[Pres m Pass, Pret m Pass] | m <- values]) ++ 
  map VI [Inf Pass, Sup Pass] ++ 
  partPretForms

partPretForms :: [VerbForm]
partPretForms = [VI (PtPret a c) | a <- values, c <- values]

positiveForms :: [AdjForm]
positiveForms = [AF (Pos a) c | a <- values, c <- values]

-- adverbs

-- invariant adverbs

type AdverbInv = AdverbInvForm -> Str

data AdverbInvForm = AdverbInvForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param AdverbInvForm where 
			     values = enum
			     prValue _ = invar

-- invariant interrogative adverbs

type InterrogInv = InterrogInvForm -> Str

data InterrogInvForm = InterrogInvForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param InterrogInvForm where 
			     values = enum
			     prValue _ = invar


-------------------------------
-- closed classes -------------
-------------------------------

-- pronouns

type PronPN  = PronCasus -> Str
type PronAdj = AdjPronForm -> Str

data PronCasus = PNom | PAcc | PGen GenNum
  deriving (Eq, Ord, Show, Read)

instance Param PronCasus where
  values = PNom : PAcc : map PGen values

data AdjPronForm = AP GenNum Casus
  deriving (Eq, Ord, Show, Read)


instance Param AdjPronForm where
  values = [AP g c | g <- values, c <- values]

type PronInv = PronInvForm -> Str

data PronInvForm = PronInvForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param PronInvForm where 
			     values = enum
			     prValue _ = invar


-- invariant
data InterjForm = InterjForm 
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

type Interjection = InterjForm -> Str

instance Param InterjForm where 
  values = enum
  prValue _ = invar

-- articles

type Article = ArticleForm -> Str

data ArticleForm = ArticleForm GenNum
 deriving(Eq,Ord,Show,Read)

instance Param ArticleForm where 
   values = [ArticleForm g | g <- values]
   prValue (ArticleForm g) = prValue g

-- auxiliary verbs

data AuxVerbForm = AuxInf | AuxPres | AuxPret | AuxSup 
  deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param AuxVerbForm where values = enum

type AuxVerb = AuxVerbForm -> Str

-- Prepositions

type Preposition = PrepForm -> Str

data PrepForm = PrepForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param PrepForm where 
			values = enum
			prValue _ = invar

-- Conjunction

type Conjunction = ConjForm -> Str

data ConjForm = ConjForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param ConjForm where 
			values = enum
			prValue _ = invar

-- Subjunction

type Subjunction = SubForm -> Str

data SubForm = SubForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param SubForm where 
		       values = enum
		       prValue _ = invar

-- Particles

type Particle = PartForm -> Str

data PartForm = PartForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param PartForm where 
			values = enum
			prValue _ = invar
		   
-- Infinitive mark
type InfMark = InfMarkForm -> Str

data InfMarkForm = InfMarkForm
 deriving (Eq, Ord, Show, Read, Enum, Bounded)

instance Param InfMarkForm where 
			   values = enum
			   prValue _ = invar

-- Proper Noun
type PN = PNForm -> Str

data PNForm = PNForm Casus
 deriving (Eq, Ord, Show, Read)

instance Param PNForm where 
		      values = [PNForm c | c <- values]
		      prValue (PNForm c) = prValue c

-}