packages feed

FM-SBLEX-3.0: src/dalin/AdjRulesSw.hs

----------------------------------------------------------------------
-- |
-- Module      : AdjRulesSw
-- Maintainer  : Markus Forsberg
-- Stability   : (stability)
-- Portability : (portability)
--
-- Swedish adjective functions
-------------------------------------------------------------------------
module AdjRulesSw where

import TypesSw
import General
import NounRulesSw(mk_case)
import GenRulesSw
import List(nub)

no_neutrum :: Adjective -> Adjective
no_neutrum f = missing f [(AF (Pos (Strong ASgNeutr))  c) | c <- values]

no_genitive :: Adjective -> Adjective
no_genitive f = missing f [(AF v Gen) | v <- values]

no_masc :: Adjective -> Adjective
no_masc f = missing f $ [AF (Pos (Weak (AxSg Sex_Masc))) v | v <- values] ++ [AF (Super (SupWeak Sex_Masc)) v | v <- values]

mk_adj_pos :: [String] -> [String] -> [String] -> [String] -> AdjFormPos -> [String]
mk_adj_pos liten litet lilla sma a = case a of
  Strong gn  -> case gn of
    ASgUtr   -> liten
    ASgNeutr -> litet
    APl      -> sma
  Weak sn -> case sn of
    AxSg g -> giveValues [lilla, lille] g
    AxPl -> sma
 where
   lille = let x = map (\s -> if (last s == 'a') then tk 1 s else s) lilla in 
           -- avoid bra -> bre, få -> fe
             if (and (map (any is_vowel) x)) then nub (map (+?"e") x) else lilla

mk_adjective :: String -> String -> String -> String -> String -> String -> String -> Adjective
mk_adjective liten litet lilla sma mindre minst minsta = 
    mk_adjective_v [liten] [litet] [lilla] [sma] [mindre] [minst] [minsta]

mk_adjective_v :: [String] -> [String] -> [String] -> [String] -> [String] -> [String] -> [String] -> Adjective
mk_adjective_v liten litet lilla sma mindre minst minsta AdjComp = strings $ concat [[x,x +? "-"] | x@(_:_) <- liten]
mk_adjective_v liten litet lilla sma mindre minst minsta AdjSMS  = strings $ [x +? "-" | x@(_:_) <- liten]
mk_adjective_v liten litet lilla sma mindre minst minsta (AF a c) = 
  strings $ map (mk_case c) $ case a of
    Pos p   -> mk_adj_pos liten litet lilla sma p
    Comp    -> mindre 
    Super s -> giveValues [minst, minsta,minste] s
 where minste = let x = map  (\s -> if (last s == 'a') then tk 1 s else s) minsta in 
                 if 
                     (and (map (any is_vowel) x)) then nub (map (+?"e") x) else []

adjective_prefixed :: Int -> Suffixes -> Suffixes -> Suffixes -> Suffixes -> 
                             Suffixes -> Suffixes -> Suffixes -> String -> Adjective
adjective_prefixed n liten litet lilla sma mindre minst minsta s = 
     mk_adjective_v (f liten) (f litet) (f lilla) (f sma) (f mindre) (f minst) (f minsta)
  where f = apply_suffixes (tk n s) -- map ((tk n s) ++)

extract_positive ::  Adjective -> AdjFormPos -> Str
extract_positive adj a = adj (AF (Pos a) Nom)

no_compare :: Adjective -> Adjective
no_compare a = a `only` positive_forms

adj_irreg :: String -> String -> String -> String -> Adjective
adj_irreg god gott battre bast = mk_adjective god gott (god ++ "a") (god ++ "a") battre bast (bast ++ "a")

adj_irreg3 :: String -> String -> String -> Adjective
adj_irreg3 ung yngre yngst = adj_irreg ung (ung ++ "t") yngre yngst

adj_almost_reg :: String -> String -> String -> Adjective
adj_almost_reg ljummen ljummet ljumma = mk_adjective ljummen ljummet ljumma ljumma (fv (ljumma) ++ "re") (fv (ljumma) ++ "st") (fv (ljumma) ++ "ste")

-- adjective 0
av0 :: String -> String -> String -> String -> Adjective
av0 liten litet lilla sma
    = no_compare $ mk_adjective liten litet lilla sma [] [] []

av0kronisk :: String -> Adjective
av0kronisk kronisk = adj_almost_reg kronisk (kronisk ++ "t") (kronisk ++ "a") `only` positive_forms

av0konstlad :: String -> Adjective
av0konstlad konstlad = adj_almost_reg konstlad (konstla ++ "t") (konstlad ++ "e") `only` positive_forms
 where konstla =tk 1 konstlad

av0gängse :: String -> Adjective
av0gängse = no_compare . const . mkStr

av0lastgammal :: String -> Adjective
av0lastgammal lastgammal = no_compare $ 
       adj_almost_reg lastgammal (lastgammal ++ "t") (lastgamla) 
 where lastgamla =  (ungeminate (tk 2 lastgammal)) ++ "la"

av0medelstor :: String -> Adjective
av0medelstor medelstor = no_compare $ 
  adj_almost_reg medelstor (medelstor ++ "t") (medelstor++"a")

-- adjective 1
av1blek :: String -> Adjective
av1blek blek = adj_almost_reg blek (blek ++ "t") (blek ++ "a")

av1fri :: String -> Adjective
av1fri fri = adj_almost_reg fri (fri ++ "tt") (fri ++ "a")

av1lätt :: String -> Adjective
av1lätt lätt = adj_almost_reg lätt lätt (lätt  ++ "a")

av1glad :: String -> Adjective
av1glad glad = adj_almost_reg glad (tk 1 glad  ++  "tt") (glad ++ "a")

av1högljudd :: String -> Adjective
av1högljudd högljudd = adj_almost_reg högljudd (höglju ++  "tt") (högljudd  ++ "a")
 where höglju = case reverse högljudd of
                 (c:c1:_) | c == c1 -> tk 2 högljudd
                 _                  -> tk 1 högljudd

av1hård :: String -> Adjective
av1hård hård = adj_almost_reg hård (tk 1 hård ++ "t")  (hård ++ "a")

av1tunn :: String -> Adjective
av1tunn tunn = adj_almost_reg tunn (tk 1 tunn ++ "t")  (tunn ++ "a")

av1ensam :: String -> Adjective
av1ensam ensam = mk_adjective ensam (ensam++"t") (ensam++ma) (ensam++ma) (ensam++ma ++ "re") (ensam++ ma ++ "st") (ensam++ma++"ste")
 where ma = [last ensam] ++ "a"

av1vacker :: String -> Adjective
av1vacker vacker = adj_almost_reg vacker vackert (mmn (drop_last_vowel vacker) ++ "a")
  where vackert = ifEndThen (== 'n') vacker (tk 1 vacker ++"t") (vacker++"t")

av1angelägen :: String -> Adjective
av1angelägen angelägen = adj_almost_reg angelägen (angeläg ++ "et") ((ungeminate angeläg) +? "na")
 where angeläg = tk 2 angelägen

av1ringa :: String -> Adjective
av1ringa ringa  = adj_almost_reg ringa ringa ringa

av1akut :: String -> Adjective
av1akut akut = adj_almost_reg akut (aku ++ "t") (akut ++ "a")
 where aku = tk 1 akut

av1lat :: String -> Adjective
av1lat lat = no_neutrum (av1akut lat)

-- adjective 2
av2ung :: String -> Adjective
av2ung ung = adj_irreg3 ung (yng++"re") (yng++"st")
  where yng = umlaut ung

av2yttre :: String -> Adjective
av2yttre yttre = missing (adj_irreg3 [] yttre ytterst) [ a | a@(AF (Pos _) _) <- values]
 where ytterst = (tk 2 yttre ++ "er") ++ "st"