Blob Blame History Raw
# Suomi-malaga, suomen kielen muoto-opin kuvaus.
#
# Tekijänoikeus © 2006-2007 Hannu Väisänen (Etunimi.Sukunimi@joensuu.fi)
#                 2006-2010 Harri Pitkänen (hatapitk@iki.fi)
#
# Tämä ohjelma on vapaa; tätä ohjelmaa on sallittu levittää
# edelleen ja muuttaa GNU yleisen lisenssin (GPL lisenssin)
# ehtojen mukaan sellaisina kuin Free Software Foundation
# on ne julkaissut; joko Lisenssin version 2, tai (valinnan
# mukaan) minkä tahansa myöhemmän version mukaisesti.
#
# Tätä ohjelmaa levitetään siinä toivossa, että se olisi
# hyödyllinen, mutta ilman mitään takuuta; ilman edes
# hiljaista takuuta kaupallisesti hyväksyttävästä laadusta tai
# soveltuvuudesta tiettyyn tarkoitukseen. Katso GPL
# lisenssistä lisää yksityiskohtia.
#
# Tämän ohjelman mukana pitäisi tulla kopio GPL
# lisenssistä; jos näin ei ole, kirjoita osoitteeseen Free
# Software Foundation Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
# Tämän ohjeman linkittäminen staattisesti tai dynaamisesti
# muihin moduuleihin on ohjelmaan perustuvan teoksen
# tekemistä, joka on siis GPL lisenssin ehtojen alainen.
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# Linking this program statically or dynamically with other modules is
# making a combined work based on this program.  Thus, the terms and
# conditions of the GNU General Public License cover the whole
# combination.

include "config.inc";
include "suomi.inc";
include "subrule.inc";

# Palauttaa annetusta tietueesta johdoksissa tarvittavat lähtötiedot
subrule johdoksen_lähtötiedot($tietue):
    if (@voikko_debug) then
      return [lähtöluokka: $tietue.luokka, lähtösana: $tietue.perusmuoto];
    else
      return [lähtöluokka: $tietue.luokka];
    end;
end;

# Aputaulukko funktiolle luku_sijasta
define @luku_sijasta_muunnostaulu :=
[nimentö:     yksikkö,
 nimentö_t:   monikko,
 nimentö_tkA: monikko,
 omanto_n:    yksikkö,
 omanto_nkA:  yksikkö,
 omanto_ien:  monikko,
 omanto_jen:  monikko,
 omanto_en:   monikko,
 omanto_in:   monikko,
 omanto_ten:  monikko,
 omanto_iT:   monikko,
 omanto_idän: monikko,
 kohdanto_idät: monikko,
 kohdanto_t: yksikkö,
 osanto_A:    yksikkö,
 osanto_AA:   yksikkö,
 osanto_iA:   monikko,
 osanto_jA:   monikko,
 osanto_ttA:  yksikkö,
 osanto_itA:  monikko,
 osanto_tA:   yksikkö,
 olento_nA:   yksikkö,
 olento_inA:  monikko,
 tulento_ksi: yksikkö,
 sisäolento_ssA: yksikkö,
 sisäolento_nA: yksikkö,
 sisäeronto_tA: yksikkö,
 sisätulento_Vn: yksikkö,
 sisätulento_VVn: yksikkö,
 sisätulento_hVn: yksikkö,
 sisätulento_iin: monikko,
 sisätulento_ihin: monikko,
 sisätulento_seen: yksikkö,
 sisätulento_isiin: monikko,
 sisätulento_sen: yksikkö,
 sisätulento_isin: monikko,
 sisätulento_nne: monikko,
 vajanto_ttA: yksikkö,
 vajanto_ittA: monikko,
 seuranto_ine: monikko,
 keinonto_n: yksikkö,
 tulento_s: yksikkö,
 ulkopaikallissija_llA: yksikkö,
 ulkopaikallissija_illA: monikko
];

# Palauttaa annettua sijasymbolia vastaavan luvun
subrule luku_sijasta($sija):
  return @luku_sijasta_muunnostaulu.$sija;
end;


# Kaikista nimisanoista johdetaan laatusana tOn-johtimella, esim: valo+ton.

# Laatusanoista johdetaan nimisana (U)Us-johtimella,
# esim: korkea => korkeus, matala => mataluus.

# Taivutuskaavoissa, joissa ei ole laatusanoja, ei ole (U)Us-johdinta.


allo_rule generate_allos ($tietue):
  if (($tietue.tiedot /= nil) and
      ((murre in $tietue.tiedot and switch(voikko_murre) = no) or
       (ei_voikko in $tietue.tiedot and switch(sukijan_muodot) = no))) then
    stop;

  elseif ($tietue.luokka = etuliite) then
    if (last($tietue.alku) = "-") then
      result $tietue.alku, $tietue - alku;
    else
      result $tietue.alku, $tietue - alku + [jatko: $tietue.jatko + <tavuviiva>];
    end;

  elseif (valo in $tietue.jatko) then
    choose $i in valo ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (aalto in $tietue.jatko) then
    choose $i in valo ($tietue, tO($tietue), lO($tietue));
    result $i.alku, $i - alku;

  elseif (alku in $tietue.jatko) then
    choose $i in valo ($tietue, kU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (anto in $tietue.jatko) then
    choose $i in valo ($tietue, tO($tietue), nO($tietue));
    result $i.alku, $i - alku;

  elseif (apu in $tietue.jatko) then
    choose $i in valo ($tietue, pU($tietue), vU($tietue));
    result $i.alku, $i - alku;

 elseif (hanko in $tietue.jatko) then
    choose $i in valo ($tietue, kO($tietue), gO($tietue));
    result $i.alku, $i - alku;

 elseif (hattu in $tietue.jatko) then
    choose $i in valo ($tietue, tU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (hinku in $tietue.jatko) then
    choose $i in valo ($tietue, kU($tietue), gU($tietue));
    result $i.alku, $i - alku;

  elseif (hoppu in $tietue.jatko) then
    choose $i in valo ($tietue, pU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (kaarto in $tietue.jatko) then
    choose $i in valo ($tietue, tO($tietue), rO($tietue));
    result $i.alku, $i - alku;

  elseif (kippo in $tietue.jatko) then
    choose $i in valo ($tietue, pO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (koko in $tietue.jatko) then
   choose $i in koko ($tietue, kO($tietue), O($tietue), kO($tietue), zO($tietue));
    result $i.alku, $i - alku;

  elseif (kumpu in $tietue.jatko) then
    choose $i in valo ($tietue, pU($tietue), mU($tietue));
    result $i.alku, $i - alku;

  elseif (laatu in $tietue.jatko) then
    choose $i in valo ($tietue, tU($tietue), dU($tietue));
    result $i.alku, $i - alku;

 elseif (lepo in $tietue.jatko) then
    choose $i in valo ($tietue, pO($tietue), vO($tietue));
    result $i.alku, $i - alku;

  elseif (leuto in $tietue.jatko) then
    choose $i in valo ($tietue, tO($tietue), dO($tietue));
    result $i.alku, $i - alku;

  elseif (liitto in $tietue.jatko) then
    choose $i in valo ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (lintu in $tietue.jatko) then
    choose $i in valo ($tietue, tU($tietue), nU($tietue));
    result $i.alku, $i - alku;

  elseif (luku in $tietue.jatko) then
    choose $i in valo ($tietue, kU($tietue), vU($tietue));
    result $i.alku, $i - alku;

  elseif (ruoko in $tietue.jatko) then
    choose $i in valo ($tietue, kO($tietue), zO($tietue));
    result $i.alku, $i - alku;

  elseif (sampo in $tietue.jatko) then
    choose $i in valo ($tietue, pO($tietue), mO($tietue));
    result $i.alku, $i - alku;

  elseif (tiuku in $tietue.jatko) then
    choose $i in valo ($tietue, kU($tietue), zU($tietue));
    result $i.alku, $i - alku;

  elseif (verkko in $tietue.jatko) then
    choose $i in valo ($tietue, kO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (vihko in $tietue.jatko) then
    choose $i in valo ($tietue, kO($tietue), O($tietue));
    result $i.alku, $i - alku;


##########################################


  elseif (arvelu in $tietue.jatko) then
    choose $i in arvelu ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (avanto in $tietue.jatko) then
    choose $i in arvelu ($tietue, tO($tietue), nO($tietue));
    result $i.alku, $i - alku;


  elseif (alanko in $tietue.jatko) then
    choose $i in arvelu ($tietue, kO($tietue), gO($tietue));
    result $i.alku, $i - alku;

  elseif (hontelo in $tietue.jatko) then
    choose $i in hontelo ($tietue);
    result $i.alku, $i - alku;

  elseif (pihatto in $tietue.jatko) then
    choose $i in arvelu ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;


  elseif (raamattu in $tietue.jatko) then
    choose $i in arvelu ($tietue, tU($tietue), U($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (autio in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_autio ($tietue, "", [osanto_tA: ""]) +
                                monikko7 ("", "", "",
                                          [omanto_iT: "", omanto_in: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_ihin: ""],
                                          ""));
    result $i.alku, $i - alku;


#################################################


  elseif (laatikko in $tietue.jatko) then
    choose $i in laatikko ($tietue, kO($tietue), O($tietue), kO($tietue), O($tietue));
    result $i.alku, $i - alku;


#################################################


  elseif (risti in $tietue.jatko) then
    choose $i in risti ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (siisti in $tietue.jatko) then
    choose $i in siisti ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (takki in $tietue.jatko) then
    choose $i in risti ($tietue, "k", "");
    result $i.alku, $i - alku;


  elseif (renki in $tietue.jatko) then
    choose $i in risti ($tietue, "k", "g");
    result $i.alku, $i - alku;


  elseif (keppi in $tietue.jatko) then
    choose $i in risti ($tietue, "p", "");
    result $i.alku, $i - alku;


  elseif (hupi in $tietue.jatko) then
    choose $i in risti ($tietue, "p", "v");
    result $i.alku, $i - alku;


  elseif (vati in $tietue.jatko) then
    choose $i in risti ($tietue, "t", "d");
    result $i.alku, $i - alku;


  elseif (pelti in $tietue.jatko) then
    choose $i in risti ($tietue, "t", "l");
    result $i.alku, $i - alku;


  elseif (tunti in $tietue.jatko) then
    choose $i in risti ($tietue, "t", "n");
    result $i.alku, $i - alku;


  elseif (tatti in $tietue.jatko) then
    choose $i in risti ($tietue, "t", "");
    result $i.alku, $i - alku;


  elseif (kiiski in $tietue.jatko) then
     choose $i in kiiski ($tietue);
     result $i.alku, $i - alku;


#################################################3


  elseif ((paperi in $tietue.jatko) or
          (banaali in $tietue.jatko)) then
    choose $i in paperi_banaali ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (edam in $tietue.jatko) then
    choose $i in edam ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (hollanti in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "t", "n");
    result $i.alku, $i - alku;

  elseif (kajakki in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "k", "");
    result $i.alku, $i - alku;

  elseif (killinki in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "k", "g");
    result $i.alku, $i - alku;

  elseif (konvehti in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "t", "d");
    result $i.alku, $i - alku;

  elseif (salaatti in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "t", "");
    result $i.alku, $i - alku;

  elseif (sinappi in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "p", "");
    result $i.alku, $i - alku;



#################################################3


  elseif (kalsium in $tietue.jatko) then
    choose $i in kalsium ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (fan in $tietue.jatko) then
    choose $i in poppi ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (pop in $tietue.jatko) then
    choose $i in poppi ($tietue, "p", "");
    result $i.alku, $i - alku;

  elseif (punk in $tietue.jatko) then
    choose $i in poppi ($tietue, "k", "");
    result $i.alku, $i - alku;


##############################################


  elseif (lovi in $tietue.jatko) then
    choose $i in lovi ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (kaikki in $tietue.jatko) then
    choose $i in lovi ($tietue, "k", "");
    result $i.alku, $i - alku;

  elseif (piki in $tietue.jatko) then
    choose $i in piki ($tietue, "k", "", "k", "'");
    result $i.alku, $i - alku;

  elseif (kylki in $tietue.jatko) then
    choose $i in lovi ($tietue, "k", "j");
    result $i.alku, $i - alku;


  elseif (hanki in $tietue.jatko) then
    choose $i in lovi ($tietue, "k", "g");
    result $i.alku, $i - alku;


  elseif (jälki in $tietue.jatko) then
    choose $i in lovi ($tietue, "k", "j");
    result $i.alku, $i - alku;


  elseif (veli in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("je", "i", "je", "je",
                                         [osanto_A: "je"], sisätulento_Vn,
                                          "je", "i") +
                                [johdin_tOn:       "je",
                                 johdin_Us:        "je",
                                 johdin_lAinen:    "i",   # Ei veli+lainen.
                                 johdin_mAinen:    "i",
                                 johdin_inen:      "j"] +
                                monikko7 ("je", "j", "j",
                                          [omanto_ien: "j", omanto_en: "i"],
                                          [osanto_iA: "j"],
                                          [sisätulento_iin: "j"],
                                          "je"));
    result $i.alku, $i - alku;


  elseif (siipi in $tietue.jatko) then
    choose $i in lovi ($tietue, "p", "v");
    result $i.alku, $i - alku;


  elseif (sampi in $tietue.jatko) then
    choose $i in lovi ($tietue, "p", "m");
    result $i.alku, $i - alku;


  elseif (happi in $tietue.jatko) then
    choose $i in lovi ($tietue, "p", "");
    result $i.alku, $i - alku;


  elseif (lehti in $tietue.jatko) then
    choose $i in lovi ($tietue, "t", "d");
    result $i.alku, $i - alku;


  elseif (kumpi in $tietue.jatko) then
    choose $i in kumpi ($tietue, "p", "m", A($tietue));
    result $i.alku, $i - alku;


##############################################

  elseif (lampi in $tietue.jatko) then
    choose $i in lovi ($tietue, "p", "m") +
                 taivutuskaava ($tietue,
                                [omanto_n:        "mi",
                                 tulento_ksi:     "mi",
                                 sisäolento_ssA:  "mi",
                                 ulkopaikallissija_llA: "mi",
                                 vajanto_ttA:     "mi",
                                 kerronto_sti:    "mi",
                                 voittoaste:      "mi",
                                 johdin_tOn:      "mi",
                                 johdin_lAinen:   "pe",
                                 johdin_mAinen:   "pi",
                                 johdin_inen:     "mi",

                                 nimentö_t:        "mi",
                                 sija_monikko_1:     "me",
                                 ulkopaikallissija_illA: "me",
                                 vajanto_ittA:     "me",
                                 johdin_ittAin:    "me"]);
    result $i.alku, $i - alku;

  elseif (toholampi in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                [nimentö:         "pi",
                                 omanto_n:        "mi",
                                 tulento_ksi:     "mi",
                                 sisäolento_ssA:  "mi",
                                 ulkopaikallissija_llA: "mi",
                                 vajanto_ttA:     "mi",
                                 kerronto_sti:    "mi",
                                 johdin_lAinen:   "pi"]);
    result $i.alku, $i - alku;

##############################################


  elseif (nalle in $tietue.jatko) then
    choose $i in nalle ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (atte in $tietue.jatko) then
    choose $i in nalle ($tietue, "te", "e");
    result $i.alku, $i - alku;

  elseif (nukke in $tietue.jatko) then
    choose $i in nalle ($tietue, "ke", "e");
    result $i.alku, $i - alku;

  elseif (kolme in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("e", "e",
                                          "e", "e",
                                          [osanto_A: "e"],
                                          sisätulento_Vn,
                                          "e", "e") +
                                [johdin_tOn:      "e",
                                 johdin_Us:       "e"] +
# Ei tarvita johdosta johdin_inen. HV 13.5.2006. Eikä johdin_lAinen. HV 13.7.2006.
# Eikä johdin_mAinen. HV 24.7.2006.
                                monikko7 ("e", "", "",
                                          [omanto_en: "i",
                                           omanto_in: "e"],
                                          [osanto_iA: ""],
                                          [sisätulento_iin: ""],
                                          "e"));
    result $i.alku, $i - alku;
                                           
                                          
##############################################


  elseif (kala in $tietue.jatko) then
    choose $i in kala ($tietue, "", "", "e", "");
    result $i.alku, $i - alku;

  elseif (aika in $tietue.jatko) then
    choose $i in kala ($tietue, "ik", "j", "je", "");
    result $i.alku, $i - alku;

  elseif (aitta in $tietue.jatko) then
    choose $i in kala ($tietue, "t", "", "e", "");
    result $i.alku, $i - alku;

  elseif (liika in $tietue.jatko) then
    choose $i in kala ($tietue, "k", "", "e", "o");
    result $i.alku, $i - alku;
    
  elseif (haka in $tietue.jatko) then
    choose $i in kala ($tietue, "k", "", "e", "");
    result $i.alku, $i - alku;

  elseif (hanka in $tietue.jatko) then
    choose $i in kala ($tietue, "k", "g", "ge", "");
    result $i.alku, $i - alku;

  elseif (kampa in $tietue.jatko) then
    choose $i in kala ($tietue, "p", "m", "me", "m");
    result $i.alku, $i - alku;

  elseif (kanta in $tietue.jatko) then
    choose $i in kala ($tietue, "t", "n", "na", "n");
    result $i.alku, $i - alku;

  elseif (kappa in $tietue.jatko) then
    choose $i in kala ($tietue, "p", "", "e", "");
    result $i.alku, $i - alku;

  elseif (nahka in $tietue.jatko) then
    choose $i in kala ($tietue, "k", "", "e", "") +
                 taivutuskaava ($tietue,
                                [omanto_n:        kA($tietue),
                                 tulento_ksi:      kA($tietue),
                                 sisäolento_ssA:   kA($tietue),
                                 ulkopaikallissija_llA:  kA($tietue),
                                 vajanto_ttA:      kA($tietue),
                                 nimentö_t:        kA($tietue),
                                 sija_monikko_1:     kO($tietue),
                                 ulkopaikallissija_illA: kO($tietue),
                                 vajanto_ittA:     kO($tietue),
                                 johdin_ittAin:    kO($tietue)]);
    result $i.alku, $i - alku;

  elseif (napa in $tietue.jatko) then
    choose $i in kala ($tietue, "p", "v", "ve", "v");
    result $i.alku, $i - alku;

  elseif (pata in $tietue.jatko) then
    choose $i in kala ($tietue, "t", "d", "de", "d") +
                 taivutuskaava($tietue, [yliaste: "d" + O($tietue)]);
    result $i.alku, $i - alku;

  elseif (parta in $tietue.jatko) then
    choose $i in kala ($tietue, "t", "r", "re", "");
    result $i.alku, $i - alku;

  elseif (raaka in $tietue.jatko) then
    choose $i in raaka ($tietue, "k", "'", "k", "", "e", "");
    result $i.alku, $i - alku;

  elseif (valta in $tietue.jatko) then
    choose $i in kala ($tietue, "t", "l", "le", "l");
    result $i.alku, $i - alku;


#####################################################################


  elseif (koira in $tietue.jatko) then
    choose $i in koira ($tietue, "", "", "e");
    result $i.alku, $i - alku;

  elseif (hoikka in $tietue.jatko) then
    choose $i in koira ($tietue, "k", "", "e");
    result $i.alku, $i - alku;

  elseif (honka in $tietue.jatko) then
    choose $i in koira ($tietue, "k", "g", "ge");
    result $i.alku, $i - alku;

  elseif (huopa in $tietue.jatko) then
    choose $i in koira ($tietue, "p", "v", "ve");
    result $i.alku, $i - alku;

  elseif (ikä in $tietue.jatko) then
    choose $i in koira ($tietue, "k", "", "e");
    result $i.alku, $i - alku;

  elseif (juhta in $tietue.jatko) then 
    choose $i in koira ($tietue, "t", "d", "de");
    result $i.alku, $i - alku;

  elseif (kenttä in $tietue.jatko) then
    choose $i in koira ($tietue, "t", "", "e");
    result $i.alku, $i - alku;

  elseif (kompa in $tietue.jatko) then
    choose $i in koira ($tietue, "p", "m", "me");
    result $i.alku, $i - alku;

  elseif (kulta in $tietue.jatko) then 
    choose $i in koira ($tietue, "t", "l", "le");
    result $i.alku, $i - alku;

  elseif (poika in $tietue.jatko) then
    choose $i in koira ($tietue, "ik", "j", "je");
    result $i.alku, $i - alku;

  elseif (suunta in $tietue.jatko) then 
    choose $i in koira ($tietue, "t", "n", "ne");
    result $i.alku, $i - alku;

  elseif (tolppa in $tietue.jatko) then
    choose $i in koira ($tietue, "p", "", "e");
    result $i.alku, $i - alku;

  elseif (turta in $tietue.jatko) then 
    choose $i in koira ($tietue, "t", "r", "re");
    result $i.alku, $i - alku;

  elseif (ylkä in $tietue.jatko) then
    choose $i in koira ($tietue, "k", "j", "je");
    result $i.alku, $i - alku;

  elseif (pitkä in $tietue.jatko) then
    choose $i in pitkä ($tietue);
    result $i.alku, $i - alku;

  elseif (ruoka in $tietue.jatko) then
    choose $i in ruoka ($tietue);
    result $i.alku, $i - alku;


################################################################


  elseif (matala in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_autio ($tietue, A($tietue), [osanto_A: A($tietue)]) +
                                monikko7 (A($tietue), "", "",
                                          [omanto_ien: "",
                                           omanto_in:  A($tietue)],
                                          [osanto_iA:  ""],
                                          [sisätulento_iin: ""],
                                          "")) +
                 taivutuskaava ($tietue,
                                monikko6 (O($tietue), O($tietue),
                                          [omanto_iT:  O($tietue),
                                           omanto_jen: O($tietue)],
                                          [osanto_itA: O($tietue),
                                           osanto_jA:  O($tietue)],
                                          [sisätulento_ihin: O($tietue)], O($tietue)));
    result $i.alku, $i - alku;


  elseif (vihanta in $tietue.jatko) then
    choose $i in vihanta ($tietue, "t", "n");
    result $i.alku, $i - alku;


  elseif (mahorkka in $tietue.jatko) then
    choose $i in vihanta ($tietue, "k", "");
    result $i.alku, $i - alku;


########################################################


  elseif (asema in $tietue.jatko) then
    choose $i in asema ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (emäntä in $tietue.jatko) then
    choose $i in asema ($tietue, "t", "n");
    result $i.alku, $i - alku;


########################################################


  elseif (kulkija in $tietue.jatko) then
    if ($tietue.luokka = nimisana) then
      choose $i in kulkija ($tietue, A($tietue), O($tietue));
      result $i.alku, $i - alku;
    else
      # Erisnimi ei ole verbijohdos
      $tietue.alku := $tietue.alku + "j";
      choose $i in apila ($tietue, A($tietue), O($tietue));
      result $i.alku, $i - alku;
    end;

  elseif (apila in $tietue.jatko) then
    choose $i in apila ($tietue, A($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (video in $tietue.jatko) then
    choose $i in apila ($tietue, "", "");
    result $i.alku, $i - alku;


########################################################

  elseif (karahka in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_autio ($tietue, A($tietue), [osanto_A: A($tietue)]) +
                                monikko7 (A($tietue), O($tietue), O($tietue),
                                          [omanto_iT:  O($tietue),
                                           omanto_jen: O($tietue),
                                           omanto_in:  A($tietue)],
                                          [osanto_itA: O($tietue),
                                           osanto_jA:  O($tietue)],
                                          [sisätulento_ihin: O($tietue)],
                                          ""));
    result $i.alku, $i - alku;


##########################################################


  elseif (solakka in $tietue.jatko) then
    choose $i in solakka ($tietue, kA($tietue), A($tietue), kO($tietue), O($tietue));
    result $i.alku, $i - alku;


  elseif (ulappa in $tietue.jatko) then
    choose $i in solakka ($tietue, pA($tietue), A($tietue), pO($tietue), O($tietue));
    result $i.alku, $i - alku;


  elseif (savotta in $tietue.jatko) then
    choose $i in solakka ($tietue, tA($tietue), A($tietue), tO($tietue), O($tietue));
    result $i.alku, $i - alku;


  elseif (veranta in $tietue.jatko) then
    choose $i in veranta ($tietue);
    result $i.alku, $i - alku;


##########################################################


  elseif (kantaja in $tietue.jatko) then
    choose $i in kantaja ($tietue);
    result $i.alku, $i - alku;


  elseif (apaja in $tietue.jatko) then
    choose $i in apaja ($tietue);
    result $i.alku, $i - alku;


  elseif (peruna in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_autio ($tietue, A($tietue), [osanto_A: A($tietue)]) +
                                monikko7 (A($tietue), O($tietue), O($tietue),
                                          [omanto_iT:  O($tietue),
                                           omanto_jen: O($tietue),
                                           omanto_in:  A($tietue),
                                           omanto_ien: ""],
                                          [osanto_itA: O($tietue),
                                           osanto_jA:  O($tietue),
                                           osanto_iA:  ""],
                                          [sisätulento_ihin: O($tietue),
                                           sisätulento_iin:  ""],
                                          O($tietue)) +
                                [seuranto_ine: ""]);
    result $i.alku, $i - alku;


  elseif (opotta in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                               [tavuviiva:        tA($tietue),
                                omistusliite:     tA($tietue),
                                nimentö:          tA($tietue),
                                omanto_n:         A($tietue),
                                osanto_A:         tA($tietue),
                                osanto_tA:        tA($tietue),
                                olento_nA:        tA($tietue),
                                tulento_ksi:      A($tietue),
                                sisäolento_ssA:   A($tietue),
                                sisätulento_Vn:   tA($tietue),
                                ulkopaikallissija_llA:  A($tietue),
                                vajanto_ttA:      A($tietue),

                                johdin_tOn:       A($tietue),
                                johdin_inen:      A($tietue),
                                nimentö_t:        A($tietue),
                                omanto_iT:        O($tietue),
                                omanto_jen:       tO($tietue),
                                omanto_in:        tA($tietue),
                                omanto_ien:       "t",
                                osanto_itA:       O($tietue),
                                osanto_jA:        tO($tietue),
                                osanto_iA:        "t",
                                olento_inA:       tO($tietue),
                                sija_monikko_1:     O($tietue),
                                sisätulento_ihin: tO($tietue),
                                sisätulento_iin:  "t",
                                ulkopaikallissija_illA: O($tietue),
                                vajanto_ittA:     O($tietue),
                                seuranto_ine:     tO($tietue),
                                johdin_ittAin:    O($tietue)]
                                + yhdyssana (tA($tietue)));
    result $i.alku, $i - alku;


  elseif (ainoa in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 (A($tietue), A($tietue),
                                          A($tietue), A($tietue),
                                          [osanto_A: A($tietue),
                                           osanto_tA: A($tietue)],
                                          sisätulento_Vn,
                                          A($tietue), A($tietue)) +
                                [johdin_tOn:       A($tietue),
                                 johdin_Us:        "",
                                 johdin_inen:      A($tietue)] +
                                monikko7 (A($tietue), "", "",
                                          [omanto_iT: "",
                                           omanto_in: A($tietue)],
                                          [osanto_itA: ""],
                                          [sisätulento_isiin: "", sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;

  elseif (korkea in $tietue.jatko) then
    define $a := taivutuskaava ($tietue,
                                yksikkö8 (eA($tietue), eA($tietue),
                                          eA($tietue), eA($tietue),
                                          [osanto_A:  eA($tietue),
                                           osanto_tA: eA($tietue)],
                                          sisätulento_Vn,
                                          eA($tietue), eA($tietue)) +
                                [johdin_tOn:      eA($tietue),
                                 johdin_Us:       "e",
                                 johdin_inen:     eA($tietue)] +
                                monikko7 (eA($tietue), "e", "e",
                                          [omanto_iT:  "e",
                                           omanto_in:  eA($tietue)],
                                          [osanto_itA: "e"],
                                          [sisätulento_isiin: "e",
                                           sisätulento_ihin: "e"], "e"));

    choose $i in $a;
    result $i.alku, $i - alku;


  elseif (harteet in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                [johdin_tOn:     "e",
                                 johdin_inen:    ""] +
# Ei tarvita johdosta lAinen. HV 13.7.2006.
                                monikko7 ("e", "", "",
                                          [omanto_iT:  ""],
                                          [osanto_itA: ""],
                                          [sisätulento_isiin: "",
                                           sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


#######################################################


  elseif (suurempi in $tietue.jatko) then
    choose $i in <taivutus ($tietue, "", <voittoaste>, [])>;
    result $i.alku, $i - alku;


#######################################################


  elseif (vapaa in $tietue.jatko) then
    choose $i in vapaa ($tietue, A($tietue));
    result $i.alku, $i - alku;


#######################################################


  elseif (tienoo in $tietue.jatko) then
    choose $i in vapaa ($tietue, O($tietue));
    result $i.alku, $i - alku;


#######################################################


  elseif (leikkuu in $tietue.jatko) then
    choose $i in vapaa ($tietue, U($tietue));
    result $i.alku, $i - alku;


#######################################################


  elseif (kamee in $tietue.jatko) then
    choose $i in kamee ($tietue, "e");
    result $i.alku, $i - alku;

  elseif (tee in $tietue.jatko) then
    choose $i in tee ($tietue, "e");
    result $i.alku, $i - alku;

  elseif (nugaa in $tietue.jatko) then
    choose $i in kamee ($tietue, A($tietue));
    result $i.alku, $i - alku;

  elseif (trikoo in $tietue.jatko) then
    choose $i in kamee ($tietue, O($tietue));
    result $i.alku, $i - alku;


  elseif (revyy in $tietue.jatko) then
    choose $i in kamee ($tietue, U($tietue));
    result $i.alku, $i - alku;


#####################################################

  elseif (pii in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("i", "i", "i", "i",
                                          [osanto_tA: "i"],
                                          sisätulento_hVn,
                                          "i", "i") +
                                [johdin_tOn:       "i",
                                 johdin_lAinen:    "i",
                                 johdin_mAinen:    "i",
                                 johdin_inen:      ""] +
                                monikko7 ("i", "", "",
                                          [omanto_iT: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


##############################################################


  elseif (maa in $tietue.jatko) then
    choose $i in maa ($tietue, A($tietue));
    result $i.alku, $i - alku;


  elseif (puu in $tietue.jatko) then
    choose $i in maa ($tietue, U($tietue));
    result $i.alku, $i - alku;


  elseif (tiu in $tietue.jatko) then
    choose $i in tiu ($tietue, "");
    result $i.alku, $i - alku;


##############################################################


  elseif (suo in $tietue.jatko) then
    choose $i in suo ($tietue, UO($tietue), O($tietue));
    result $i.alku, $i - alku;


  elseif (tie in $tietue.jatko) then
    choose $i in suo ($tietue, "ie", "e");
    result $i.alku, $i - alku;


##############################################################


  elseif (bébé in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("", "", "", "",
                                          [osanto_tA: ""],
                                          sisätulento_hVn,
                                          "", "") +
                                [johdin_tOn:       "",
                                 johdin_mAinen:    "",
                                 johdin_inen:      ""] +
                                monikko7 ("", "", "",
                                          [omanto_iT: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_isiin: "",
                                           sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


##############################################################


  elseif (rosé in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("", "", "", "",
                                          [osanto_tA: ""],
                                          sisätulento_hVn,
                                          "", "") +
                                [johdin_tOn:      "",
                                 johdin_mAinen:   "",
                                 johdin_lAinen:   "",
                                 johdin_inen:     ""] +
                                monikko7 ("", "", "",
                                          [omanto_iT: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


  elseif (spray in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("", "", "", "",
                                          [osanto_tA: ""],
                                          sisätulento_hVn,
                                          "", "") +
                                [johdin_tOn:      "",
                                 johdin_mAinen:   "",
                                 johdin_lAinen:   "",
                                 johdin_inen:     ""] +
                                monikko7 ("", "", "",
                                          [omanto_iT: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


  elseif (parfait in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("'", "", "'", "'",
                                          [osanto_tA: "'"],
                                          sisätulento_hVn,
                                          "'", "") +
                                [johdin_tOn:      "'",
                                 johdin_inen:     "'",
				 liitesana:       "'"] +
                                monikko7 ("'", "'", "'",
                                          [omanto_iT: "'"],
                                          [osanto_itA: "'"],
                                          [sisätulento_ihin: "'"], "'"));
    result $i.alku, $i - alku;


  elseif (tuohi in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_tuohi ("e", "i") +
                                monikko7 ("e", "", "",
                                          [omanto_ien: "", omanto_ten: ""],
                                          [osanto_iA: ""],
                                          [sisätulento_iin: ""], ""));
    result $i.alku, $i - alku;

  elseif (lohi in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_tuohi ("e", "i") +
				monikko7 ("e", "", "",
				          [omanto_ien: ""],
					  [osanto_iA: ""],
					  [sisätulento_iin: ""], ""));
    result $i.alku, $i - alku;

  elseif (meri in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö_meri ("e", "i") +
                                monikko7 ("e", "", "",
                                          [omanto_ien: "", omanto_ten: ""],
                                          [osanto_iA: ""],
                                          [sisätulento_iin: ""], ""));
    result $i.alku, $i - alku;


  elseif (lahti in $tietue.jatko) then 
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("te", "ti", "te", "de",
                                          [osanto_A: "te"],
                                          sisätulento_Vn, "de", "di") +
                                [johdin_tOn:    "de",
                                 johdin_lAinen: "te",
                                 johdin_mAinen: "ti",
                                 johdin_inen:   "t"] +
                                monikko7 ("de", "t", "d",
                                          [omanto_ien: "t", omanto_in: "te"],
                                          [osanto_iA: "t"],
                                          [sisätulento_iin: "t"], "d"));
    result $i.alku, $i - alku;


  elseif (lumi in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("me", "mi", "me", "me",
                                          [osanto_tA: "n"],
                                          sisätulento_Vn, "me", "mi") +
                                [johdin_tOn:    "me",
                                 johdin_mAinen: "mi",
                                 johdin_inen:   "m"] +
                                monikko7 ("me", "m", "m",
                                          [omanto_ien: "m", omanto_ten: "n"],
                                          [osanto_iA: "m"],
                                          [sisätulento_iin: "m"], "m"));
    result $i.alku, $i - alku;


  elseif ((tuomi in $tietue.jatko) or
          (niemi in $tietue.jatko)) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("me", "mi", "me", "me",
                                          [osanto_A: "me", osanto_tA: "n"],
                                          sisätulento_Vn, "me", "mi") +
                                [johdin_tOn:    "me",
				 johdin_lAinen: "me",
                                 johdin_mAinen: "mi",
                                 johdin_inen:   "m"] +
                                monikko7 ("me", "m", "m",
                                          [omanto_ien: "m", omanto_ten: "n"],
                                          [osanto_iA: "m"],
                                          [sisätulento_iin: "m"], "m"));
    result $i.alku, $i - alku;


  elseif (pieni in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("e", "i", "e", "e",
                                          [osanto_tA: ""],
                                          sisätulento_Vn,
                                          "e", "i") +
                                [johdin_tOn:      "e",
                                 johdin_Us:       "e",
                                 johdin_mAinen:   "i",
                                 johdin_inen:     ""] +
                                monikko7 ("e", "", "",
                                          [omanto_ten: "", omanto_ien: ""],
                                          [osanto_iA: ""],
                                          [sisätulento_iin: ""], ""));

    result $i.alku, $i - alku;


  elseif (nuori in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("e", "i", "e", "e",
                                          [osanto_tA: ""],
                                          sisätulento_Vn,
                                          "e", "i") +
                                [johdin_tOn:       "e",
                                 johdin_UUs:       "",
                                 johdin_mAinen:    "i",
                                 johdin_inen:      ""] +
                                monikko7 ("e", "", "",
                                          [omanto_ien: "", omanto_ten: ""],
                                          [osanto_iA:  ""],
                                          [sisätulento_iin: ""], "")) +
                 taivutuskaava ($tietue, [olento_nA: ""]);  # Nuorna.
                 # Ei tunnista olentoa nuor+ra.
    result $i.alku, $i - alku;


#########################################


  elseif (susi in $tietue.jatko) then
    choose $i in tosi ($tietue)
                 + taivutuskaava ($tietue, [omanto_ten: "t"]);  # Sutten.
    result $i.alku, $i - alku;


#########################################


  elseif (tosi in $tietue.jatko) then
    choose $i in tosi ($tietue);
    result $i.alku, $i - alku;


#########################################


  elseif (hirsi in $tietue.jatko) then
    choose $i in kansi ($tietue, "t", "r", "s");
    result $i.alku, $i - alku;


  elseif (jälsi in $tietue.jatko) then
    choose $i in kansi ($tietue, "t", "l", "s");
    result $i.alku, $i - alku;


  elseif (kansi in $tietue.jatko) then
    choose $i in kansi ($tietue, "t", "n", "t");
    result $i.alku, $i - alku;


#########################################


  elseif (lapsi in $tietue.jatko) then
    choose $i in lapsi ($tietue)
                 + taivutuskaava ($tietue, [osanto_tA: "s"]);  # Lasta.
    result $i.alku, $i - alku;


#########################################


  elseif (hapsi in $tietue.jatko) then
    choose $i in lapsi ($tietue)
                 + taivutuskaava ($tietue, [osanto_A: "pse"]);  # Hapsea.
    result $i.alku, $i - alku;


  elseif (veitsi in $tietue.jatko) then
    choose $i in veitsi ($tietue);
    result $i.alku, $i - alku;


  elseif (suksi in $tietue.jatko) then
    choose $i in lovi ($tietue, "ks", "ks");
    result $i.alku, $i - alku;


  elseif (uksi in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("kse", "ksi", "kse", "kse",
                                          [osanto_A:  "kse"],
                                          sisätulento_Vn,
                                          "kse", "ksi") +
                                [johdin_tOn:      "kse",
                                 johdin_mAinen:   "ksi",
                                 johdin_inen:     "ks"] +
                                monikko7 ("kse", "ks", "ks",
                                          [omanto_en: "ksi"],
                                          [osanto_iA: "ks"],
                                          [sisätulento_iin: "ks"], "ks"));
    result $i.alku, $i - alku;


  elseif (kaksi in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("hte", "ksi", "hte", "hde",
                                          [osanto_tA: "h"], sisätulento_Vn,
                                          "hde", "ksi") +
                                [johdin_tOn:      "hde",
                                 johdin_mAinen:   "ksi",
                                 johdin_inen:     "ks"] +
                                monikko7 ("hde", "ks", "ks",
                                          [omanto_ien: "ks"],
                                          [osanto_iA: "ks"],
                                          [sisätulento_iin: "ks"], "ks"));
    result $i.alku, $i - alku;


  elseif (sankari in $tietue.jatko) then
    choose $i in paperi_banaali ($tietue, "", "")
                 + taivutuskaava ($tietue, [omanto_ten: ""]);  # Sankarten.
    result $i.alku, $i - alku;


  elseif (jumala in $tietue.jatko) then
    choose $i in koira ($tietue, "", "", "e") +
                 taivutuskaava ($tietue, [omanto_ten: ""]);  # Jumalten.
    result $i.alku, $i - alku;


##########################################################


  elseif (sisar in $tietue.jatko) then
    choose $i in sisar ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (tytär in $tietue.jatko) then
    choose $i in sisar ($tietue, tAr($tietue), Ar($tietue));
    result $i.alku, $i - alku;


##########################################################


  elseif (ien in $tietue.jatko) then
    choose $i in ahven ($tietue, "ken", "en");
    result $i.alku, $i - alku;


##########################################################


  elseif (uistin in $tietue.jatko) then
    choose $i in uistin ($tietue, "m", "n");
    result $i.alku, $i - alku;

  elseif (hapan in $tietue.jatko) then
    choose $i in hapan ($tietue, "pam", "an");
    result $i.alku, $i - alku;

  elseif (kaadin in $tietue.jatko) then
    choose $i in uistin ($tietue, "tim", "din");
    result $i.alku, $i - alku;

  elseif (kaavin in $tietue.jatko) then
    choose $i in uistin ($tietue, "pim", "vin");
    result $i.alku, $i - alku;

  elseif (kerroin in $tietue.jatko) then
    choose $i in uistin ($tietue, "toim", "roin");
    result $i.alku, $i - alku;

  elseif (kiharrin in $tietue.jatko) then
    choose $i in uistin ($tietue, "tim", "rin");
    result $i.alku, $i - alku;

  elseif (laidun in $tietue.jatko) then
    choose $i in uistin ($tietue, "tum", "dun");
    result $i.alku, $i - alku;

  elseif (poljin in $tietue.jatko) then
    choose $i in uistin ($tietue, "kim", "jin");
    result $i.alku, $i - alku;

  elseif (puin in $tietue.jatko) then
    choose $i in uistin ($tietue, "kim", "in");
    result $i.alku, $i - alku;

  elseif (sivellin in $tietue.jatko) then
    choose $i in uistin ($tietue, "tim", "lin");
    result $i.alku, $i - alku;

  elseif (suodatin in $tietue.jatko) then
    choose $i in uistin ($tietue, "tim", "in");
    result $i.alku, $i - alku;

  elseif (vaimennin in $tietue.jatko) then
    choose $i in uistin ($tietue, "tim", "nin");
    result $i.alku, $i - alku;


##########################################################


  elseif (onneton in $tietue.jatko) then
    choose $i in onneton ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;


  elseif (alaston in $tietue.jatko) then
    choose $i in onneton ($tietue, O($tietue), O($tietue));
    result $i.alku, $i - alku;


##########################################################


  elseif (lämmin in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("pimä", "min", "pimä", "pimä",
                                          [osanto_tA: "min"],
                                          sisätulento_Vn,
                                          "pimä", "min") +
                                [johdin_UUs:       "pim"] +
                                monikko7 ("pimä", "pim", "pim",
                                          [omanto_ien: "pim", omanto_in: "pimä"],
                                          [osanto_iA: "pim"],
                                          [sisätulento_iin: "pim"], "pim"));
    result $i.alku, $i - alku;


  elseif (pahin in $tietue.jatko) then
    choose $i in <taivutus ($tietue, "", <yliaste>, [])>
                 + taivutuskaava ($tietue, [olento_nA: "in"]);
    result $i.alku, $i - alku;


  elseif (vasen in $tietue.jatko) then
    #
    # Koska vasen on ainoa sana, joka taipuu tällä tavalla,
    # ei tarvitsen kirjoittaa "mp" + A($tietue) eikä "mm" + A($tietue).
    #
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("mpa", "n", "mpa", "mma",
                                          [osanto_A: "mpa", osanto_tA: "n"],
                                          sisätulento_Vn, "mma", "n") +
                                monikko7 ("mma", "mp", "mm",
                                          [omanto_ien: "mp", omanto_ten: "n", omanto_in: "mpa"],
                                          [osanto_iA: "mp"],
                                          [sisätulento_iin: "mp"], "mm"));
    result $i.alku, $i - alku;


#  elseif (muuan in $tietue.jatko) then
# Muu(d)an-sana taipuu kuten muutama, paitsi että osannolla ja omannolla
# on myös muodot muu(d)a+tta ja muu(d)an+na, jotka ovat sanastossa.


  elseif (seitsemän in $tietue.jatko) then 
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 (A($tietue), An($tietue),
                                          A($tietue), A($tietue),
                                          [osanto_A: A($tietue)],
                                          sisätulento_Vn,
                                          A($tietue), An($tietue)) +
                                monikko7 (A($tietue), "", "",
                                          [omanto_ien: ""],
                                          [osanto_iA: ""],
                                          [sisätulento_iin: ""], ""));
    result $i.alku, $i - alku;


  elseif (nainen in $tietue.jatko) then
    choose $i in nainen ($tietue);
    result $i.alku, $i - alku;


  elseif (vastaus in $tietue.jatko) then
    choose $i in vastaus ($tietue);
    result $i.alku, $i - alku;


####################################################


  elseif (kalleus in $tietue.jatko) then
    choose $i in kalleus ($tietue);
    result $i.alku, $i - alku;


####################################################


  elseif (vieras in $tietue.jatko) then
    choose $i in vieras ($tietue, A($tietue), "s", "", "");
    result $i.alku, $i - alku;


  elseif (antelias in $tietue.jatko) then
    choose $i in vieras ($tietue, A($tietue), "s", "", "is" + U($tietue));
    result $i.alku, $i - alku;


  elseif (autuas in $tietue.jatko) then
    choose $i in vieras ($tietue, AA($tietue), As($tietue), A($tietue), "");
    result $i.alku, $i - alku;


  elseif (laupias in $tietue.jatko) then
    choose $i in vieras ($tietue, "i" + AA($tietue), "i" + As($tietue),
                         "i" + A($tietue), "e");
    result $i.alku, $i - alku;


  elseif (harras in $tietue.jatko) then
    choose $i in vieras ($tietue, tAA($tietue), rAs($tietue), tA($tietue), tA($tietue));
    result $i.alku, $i - alku;


  elseif (ahdas in $tietue.jatko) then
    choose $i in vieras ($tietue, tAA($tietue), dAs($tietue), tA($tietue), tA($tietue));
    result $i.alku, $i - alku;


  elseif (avokas in $tietue.jatko) then
    choose $i in vieras ($tietue, kAA($tietue), As($tietue), kA($tietue), kU($tietue));
    result $i.alku, $i - alku;


  elseif (asiakas in $tietue.jatko) then
    assert ($tietue.luokka = nimisana);
    choose $i in vieras ($tietue, kAA($tietue), As($tietue), kA($tietue), kU($tietue))
                 + sana_Us ($tietue);
    result $i.alku, $i - alku;


  elseif (vilkas in $tietue.jatko) then
    choose $i in vieras ($tietue, kAA($tietue), As($tietue), kA($tietue), kA($tietue));
    result $i.alku, $i - alku;


  elseif (iäkäs in $tietue.jatko) then
    choose $i in vieras ($tietue, kAA($tietue), As($tietue), kA($tietue), kU($tietue));
    result $i.alku, $i - alku;


  elseif (allas in $tietue.jatko) then
    choose $i in vieras ($tietue, tAA($tietue), lAs($tietue), tA($tietue), tA($tietue));
    result $i.alku, $i - alku;


  elseif (hammas in $tietue.jatko) then
    choose $i in vieras ($tietue, pAA($tietue), mAs($tietue), pA($tietue), pA($tietue));
    result $i.alku, $i - alku;


  elseif (kinnas in $tietue.jatko) then
    choose $i in vieras ($tietue, tAA($tietue), nAs($tietue), tA($tietue), tA($tietue));
    result $i.alku, $i - alku;


  elseif (varas in $tietue.jatko) then
    choose $i in vieras ($tietue, kAA($tietue), As($tietue), kA($tietue), kA($tietue));
    result $i.alku, $i - alku;


  elseif (saapas in $tietue.jatko) then
    choose $i in vieras ($tietue, pAA($tietue), As($tietue), pA($tietue), pA($tietue));
    result $i.alku, $i - alku;


  elseif (ratas in $tietue.jatko) then
    choose $i in vieras ($tietue, tAA($tietue), As($tietue), tA($tietue), tA($tietue));
    result $i.alku, $i - alku;


  elseif (varvas in $tietue.jatko) then
    choose $i in vieras ($tietue, pAA($tietue), vAs($tietue), pA($tietue), pA($tietue));
    result $i.alku, $i - alku;


  elseif (kangas in $tietue.jatko) then
    choose $i in vieras ($tietue, kAA($tietue), gAs($tietue), kA($tietue), kA($tietue));
    result $i.alku, $i - alku;


  elseif (paras in $tietue.jatko) then
    choose $i in paras ($tietue, hAA($tietue), As($tietue),
                        hA($tietue), "e", hA($tietue));
    result $i.alku, $i - alku;


####################################################


  elseif (kirves in $tietue.jatko) then
    choose $i in vieras ($tietue, "e", "s", "", "e");
    result $i.alku, $i - alku;


  elseif (ies in $tietue.jatko) then
    choose $i in vieras ($tietue, "kee", "es", "ke", "ke");
    result $i.alku, $i - alku;


####################################################


  elseif (kauris in $tietue.jatko) then
    choose $i in kauris ($tietue, "");
    result $i.alku, $i - alku;


  elseif (ruis in $tietue.jatko) then
    choose $i in kauris ($tietue, "k");
    result $i.alku, $i - alku;


####################################################


  elseif (kaunis in $tietue.jatko) then
    choose $i in kaunis ($tietue, "", "e");
    result $i.alku, $i - alku;


  elseif (valmis in $tietue.jatko) then
    choose $i in kaunis ($tietue, "", "i");
    result $i.alku, $i - alku;


  elseif (altis in $tietue.jatko) then
    choose $i in kaunis ($tietue, "t", "ti");
    result $i.alku, $i - alku;


####################################################


  elseif (koiras in $tietue.jatko) then
    choose $i in vastaus ($tietue)
                 + s_V_loppuinen ($tietue, A($tietue), "")
                 + s_hV_loppuinen ($tietue, hA($tietue), "h");
    result $i.alku, $i - alku;


####################################################


  elseif (mies in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("he", "s", "he", "he",
                                          [osanto_tA: "s"], sisätulento_Vn,
                                          "he", "s") +
                                [johdin_tOn:      "he",
                                 johdin_UUs:      "h",    # Miehyys. Miehuus on pantava sanakirjaan.
                                 johdin_Us:       "he",   # Mieheys.
                                 johdin_mAinen:   "s"] +
                                monikko7 ("he", "h", "h",
                                          [omanto_ten: "s", omanto_ien: "h"],
                                          [osanto_iA: "h"],
                                          [sisätulento_iin: "h"], "h"));
    result $i.alku, $i - alku;


  elseif (airut in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("e", "t", "e", "e",
                                          [osanto_ttA: ""], sisätulento_Vn,
                                          "e","t") +
                                [johdin_tOn:      "e",
                                 johdin_Us:       "",
                                 johdin_mAinen:   "t",
                                 johdin_inen:     "e"] +
                                monikko7 ("e", "", "",
                                          [omanto_iT: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_isiin: "",
                                           sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


  elseif (kevät in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 (A($tietue), "t",
                                          A($tietue), A($tietue),
                                          [osanto_ttA: ""],
                                          sisätulento_seen,
                                          A($tietue), "t") +
                                [johdin_tOn:       A($tietue),
                                 johdin_mAinen:    "t",
                                 johdin_inen:      ""] +
                                monikko7 (A($tietue), "", "",
                                          [omanto_iT: ""],
                                          [osanto_itA: ""],
                                          [sisätulento_isiin: "",
                                           sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


  elseif (kahdeksas in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("nte", "s", "nte", "nne",
                                          [osanto_ttA: ""], sisätulento_Vn,
                                          "nne", "s") +
                                [nimentö_t: "nne",
                                 omanto_ien: "ns",
                                 osanto_iA: "ns",
                                 olento_inA: "ns",
                                 sija_monikko_1: "ns",
                                 sisätulento_iin: "ns",
                                 ulkopaikallissija_illA: "ns",
                                 vajanto_ittA: "ns",
                                 seuranto_ine: "ns"]);
    result $i.alku, $i - alku;


  elseif (tuhat in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("nte", "t", "nte", "nne",
                                          [osanto_ttA: ""], sisätulento_Vn,
                                          "nne", "t") +
                                monikko7 ("nne", "ns", "ns",
                                          [omanto_ien: "ns"],
                                          [osanto_iA: "ns"],
                                          [sisätulento_iin: "ns"], "ns"));
    result $i.alku, $i - alku;


  elseif (kuollut in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("ee", Ut($tietue), "ee", "ee",
                                          [osanto_tA: Ut($tietue)],
                                          sisätulento_seen,
                                          "ee", Ut($tietue)) +
                                [johdin_tOn:       "ee",
                                 johdin_Us:        "e",    # Kuolleus.
                                 johdin_inen:      "e"] +  # Kuolleinen.
                                monikko7 ("ee", "e", "e",
                                          [omanto_iT: "e"],
                                          [osanto_itA: "e"],
                                          [sisätulento_isiin: "e", sisätulento_ihin: "e"],
                                          "e"));
    result $i.alku, $i - alku;


######################################################


  elseif (hame in $tietue.jatko) then
    choose $i in hame ($tietue, "", "e", "");
    result $i.alku, $i - alku;

  elseif (alkeet in $tietue.jatko) then
    choose $i in alkeet ($tietue);
    result $i.alku, $i - alku;

  elseif (enne in $tietue.jatko) then
    choose $i in hame ($tietue, "ne", "tee", "te");
    result $i.alku, $i - alku;

  elseif (helle in $tietue.jatko) then
    choose $i in hame ($tietue, "le", "tee", "te");
    result $i.alku, $i - alku;

  elseif (kierre in $tietue.jatko) then
    choose $i in hame ($tietue, "re", "tee", "te");
    result $i.alku, $i - alku;

  elseif (lahje in $tietue.jatko) then
    choose $i in hame ($tietue, "je", "kee", "ke");
    result $i.alku, $i - alku;

  elseif (lape in $tietue.jatko) then
    choose $i in hame ($tietue, "e", "pee", "pe");
    result $i.alku, $i - alku;

  elseif (lumme in $tietue.jatko) then
    choose $i in hame ($tietue, "me", "pee", "pe");
    result $i.alku, $i - alku;

  elseif (sade in $tietue.jatko) then
    choose $i in hame ($tietue, "de", "tee", "te");
    result $i.alku, $i - alku;

  elseif (taive in $tietue.jatko) then
    choose $i in hame ($tietue, "ve", "pee", "pe");
    result $i.alku, $i - alku;

  elseif (tarvike in $tietue.jatko) then
    choose $i in hame ($tietue, "e", "kee", "ke");
    result $i.alku, $i - alku;

  elseif (vaate in $tietue.jatko) then
    choose $i in hame ($tietue, "e", "tee", "te");
    result $i.alku, $i - alku;

  elseif (viive in $tietue.jatko) then
    choose $i in hame ($tietue, "ve", "vee", "ve")
                 + taivutuskaava ($tietue,
                                  [omistusliite: "pee",
                                   omanto_n: "pee",
                                   olento_nA: "pee",
                                   tulento_ksi: "pee",
                                   sisäolento_ssA: "pee",
                                   sisätulento_seen: "pee",
                                   ulkopaikallissija_llA: "pee",
                                   vajanto_ttA: "pee",
                                   johdin_tOn: "pee",
                                   johdin_inen: "pe",

                                   nimentö_t: "pee",
                                   omanto_iT: "pe",
                                   osanto_itA: "pe",
                                   olento_inA: "pe",
                                   sija_monikko_1: "pe",
                                   sisätulento_ihin: "pe",
                                   sisätulento_isiin: "pe",
                                   ulkopaikallissija_illA: "pe",
                                   vajanto_ittA: "pe",
                                   seuranto_ine: "pe"]);
    result $i.alku, $i - alku;

######################################################


  elseif (terve in $tietue.jatko) then
    choose $i in hame ($tietue, "", "e", "");
    result $i.alku, $i - alku;


  elseif (ori in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("i", "", "i", "i",
                                          [osanto_ttA: ""], sisätulento_seen,
                                          "i", "") +
                                [johdin_tOn:       "i",
                                 johdin_mAinen:    "",
                                 johdin_inen:      "i"] +
                                monikko7 ("", "", "",
                                          [omanto_iT:  "", omanto_ten: "t"],
                                          [osanto_itA: ""],
                                          [sisätulento_isiin: "",
                                           sisätulento_ihin: ""], "")) +
                 taivutuskaava ($tietue,
                                [omanto_n:          "hi",
                                 olento_nA:         "hi",
                                 omanto_en:         "hi",
                                 omanto_ten:        "hit",
                                 osanto_itA:        "h"]);
                 # Ei tunnista monikon sisätulentoa orihisin.
    result $i.alku, $i - alku;


###########################################################3


  elseif (kiiru in $tietue.jatko) then
    choose $i in hame ($tietue, "", U($tietue), "");
    result $i.alku, $i - alku;


###########################################################3


  elseif (askel in $tietue.jatko) then
    choose $i in taival ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (auer in $tietue.jatko) then
    choose $i in taival ($tietue, "ter", "er");
    result $i.alku, $i - alku;

  elseif (kannel in $tietue.jatko) then
    choose $i in taival ($tietue, "tel", "nel");
    result $i.alku, $i - alku;

  elseif (kinner in $tietue.jatko) then
    choose $i in taival ($tietue, "ter", "ner");
    result $i.alku, $i - alku;

  elseif (ommel in $tietue.jatko) then
    choose $i in taival ($tietue, "pel", "mel");
    result $i.alku, $i - alku;

  elseif (penger in $tietue.jatko) then
    choose $i in taival ($tietue, "ker", "ger");
    result $i.alku, $i - alku;

  elseif (piennar in $tietue.jatko) then
    choose $i in taival ($tietue, "tar", "nar");
    result $i.alku, $i - alku;

  elseif (taival in $tietue.jatko) then
    choose $i in taival ($tietue, "pal", "val");
    result $i.alku, $i - alku;

  elseif (säen in $tietue.jatko) then
    choose $i in taival ($tietue, "ken", "en");
    result $i.alku, $i - alku;

  elseif (udar in $tietue.jatko) then
    choose $i in taival ($tietue, "tar", "dar");
    result $i.alku, $i - alku;

##############################################


#  elseif (isoäiti in $tietue.jatko) then
#  elseif (nuoripari in $tietue.jatko) then


  elseif (minä in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                [omanto_n:         "u",
                                 kohdanto_t:       "u",
                                 osanto_A:         "u",
                                 olento_nA:        "u",
                                 tulento_ksi:      "u",
                                 sisäolento_ssA:   "u",
                                 sisätulento_Vn:   "u",
                                 ulkopaikallissija_llA:  "u"])
                 + <taivutus ($tietue, "ä", <liitesana, loppu>, [äs: ä])>;
    result $i.alku, $i - alku;


  elseif (hän in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                [nimentö:         "",
                                 omanto_n:        "e",
                                 kohdanto_t:      "e",
                                 osanto_tA:       "",
                                 olento_nA:       "e",
                                 tulento_ksi:     "e",
                                 sisäolento_ssA:  "e",
                                 sisätulento_Vn:  "e",
                                 ulkopaikallissija_llA: "e"]);
    result $i.alku, $i - alku;


  elseif (me in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                [nimentö: "",
                                 omanto_idän: "",
                                 kohdanto_idät: "",
                                 osanto_itA: "",
                                 olento_inA: "",
                                 sija_monikko_1: "",
                                 sisätulento_ihin: "",
                                 ulkopaikallissija_illA: ""]);
    result $i.alku, $i - alku;


  elseif (joka in $tietue.jatko) then 
    choose $i in taivutuskaava ($tietue,
                                [nimentö:          "ka",
                                 omanto_nkA:       "",
                                 osanto_tA:        "",
                                 olento_nA:        "",
                                 tulento_ksi:      "",
                                 sisäolento_ssA:   "",
                                 sisätulento_hVn:  "",
                                 sisätulento_nne:  "",
                                 ulkopaikallissija_llA:  ""] +
                                monikko7 ([nimentö_tkA: ""], "", "",
                                          [omanto_iT:   ""],
                                          [osanto_itA:  ""],
                                          [sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


  elseif (kymmenen in $tietue.jatko) then 
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("e", "en", "e", "e",
                                          [osanto_tA: ""], sisätulento_Vn,
                                          "e", "") +
                                monikko7 ("e", "", "",
                                          [omanto_ien: "", omanto_ten: ""],
                                          [osanto_iA: ""],
                                          [sisätulento_iin: ""], ""));
    result $i.alku, $i - alku;


  elseif (yö_yksikkö in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                yksikkö8 ("", "", "", "", [osanto_tA: ""],
                                          sisätulento_hVn, "", "") +
                                [nimentö_t:       "",
                                 johdin_tOn:      ""]);
    result $i.alku, $i - alku;


  elseif (yö_monikko in $tietue.jatko) then
    choose $i in taivutuskaava ($tietue,
                                [johdin_inen: ""] +
                                monikko6 ("", "",
                                          [omanto_iT:  ""],
                                          [osanto_itA: ""],
                                          [sisätulento_ihin: ""], ""));
    result $i.alku, $i - alku;


##%%%%%%%################

  elseif (loitolla in $tietue.jatko) then 
    choose $i in taivutuskaava ($tietue,
                                 [ulkopaikallissija_llA: ""])
                 + sivumpana ($tietue, "m" + pA($tietue), "m" + mA($tietue));
    result $i.alku, $i - alku;


  elseif (sivumpana in $tietue.jatko) then 
    choose $i in sivumpana ($tietue, pA($tietue), mA($tietue));
    result $i.alku, $i - alku;

  elseif (keväämmällä in $tietue.jatko) then 
    choose $i in keväämmällä ($tietue, pA($tietue), mA($tietue));
    result $i.alku, $i - alku;

    
######################################


# Teonsanat.

  elseif (punoa in $tietue.jatko) then 
    choose $i in punoa ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (aikoa in $tietue.jatko) then
    choose $i in punoa ($tietue, kO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (ampua in $tietue.jatko) then
    choose $i in punoa_punottaa ($tietue, pU($tietue), mU($tietue));
    result $i.alku, $i - alku;

  elseif (asettua in $tietue.jatko) then
    choose $i in punoa ($tietue, tU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (harppoa in $tietue.jatko) then
    choose $i in punoa ($tietue, pO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (jakaantua in $tietue.jatko) then
    choose $i in punoa ($tietue, tU($tietue), nU($tietue));
    result $i.alku, $i - alku;

  elseif (kaatua in $tietue.jatko) then
    choose $i in punoa ($tietue, tU($tietue), dU($tietue));
    result $i.alku, $i - alku;

  elseif (kertoa in $tietue.jatko) then
    choose $i in punoa ($tietue, tO($tietue), rO($tietue));
    result $i.alku, $i - alku;

  elseif (kiekua in $tietue.jatko) then
    choose $i in punoa ($tietue, kU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (kieppua in $tietue.jatko) then
    choose $i in punoa ($tietue, pU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (kumartua in $tietue.jatko) then
    choose $i in punoa ($tietue, tU($tietue), rU($tietue));
    result $i.alku, $i - alku;

  elseif (leipoa in $tietue.jatko) then
    choose $i in punoa ($tietue, pO($tietue), vO($tietue));
    result $i.alku, $i - alku;

  elseif (liukua in $tietue.jatko) then
    choose $i in punoa ($tietue, kU($tietue), zU($tietue));
    result $i.alku, $i - alku;

  elseif (mankua in $tietue.jatko) then
    choose $i in punoa ($tietue, kU($tietue), gU($tietue));
    result $i.alku, $i - alku;

  elseif (paleltua in $tietue.jatko) then
    choose $i in punoa ($tietue, tU($tietue), lU($tietue));
    result $i.alku, $i - alku;

  elseif (penkoa in $tietue.jatko) then
    choose $i in punoa ($tietue, kO($tietue), gO($tietue));
    result $i.alku, $i - alku;

  elseif (saapua in $tietue.jatko) then
    choose $i in punoa ($tietue, pU($tietue), vU($tietue));
    result $i.alku, $i - alku;

  elseif (tahtoa in $tietue.jatko) then
    choose $i in punoa ($tietue, tO($tietue), dO($tietue));
    result $i.alku, $i - alku;

  elseif (tempoa in $tietue.jatko) then
    choose $i in punoa ($tietue, pO($tietue), mO($tietue));
    result $i.alku, $i - alku;

  elseif (viittoa in $tietue.jatko) then
    choose $i in punoa ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (muistaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, A($tietue), A($tietue), "", "")
                 + muisto ($tietue)
                 + muistua ($tietue);
    result $i.alku, $i - alku;

  elseif (aavistaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, A($tietue), A($tietue), "", "")
                 + aavistus ($tietue);
    result $i.alku, $i - alku;

  elseif (alittaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "")
                 + taivutuskaava ($tietue, [johdin_Us_ksen: ""]);
    result $i.alku, $i - alku;

  elseif (astahtaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), dA($tietue), "t", "d")
                 + taivutuskaava ($tietue, [johdin_Us_ksen: "d"]);  # Astahdus.
    result $i.alku, $i - alku;

  elseif (autioittaa in $tietue.jatko) then
    choose $i in muistaa ($tietue, tA($tietue), A($tietue), "t", "");
    result $i.alku, $i - alku;

  elseif (heittää in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "")
                 + heitto ($tietue)
                 + taivutuskaava ($tietue, [johdin_ntA: A($tietue)]); # Heitäntä.
    result $i.alku, $i - alku;

  elseif (hidastaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, A($tietue), A($tietue), "", "")
                 + aavistus ($tietue)   # Hidastus.
                 + muistua ($tietue);   # Hidastua.
    result $i.alku, $i - alku;

  elseif (hohtaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), dA($tietue), "t", "d")
                 + hohto ($tietue)
                 + hohdattaa ($tietue, "t", "d");
    result $i.alku, $i - alku;

  elseif (jättää in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "")
                 + heitto ($tietue)
		 + hohdattaa ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (inttää in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "");
    result $i.alku, $i - alku;

  elseif (itää in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), dA($tietue), "t", "d");
    result $i.alku, $i - alku;
  
  elseif (hujahtaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, "h" + tA($tietue), "h" + dA($tietue), "ht", "hd")
                 + taivutuskaava ($tietue, [johdin_Us_ksen: "hd"])  # Hujahdus.
                 + punottaa ($tietue, U($tietue));  # Hujauttaa.
    result $i.alku, $i - alku;

  elseif (kirjoittaa in $tietue.jatko) then
      choose $i in muistaa ($tietue, "it" + tA($tietue), "i" + tA($tietue), "itt", "it") +
                   taivutuskaava ($tietue, [johdin_Us_ksen: "it"]) +  # Kirjoitus.
                   kirjoittautua ($tietue, "itt") +      # Kirjoittautua.
                   kirjoitella ($tietue, "it");          # Kirjoitella.
      result $i.alku, $i - alku;

  elseif (ammottaa in $tietue.jatko) then
      choose $i in muistaa ($tietue, "t"  + tA($tietue), tA($tietue), "tt",  "t") +
                   taivutuskaava ($tietue, [johdin_Us_ksen: "t"]) +   # Ammotus.
                   kirjoittautua ($tietue, "tt") +   # Ammottautua.
                   kirjoitella ($tietue, "t");       # Ammotella.
      result $i.alku, $i - alku;

  elseif (kyntää in $tietue.jatko) then
    choose $i in muistaa ($tietue, tA($tietue), nA($tietue), "t", "n");
    result $i.alku, $i - alku;
  
  elseif (kulahtaa in $tietue.jatko) then
    choose $i in muistaa ($tietue, tA($tietue), dA($tietue), "t", "d");
    result $i.alku, $i - alku;

  elseif (loistaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, A($tietue), A($tietue), "", "")
                 + muisto ($tietue);
    result $i.alku, $i - alku;

  # Longertaa-sanan frekvenssi on 10, joten se ei tule mukaan Voikon sanastoon,
  # mutta lisätään tämä siltä varalta, että frekvenssiä muutetaan.
  #
  elseif (longertaa in $tietue.jatko) then
    choose $i in muistaa_muistella ($tietue, tA($tietue), rA($tietue), "t", "r")
                 + taivutuskaava ($tietue, [johdin_Us_ksen: "r"]);
    result $i.alku, $i - alku;

  elseif (purkaa in $tietue.jatko) then
    choose $i in muistaa ($tietue, kA($tietue), A($tietue), "k", "");
    result $i.alku, $i - alku;

  elseif (sulaa in $tietue.jatko) then
    choose $i in muistaa ($tietue, A($tietue), A($tietue), "", "");
    result $i.alku, $i - alku;


######################################


  elseif (huutaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "d") + muistella ($tietue, "t", "d");
    result $i.alku, $i - alku;

  elseif (alentaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "n") + muistella ($tietue, "t", "n");
    result $i.alku, $i - alku;

  elseif (soutaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "d")
                 + tositavan_kertoma($tietue, "t", "d") # Souti
                 + muistella ($tietue, "t", "d");  # Soudella.
    result $i.alku, $i - alku;


  elseif (vuotaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "d");
    result $i.alku, $i - alku;


######################################


  elseif (puoltaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "l");
    result $i.alku, $i - alku;

  elseif (juurtaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "r");
    result $i.alku, $i - alku;

  elseif (saksantaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "n");
    result $i.alku, $i - alku;

  elseif (sukeltaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "l")
                 + sana_Vs ($tietue, lU($tietue))   # Sukellus.
                 + muistella ($tietue, "t", "l");   # Sukellella.
    result $i.alku, $i - alku;

  elseif (jäykentää in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "n")
                 + sana_Vs ($tietue, nU($tietue))   # Jäykennys.
                 + muistella ($tietue, "t", "n");   # Jäykennellä.
    result $i.alku, $i - alku;

  elseif (paleltaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "l")
                 + sana_Vs ($tietue, lU($tietue));
    result $i.alku, $i - alku;

  elseif (nuotintaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "n")
                 + sana_Vs ($tietue, nU($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (murtaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "r")
                 + muistella ($tietue, "t", "r")
                 + murros ($tietue)
                 + murto ($tietue);
    result $i.alku, $i - alku;

  elseif (musertaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "r")
                 + muistella ($tietue, "t", "r")
                 + sana_Vs ($tietue, rV($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (pahentaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "n")
                 + taivutuskaava ($tietue, [johdin_Us_ksen: "n"])  # Pahennus.
                 + muistella ($tietue, "t", "n")
                 + pahentua ($tietue);
    result $i.alku, $i - alku;

  elseif (juontaa in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "n")
                 + juonto ($tietue)
                 + muistella ($tietue, "t", "n");
    result $i.alku, $i - alku;

  elseif (pyörtää in $tietue.jatko) then
    choose $i in huutaa ($tietue, "t", "r")
                 + pyörtö ($tietue)
                 + muistella ($tietue, "t", "r");
    result $i.alku, $i - alku;


######################################


  elseif (kaivaa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "", "", kantaja)
                 + muistella ($tietue, "", "")       # Kaivella.
                 + taivutuskaava ($tietue, [johdin_ntA: A($tietue)]); # Kaivanta.
    result $i.alku, $i - alku;

  elseif (antaa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "t", "n", kantaja)
                 + punottaa ($tietue, nA($tietue))     # Annattaa.
                 + muistella ($tietue, "t", "n");      # Annella.
    result $i.alku, $i - alku;

  elseif (jakaa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "k", "", kantaja);
    result $i.alku, $i - alku;

  elseif (kapsaa in $tietue.jatko) then
    choose $i in taivutuskaava($tietue, [kestämän_tekijäpääte_y3: A($tietue),
                                         nimitapa_1_A: A($tietue),
                                         ehtotapa: A($tietue),
                                         johdin_ntA: A($tietue)]);
    result $i.alku, $i - alku;

  elseif (lappaa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "p", "", kantaja);
    result $i.alku, $i - alku;

  elseif (palaa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "", "", kantaja);
    result $i.alku, $i - alku;

  elseif (raataa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "t", "d", kantaja)
                 + muistella ($tietue, "t", "d")     # Raadella.
                 + taivutuskaava ($tietue, [johdin_ntA: dA($tietue)]); # Raadanta.
    result $i.alku, $i - alku;

  elseif (saattaa in $tietue.jatko) then
    choose $i in kaivaa ($tietue, "t", "", kantaja)
                 + muistella ($tietue, "t", "");       # Saatella.
    result $i.alku, $i - alku;


######################################


  elseif (haastaa in $tietue.jatko) then
    choose $i in haastaa_haastella ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (kaihtaa in $tietue.jatko) then
    choose $i in haastaa_haastella ($tietue, "t", "d");
    result $i.alku, $i - alku;


  elseif (laittaa in $tietue.jatko) then
    choose $i in haastaa_haastella ($tietue, "t", "");
    result $i.alku, $i - alku;


######################################


  elseif (paistaa in $tietue.jatko) then
    choose $i in paistaa ($tietue, "", "");
    result $i.alku, $i - alku;



  elseif (virkkaa in $tietue.jatko) then
    choose $i in paistaa ($tietue, "k", "");
    result $i.alku, $i - alku;


  elseif (paahtaa in $tietue.jatko) then
    choose $i in paistaa ($tietue, "t", "d");
    result $i.alku, $i - alku;


  elseif (taittaa in $tietue.jatko) then
    choose $i in paistaa ($tietue, "t", "");
    result $i.alku, $i - alku;


######################################


  elseif (saartaa in $tietue.jatko) then
  choose $i in tositavan_kertoman_vahva_aste ($tietue, "t")
               + tositavan_kertoman_vahva_aste ($tietue, "s")
               + käskytapa ($tietue, rA($tietue))
               + taivutuskaava ($tietue,
                                tositapa ($tietue, tA($tietue), rA($tietue),
                                          tO($tietue), rO($tietue),
                                          tositapa_4_tt ("re")) +
                                ehtotapa_ttA       ($tietue, tA($tietue), "re") +
                                mahtotapa_ne_ttA   ($tietue, tA($tietue), "re") +
                                käskytapa_ttA      ($tietue, tA($tietue), "re") +
                                nimitapa_laatutapa ($tietue, tA($tietue), "re"))
               + tekijännimi ($tietue, tA($tietue), kulkija);
    result $i.alku, $i - alku;


######################################


  elseif (laskea in $tietue.jatko) then
    choose $i in laskea_laskeskella ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (hakea in $tietue.jatko) then
    choose $i in laskea_laskeskella ($tietue, "k", "");
    result $i.alku, $i - alku;


  elseif (polkea in $tietue.jatko) then
    choose $i in laskea_laskeskella ($tietue, "k", "j");
    result $i.alku, $i - alku;


  elseif (tunkea in $tietue.jatko) then
    choose $i in laskea_laskeskella ($tietue, "k", "g");
    result $i.alku, $i - alku;


  elseif (kutea in $tietue.jatko) then
    choose $i in laskea_laskeskella ($tietue, "t", "d");
    result $i.alku, $i - alku;


  elseif (rypeä in $tietue.jatko) then
    choose $i in laskea_laskeskella ($tietue, "p", "v");
    result $i.alku, $i - alku;


######################################


  elseif (tuntea in $tietue.jatko) then
    choose $i in käskytapa ($tietue, "ne")
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue, "te", "ne", "s", "s",
                                            tositapa_4_tt ("ne")) +
                                  ehtotapa_ttA     ($tietue, "t",  "ne") +
                                  mahtotapa_ne_ttA ($tietue, "te", "ne") +
                                  käskytapa_ttA    ($tietue, "te", "ne") +
                                  nimitapa_laatutapa_i ($tietue, "te", "ne", "ti"))
                 + tekijännimi ($tietue, "ti", kulkija);
    result $i.alku, $i - alku;


######################################


  elseif (potea in $tietue.jatko) then
    choose $i in käskytapa ($tietue, "de")
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue, "te", "de", "t", "d",
                                            tositapa_4_tt ("de")) +
                                  ehtotapa_ttA     ($tietue, "t",  "de") +
                                  mahtotapa_ne_ttA ($tietue, "te", "de") +
                                  käskytapa_ttA    ($tietue, "te", "de") +
                                  nimitapa_laatutapa_i ($tietue, "te", "de", "ti") +
                                  [johdin_ntA: "de"])
                 + tekijännimi ($tietue, "ti", kulkija);
    result $i.alku, $i - alku;


######################################


  elseif (lähteä in $tietue.jatko) then
    choose $i in tositavan_kertoma ($tietue, "ks", "ks")  # Läks+imme
                 + ehtotapa2 ($tietue, "ks")              # Läks+isi.
                 + käskytapa ($tietue, "hde")
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue, "hte", "hde", "ht", "hd",
                                            tositapa_4_tt ("hde")) +
                                  ehtotapa_ttA     ($tietue, "ht",  "hde") +  # Läht+isi.
                                  mahtotapa_ne_ttA ($tietue, "hte", "hde") +
                                  käskytapa_ttA    ($tietue, "hte", "hde") +
                                  nimitapa_laatutapa_i ($tietue, "hte", "hde", "hti"))
                 + tekijännimi ($tietue, "hti", kulkija)
                 + tekijännimi ($tietue, "ksi", kulkija);
    result $i.alku, $i - alku;


######################################


  elseif (sallia in $tietue.jatko) then
    choose $i in sallia ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (empiä in $tietue.jatko) then
    choose $i in sallia ($tietue, "p", "m");
    result $i.alku, $i - alku;

  elseif (hylkiä in $tietue.jatko) then
    choose $i in sallia ($tietue, "k", "j");
    result $i.alku, $i - alku;

  elseif (kaapia in $tietue.jatko) then
    choose $i in sallia ($tietue, "p", "v");
    result $i.alku, $i - alku;

  elseif (kontia in $tietue.jatko) then
    choose $i in sallia ($tietue, "t", "n");
    result $i.alku, $i - alku;

  elseif (laatia in $tietue.jatko) then
    choose $i in sallia ($tietue, "t", "d");
    result $i.alku, $i - alku;

  elseif (loikkia in $tietue.jatko) then
    choose $i in sallia ($tietue, "k", "");
    result $i.alku, $i - alku;

  elseif (onkia in $tietue.jatko) then
    choose $i in sallia ($tietue, "k", "g");
    result $i.alku, $i - alku;

  elseif (oppia in $tietue.jatko) then
    choose $i in sallia ($tietue, "p", "");
    result $i.alku, $i - alku;

  elseif (poikia in $tietue.jatko) then
    choose $i in sallia ($tietue, "k", "'");
    result $i.alku, $i - alku;

  elseif (sättiä in $tietue.jatko) then
    choose $i in sallia ($tietue,  "t", "");
    result $i.alku, $i - alku;


######################################


  elseif (voida in $tietue.jatko) then
    choose $i in voida ($tietue, "i", "");
    result $i.alku, $i - alku;


  elseif (kanavoida in $tietue.jatko) then
    choose $i in kanavoida ($tietue, "i", "")
                 + haravoitua ($tietue);   # Kanavoitua.
    result $i.alku, $i - alku;


######################################


  elseif (saada in $tietue.jatko) then
    choose $i in voida ($tietue, A($tietue), "");
    result $i.alku, $i - alku;


######################################


  elseif (myydä in $tietue.jatko) then
    choose $i in voida ($tietue, U($tietue), "");
    result $i.alku, $i - alku;


######################################


  elseif (juoda in $tietue.jatko) then
    choose $i in voida ($tietue, UO($tietue), O($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (viedä in $tietue.jatko) then
    choose $i in voida ($tietue, "ie", "e");
    result $i.alku, $i - alku;


######################################


  elseif (käydä in $tietue.jatko) then
    choose $i in voida ($tietue, U($tietue), "v");
    result $i.alku, $i - alku;


######################################


  elseif (nuolaista in $tietue.jatko) then
    choose $i in nuolaista2 ($tietue);
    result $i.alku, $i - alku;

  elseif (rangaista in $tietue.jatko) then
    choose $i in nuolaista ($tietue, "kais", "gais")
                 + sana_U ($tietue, "kais");
    result $i.alku, $i - alku;


  elseif (kalista in $tietue.jatko) then
    choose $i in nuolaista ($tietue, "is", "is")
                 + kihinä ($tietue);             # Kalina.
    result $i.alku, $i - alku;


  elseif (seistä in $tietue.jatko) then
    choose $i in seistä ($tietue);
    result $i.alku, $i - alku;


  elseif (nousta in $tietue.jatko) then
    choose $i in nuolaista ($tietue, "", "")
                 + sana_U ($tietue + [äs: ääntiösointu($tietue)], "");  # Nousu.
    result $i.alku, $i - alku;

  elseif (vavista in $tietue.jatko) then
    choose $i in nuolaista ($tietue, "pis", "vis");
    result $i.alku, $i - alku;

######################################


  elseif (tulla in $tietue.jatko) then
    choose $i in tulla ($tietue, tositapa_4_l(""),
                        mahtotapa_le,
                        nimitapa_1_lA, "l",
                        laatutapa_2_lUt ($tietue, ""));
    result $i.alku, $i - alku;


  elseif (nuolla in $tietue.jatko) then
    choose $i in tulla ($tietue, tositapa_4_l(""),
                        mahtotapa_le,
                        nimitapa_1_lA, "l",
                        laatutapa_2_lUt ($tietue, ""))
                 + muistella ($tietue, "esk", "esk");  # Nuoleskella.
    result $i.alku, $i - alku;


######################################


  elseif (purra in $tietue.jatko) then
    choose $i in tulla ($tietue, tositapa_4_r(""),
                        mahtotapa_re,
                        nimitapa_1_rA, "r",
                        laatutapa_2_rUt ($tietue, "", ""))
                 + taivutuskaava ($tietue, [johdin_ntA: "e"]);
    result $i.alku, $i - alku;


######################################


  elseif (mennä in $tietue.jatko) then
    choose $i in tulla ($tietue, tositapa_4_n(""),
                        mahtotapa_ne,
                        nimitapa_1_nA, "n",
                        laatutapa_2_nUt ($tietue, "", ""));
    result $i.alku, $i - alku;


######################################


  elseif (katsella in $tietue.jatko) then
    choose $i in katsella ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (kohdella in $tietue.jatko) then
    choose $i in katsella ($tietue, "tel", "del");
    result $i.alku, $i - alku;


  elseif (nakella in $tietue.jatko) then
    choose $i in katsella ($tietue, "kel", "el");
    result $i.alku, $i - alku;


  elseif (takellella in $tietue.jatko) then
    choose $i in katsella ($tietue, "tel", "lel");
    result $i.alku, $i - alku;


  elseif (ommella in $tietue.jatko) then
    choose $i in katsella ($tietue, "pel", "mel");
    result $i.alku, $i - alku;


  elseif (pienennellä in $tietue.jatko) then
    choose $i in katsella ($tietue, "tel", "nel");
    result $i.alku, $i - alku;


  elseif (tapella in $tietue.jatko) then
    choose $i in katsella ($tietue, "pel", "el");
    result $i.alku, $i - alku;


  elseif (askarrella in $tietue.jatko) then
    choose $i in katsella ($tietue, "tel", "rel");
    result $i.alku, $i - alku;


  elseif (aatella in $tietue.jatko) then
    choose $i in katsella ($tietue, "tel", "el");
    result $i.alku, $i - alku;


  elseif (kirjoitella in $tietue.jatko) then
    choose $i in katsella ($tietue, "tel", "el");
    result $i.alku, $i - alku;


######################################


  elseif (arvailla in $tietue.jatko) then
    choose $i in arvailla ($tietue);
    result $i.alku, $i - alku;


######################################


  elseif (haravoida in $tietue.jatko) then
    choose $i in tositavan_kestämä_y3 ($tietue, "i")
                 + käskytapa ($tietue, "i") 
                 + taivutuskaava ($tietue,
                                tositapa_ei_kestämä_y3
                                 ($tietue,  "i", "i", "", "",
                                  tositapa_4_d ("i")) +
                                ehtotapa_tA     ($tietue, "",  "i") +
                                mahtotapa_ne_tA ($tietue, "i", "i") +
                                käskytapa_tA    ($tietue, "i", "i") +
                                [nimitapa_1_dA:   "i",
                                 nimitapa_2:      "id",
                                 nimitapa_2_tA:   "i"] +
                                nimitapa_3_tA_4 ($tietue, "i", "i") +
                                laatutapa_1_tA ($tietue, "i", "i") +
                                laatutapa_2_nUt_dU ($tietue, "i", "i") +
                                [johdin_nti: "i"])
                 + taivutuskaava ($tietue,
                                  tositapa0 ($tietue, "itse", "itse", "its", "its") +
                                  [tositavan_kertoma_tiin: "it",
                                   ehtotapa:   "its"])
                 + tekijännimi ($tietue, "i", kantaja)
                 + tekijännimi ($tietue, "itsi", kulkija)
                 + haravoitua ($tietue);
    result $i.alku, $i - alku;


######################################


  elseif (valita in $tietue.jatko) then
    choose $i in ehtotapa2 ($tietue, "tse")                 # Valitse+isi.
                 + käskytapa ($tietue, "tse")
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue,  "tse", "tse", "ts", "ts",
                                            tositapa_4_tt ("")) +
                                  ehtotapa_ttA     ($tietue, "ts", "") +
                                  mahtotapa_ne_ttA ($tietue, "n",  "") +
                                  käskytapa_ttA    ($tietue, "t",  "") +
                                  [nimitapa_1_tA:   "",
                                   nimitapa_2:      "t",
                                   nimitapa_2_ttA:  ""] +
                                  nimitapa_3_ttA_4 ($tietue, "tse", "tse") +
                                  laatutapa_1_ttA ($tietue, "tse", "") +
                                  laatutapa_2_nUt_ttU ($tietue, "n", "") +
                                  [johdin_ntA: ""])
                 + tekijännimi ($tietue, "tsi", kulkija);
    result $i.alku, $i - alku;


######################################

  elseif (juosta in $tietue.jatko) then
    choose $i in käskytapa ($tietue, "kse")
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue,  "kse", "kse", "ks", "ks",
                                            tositapa_4_t ("s")) +
                                  ehtotapa_tA     ($tietue, "ks", "s") +
                                  mahtotapa_se_tA ($tietue, "s",  "s") +
                                  käskytapa_tA    ($tietue, "s",  "s") +
                                  [nimitapa_1_tA:   "s",
                                   nimitapa_2:      "st",
                                   nimitapa_2_tA:   "s"] +
                                  nimitapa_3_tA_4 ($tietue, "kse", "s") +
                                  laatutapa_1_tA ($tietue, "kse", "s") +
                                  laatutapa_2_sUt ($tietue, "s"))
                 + tekijännimi ($tietue, "ksi", kulkija);
    result $i.alku, $i - alku;


######################################


  elseif (nähdä in $tietue.jatko) then
    choose $i in käskytapa ($tietue, "e")
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue,  "ke", "e", "k", "",
                                            tositapa_4_d ("h")) +
                                  ehtotapa_tA     ($tietue, "k", "h") +
                                  mahtotapa_ne_tA ($tietue, "h", "h") +
                                  käskytapa_tA    ($tietue, "h", "h") +
                                  [nimitapa_1_dA:   "h",
                                   nimitapa_2:      "hd",
                                   nimitapa_2_tA:   "h"] +
                                  nimitapa_3_tA_4 ($tietue, "ke", "h") +
                                  laatutapa_1_tA ($tietue, "ke", "h") +
                                  laatutapa_2_nUt_dU ($tietue, "h", "h"))
                 + tekijännimi ($tietue, "ki", kulkija);
    result $i.alku, $i - alku;


######################################


  elseif (aleta in $tietue.jatko) then
    choose $i in aleta ($tietue, "", "")
                 + alentaa ($tietue, "")
                 + alentua ($tietue, "")
                 + alennella ($tietue, "");
    result $i.alku, $i - alku;

  elseif (edetä in $tietue.jatko) then
    choose $i in aleta ($tietue, "te", "de");
    result $i.alku, $i - alku;

  elseif (erata in $tietue.jatko) then
    choose $i in aleta ($tietue, kA($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (hapata in $tietue.jatko) then
    choose $i in aleta ($tietue, pA($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (kangeta in $tietue.jatko) then
    choose $i in aleta ($tietue, "ke", "ge");
    result $i.alku, $i - alku;

  elseif (kaveta in $tietue.jatko) then
    choose $i in aleta ($tietue, "pe", "ve")
                 + alentaa ($tietue, "ve")
                 + alennella ($tietue, "ve");
    result $i.alku, $i - alku;

  elseif (kevetä in $tietue.jatko) then
    choose $i in aleta ($tietue, "pe", "ve") +  aleta ($tietue, "ve", "ve")
                 + alentaa ($tietue, "ve")
                 + alennella ($tietue, "ve");
    result $i.alku, $i - alku;

  elseif (leudota in $tietue.jatko) then
    choose $i in aleta ($tietue, tO($tietue), dO($tietue));
    result $i.alku, $i - alku;

  elseif (loitota in $tietue.jatko) then
    choose $i in aleta ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (lämmetä in $tietue.jatko) then
    choose $i in aleta ($tietue, "pe", "me");
    result $i.alku, $i - alku;

  elseif (mädätä in $tietue.jatko) then
    choose $i in aleta ($tietue, tA($tietue), dA($tietue));
    result $i.alku, $i - alku;

  elseif (suipeta in $tietue.jatko) then
    choose $i in aleta ($tietue, "pe", "e");
    result $i.alku, $i - alku;

  elseif (tarjeta in $tietue.jatko) then
    choose $i in aleta ($tietue, "ke", "je");
    result $i.alku, $i - alku;

  elseif (ulota in $tietue.jatko) then
    choose $i in aleta ($tietue, kO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (vaieta in $tietue.jatko) then
    choose $i in aleta ($tietue, "ke", "e");
    result $i.alku, $i - alku;


######################################


  elseif (salata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, A($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (digata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, gA($tietue), A($tietue))
                 + salaus ($tietue, gA($tietue));
    result $i.alku, $i - alku;

  elseif (hangata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, kA($tietue), gA($tietue));
    result $i.alku, $i - alku;

  elseif (huiskata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, A($tietue), A($tietue))
                 + huiskaista ($tietue, A($tietue));
    result $i.alku, $i - alku;

  elseif (kammata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, pA($tietue), mA($tietue));
    result $i.alku, $i - alku;

  elseif (kelvata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, pA($tietue), vA($tietue));
    result $i.alku, $i - alku;

  elseif (kerrata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, tA($tietue), rA($tietue));
    result $i.alku, $i - alku;

  elseif (kuitata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, tA($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (ladata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, tA($tietue), dA($tietue));
    result $i.alku, $i - alku;

  elseif (peljätä in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, kA($tietue), jA($tietue));
    result $i.alku, $i - alku;

  elseif (pakata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, kA($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (lobata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, bA($tietue), A($tietue));
        result $i.alku, $i - alku;

  elseif (pompata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, pA($tietue), A($tietue));
    result $i.alku, $i - alku;

   elseif (saneerata in $tietue.jatko) then
    choose $i in salata ($tietue, A($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (suunnata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, tA($tietue), nA($tietue));
    result $i.alku, $i - alku;

  elseif (taata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, kA($tietue), A($tietue));
    result $i.alku, $i - alku;

  elseif (vallata in $tietue.jatko) then
    choose $i in salata_salailla ($tietue, tA($tietue), lA($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (katketa in $tietue.jatko) then
    choose $i in katketa ($tietue, "", "");
    result $i.alku, $i - alku;


  elseif (todeta in $tietue.jatko) then
    choose $i in katketa ($tietue, "te", "de");
    result $i.alku, $i - alku;


  elseif (langeta in $tietue.jatko) then
    choose $i in katketa ($tietue, "ke", "ge");
    result $i.alku, $i - alku;


  elseif (lohjeta in $tietue.jatko) then
    choose $i in katketa ($tietue, "ke", "je");
    result $i.alku, $i - alku;


  elseif (poiketa in $tietue.jatko) then
    choose $i in katketa ($tietue, "ke", "e");
    result $i.alku, $i - alku;


  elseif (kammeta in $tietue.jatko) then
    choose $i in katketa ($tietue, "pe", "me");
    result $i.alku, $i - alku;


  elseif (ruveta in $tietue.jatko) then
    choose $i in katketa ($tietue, "pe", "ve");
    result $i.alku, $i - alku;


  elseif (lotota in $tietue.jatko) then
    choose $i in katketa ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (selvitä in $tietue.jatko) then
    choose $i in selvitä ($tietue, "i", "i");
    result $i.alku, $i - alku;


  elseif (keritä in $tietue.jatko) then
    choose $i in selvitä ($tietue, "ki", "i");
    result $i.alku, $i - alku;


  elseif (lämmitä in $tietue.jatko) then
    choose $i in selvitä ($tietue, "pi", "mi");
    result $i.alku, $i - alku;


  elseif (hellitä in $tietue.jatko) then
    choose $i in selvitä ($tietue, "ti", "li");
    result $i.alku, $i - alku;


######################################

  elseif (kohota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (irrota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, tO($tietue), rO($tietue));
    result $i.alku, $i - alku;

  elseif (kadota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, tO($tietue), dO($tietue));
    result $i.alku, $i - alku;

  elseif (puota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (kimmota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, pO($tietue), mO($tietue));
    result $i.alku, $i - alku;

  elseif (laota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, kO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (lingota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, kO($tietue), gO($tietue));
    result $i.alku, $i - alku;

  elseif (netota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, tO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (saota in $tietue.jatko) then
    choose $i in kohota ($tietue, kO($tietue), O($tietue));
    result $i.alku, $i - alku;

  elseif (siivota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, "", "")
                 + taivutuskaava ($tietue, [johdin_Us_ksen: ""]);
    result $i.alku, $i - alku;

  elseif (turvota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, pO($tietue), vO($tietue));
    result $i.alku, $i - alku;

  elseif (upota in $tietue.jatko) then
    choose $i in kohota_kohoilla ($tietue, pO($tietue), O($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (haluta in $tietue.jatko) then
    choose $i in haluta ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (bingota in $tietue.jatko) then
    choose $i in haluta ($tietue, "", "");
    result $i.alku, $i - alku;

  elseif (juoruta in $tietue.jatko) then
    choose $i in haluta ($tietue, "", "")
                 + salailla ($tietue, "");  # Juoruilla.
    result $i.alku, $i - alku;

  elseif (kavuta in $tietue.jatko) then
    choose $i in haluta ($tietue,  pU($tietue), vU($tietue))
                 + salailla ($tietue, pU($tietue));  # Kapuilla.
    result $i.alku, $i - alku;

  elseif (kummuta in $tietue.jatko) then
    choose $i in haluta ($tietue,  pU($tietue), mU($tietue))
                 + salailla ($tietue, pU($tietue));  # Kumpuilla.
    result $i.alku, $i - alku;

  elseif (luututa in $tietue.jatko) then
    choose $i in haluta ($tietue,  tU($tietue), U($tietue))
                 + salailla ($tietue, tU($tietue));  # Luuttuilla.
    result $i.alku, $i - alku;

  elseif (ryöpytä in $tietue.jatko) then
    choose $i in haluta ($tietue,  pU($tietue), U($tietue))
                 + salailla ($tietue, pU($tietue));  # Ryöppyillä.
    result $i.alku, $i - alku;

  elseif (takuta in $tietue.jatko) then
    choose $i in haluta ($tietue,  kU($tietue), U($tietue))
                 + salailla ($tietue, kU($tietue));  # Takkuilla.
    result $i.alku, $i - alku;

  elseif (silputa in $tietue.jatko) then
    choose $i in haluta ($tietue,  pU($tietue), U($tietue));
    result $i.alku, $i - alku;

  elseif (vivuta in $tietue.jatko) then
    choose $i in haluta ($tietue,  pU($tietue), vU($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (kihistä in $tietue.jatko) then
    choose $i in kihistä ($tietue)
                 + kihinä ($tietue)
                 + kihahtaa ($tietue)
                 + kihauttaa_kihautella ($tietue);
    result $i.alku, $i - alku;

  elseif (kitistä in $tietue.jatko) then
    choose $i in kihistä ($tietue) + kihinä ($tietue);
    result $i.alku, $i - alku;


######################################


  elseif (taitaa in $tietue.jatko) then
    choose $i in käskytapa ($tietue, dA($tietue))
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue, tA($tietue), dA($tietue), "s", "s",
                                            tositapa_4_tt ("de")) +
                                  ehtotapa_ttA     ($tietue, tA($tietue), "de") +
                                  mahtotapa_ne_ttA ($tietue, tA($tietue), "de") +
                                  käskytapa_ttA    ($tietue, tA($tietue), "de") +
                                  nimitapa_laatutapa ($tietue, tA($tietue), "de"))
                 + taivutuskaava ($tietue,
                                  [mahtotapa_ne: "n"] +       # Tain+ne+e.
                                  laatutapa_2_nUt_ttU ($tietue, "n", ""))
                 + <taivutus ($tietue, "t", <tositavan_kertoma_tiin>, [])>  # Tait+tiin.
                 + tekijännimi ($tietue, tA($tietue), kantaja);
    result $i.alku, $i - alku;


######################################


  elseif (antautua in $tietue.jatko) then
    choose $i in antautua ($tietue, tU($tietue), dU($tietue));
    result $i.alku, $i - alku;


######################################


  elseif (kaata in $tietue.jatko) then
    choose $i in käskytapa ($tietue, dA($tietue))
                 + taivutuskaava ($tietue,
                                  tositapa ($tietue, tA($tietue), dA($tietue), "s", "s",
                                            tositapa_4_tt ("")) +
                                  ehtotapa_ttA     ($tietue, tA($tietue), "de") +
                                  mahtotapa_ne_ttA ($tietue, "n",         "de") +
                                  käskytapa_ttA    ($tietue, "t",         "de") +
                                  [nimitapa_1_tA:   "",
                                   nimitapa_2:      "d",
                                   nimitapa_2_ttA:  "de"] +
                                  nimitapa_3_ttA_4 ($tietue, tA($tietue), "de") +
                                  laatutapa_1_ttA ($tietue, tA($tietue), "de") +
                                  laatutapa_2_nUt_ttU ($tietue, "n", ""))
                 + tekijännimi ($tietue, tA($tietue), kantaja);
    result $i.alku, $i - alku;

######################################

# Vaillinnainen taivutus.
#
#  elseif (kumajaa in $tietue.jatko) then
#  elseif (kaikaa in $tietue.jatko) then


######################################

  elseif (olla in $tietue.jatko) then
    choose $i in <taivutus ($tietue, "",
                            <nimitapa_1_lA, ehtotapa, ehtotapa_tA,
                             käskytapa, käskytapa_tA,
                             nimitapa_2_tA, nimitapa_3_tA, johdin_tAVA,
                             johdin_lUt, johdin_tU_lU_oltu>
                            + @kertoman_tekijäpääte, []),
                  taivutus ($tietue, "l", <nimitapa_2>, []),
                  taivutus ($tietue, "e",
                            <nimitapa_3, nimitapa_45,
                             johdin_vA>, []),
                  taivutus ($tietue, "e", <liitesana, loppu>,
                            [tapaluokka: käskytapa, aikamuoto: kestämä,
                             luku: yksikkö, tekijä: tekijä_2])>;
    result $i.alku, $i - alku;


  elseif (lienee in $tietue.jatko) then
    choose $i in <taivutus ($tietue, "", @kestämän_tekijäpääte,
                            [tapaluokka: mahtotapa, aikamuoto: kestämä])>;
    result $i.alku, $i - alku;


#========================================

# Suomi-malaga 0.9.7

  elseif (oltu in $tietue.jatko) then
    choose $i in valo ($tietue, "t"+U($tietue), "l"+U($tietue));
    if (value_type($i) = record) then
      result $i.alku, $i - alku;
    else
      foreach $j in $i:
        result $j.alku, $j - alku;
      end;
    end;


# END Suomi-malaga 0.9.7

  elseif ($tietue.alku /= nil) then
    if not @voikko_debug then
      $tietue :=- omistusliite;
    end;
    result $tietue.alku, $tietue - alku;
  else
    result $tietue.perusmuoto, $tietue - alku;
  end;
end;


# $tietue Sanastosta (tiedostosta *.lex) luettu tietue.
# $lisä   Merkkijono, joka lisätään sanan alkuosaan ennen sijapäätteitä.
#         Esimerkiksi sanan valkoinen alkuosa on valkoi.
#         Tähän lisätään merkkijonot
#            nen    valkoi+nen
#            s      valkoi+s(ta), valkoi+s(ten), valkoi+s(ien), valkoi+s(ina).
#            se     valkoi+se(n), valkoi+se(na), jne, valkoi+se(t).
# $luku   "yksikkö" tai "monikko".
# $jatko  Sääntö, jolla sanan jäsennystä jatketaan.
#
subrule taivutus ($tietue, $lisä, $jatko, $tulos):
  assert (value_type ($jatko) = list);

  return ([alku: $tietue.alku + $lisä]
          + ($tietue - alku - jatko)
          + [jatko: $jatko]
          + $tulos);
end;


subrule A ($tietue):
  if ($tietue.äs = a) then
    return "a";
  else
    return "ä";
  end;
end;


subrule O ($tietue):
  if ($tietue.äs = a) then
    return "o";
  else
    return "ö";
  end;
end;


subrule U ($tietue):
  if ($tietue.äs = a) then
    return "u";
  else
    return "y";
  end;
end;


subrule UA ($tietue):
  return (U($tietue) + A($tietue));
end;


subrule UO ($tietue):
  return (U($tietue) + O($tietue));
end;


subrule AA ($tietue):
  return (A($tietue) + A($tietue));
end;


subrule Aj ($tietue):
  return (A($tietue) + "j");
end;


subrule AjA ($tietue):
  return (Aj($tietue) + A($tietue));
end;


subrule An ($tietue):
  return (A($tietue) + "n");
end;


subrule Ar ($tietue):
  return (A($tietue) + "r");
end;


subrule As ($tietue):
  return (A($tietue) + "s");
end;


subrule dA ($tietue):
  return ("d" + A($tietue));
end;


subrule dAs ($tietue):
  return (dA($tietue) + "s");
end;

subrule dO ($tietue):
  return ("d" + O($tietue));
end;


subrule dU ($tietue):
  return ("d" + U($tietue));
end;


subrule eA ($tietue):
  return ("e" + A($tietue));
end;


subrule gA ($tietue):
  return ("g" + A($tietue));
end;


subrule gAs ($tietue):
  return (gA($tietue) + "s");
end;


subrule gO ($tietue):
  return ("g" + O($tietue));
end;


subrule gU ($tietue):
  return ("g" + U($tietue));
end;


subrule hA ($tietue):
  return ("h" + A($tietue));
end;


subrule hAA ($tietue):
  return (hA($tietue) + A($tietue));
end;


subrule jA ($tietue):
  return ("j" + A($tietue));
end;

subrule kA ($tietue):
  return ("k" + A($tietue));
end;

subrule bA ($tietue):
  return ("b" + A($tietue));
end;

subrule kAA ($tietue):
  return (kA($tietue) + A($tietue));
end;


subrule kO ($tietue):
  return ("k" + O($tietue));
end;


subrule kU ($tietue):
  return ("k" + U($tietue));
end;


subrule lA ($tietue):
  return ("l" + A($tietue));
end;


subrule lAs ($tietue):
  return (lA($tietue) + "s");
end;


subrule lO ($tietue):
  return ("l" + O($tietue));
end;


subrule lU ($tietue):
  return ("l" + U($tietue));
end;


subrule mA ($tietue):
  return ("m" + A($tietue));
end;


subrule mAs ($tietue):
  return (mA($tietue) + "s");
end;


subrule mO ($tietue):
  return ("m" + O($tietue));
end;


subrule mU ($tietue):
  return ("m" + U($tietue));
end;


subrule nA ($tietue):
  return ("n" + A($tietue));
end;


subrule nAs ($tietue):
  return (nA($tietue) + "s");
end;


subrule nO ($tietue):
  return ("n" + O($tietue));
end;


subrule nU ($tietue):
  return ("n" + U($tietue));
end;


subrule pA ($tietue):
  return ("p" + A($tietue));
end;


subrule pAA ($tietue):
  return (pA($tietue) + A($tietue));
end;


subrule pO ($tietue):
  return ("p" + O($tietue));
end;


subrule pU ($tietue):
  return ("p" + U($tietue));
end;


subrule rA ($tietue):
  return ("r" + A($tietue));
end;


subrule rAs ($tietue):
  return (rA($tietue) + "s");
end;


subrule rO ($tietue):
  return ("r" + O($tietue));
end;


subrule rU ($tietue):
  return ("r" + U($tietue));
end;


subrule rV ($tietue):
  if ($tietue.alku matches ".*ier") then
    return ("r" + O($tietue));
  elseif ($tietue.alku matches ".*[^i]er") then
    return ("r" + U($tietue));
  elseif ($tietue.alku matches ".*[aiä]r") then
    return ("r" + U($tietue));
  elseif ($tietue.alku matches ".*[ouyö]r") then
    return ("r" + O($tietue));
  else
    error "subrule rV: väärä sana " + $tietue.alku + " " + $tietue.perusmuoto;
  end;
end;


subrule tA ($tietue):
  return ("t" + A($tietue));
end;


subrule tAA ($tietue):
  return ("t" + A($tietue) + A($tietue));
end;


subrule tAr ($tietue):
  return (tA($tietue) + "r");
end;


subrule tO ($tietue):
  return ("t" + O($tietue));
end;


subrule tU ($tietue):
  return ("t" + U($tietue));
end;


subrule Ut ($tietue):
  return (U($tietue) + "t");
end;


subrule vA ($tietue):
  return ("v" + A($tietue));
end;


subrule vAs ($tietue):
  return (vA($tietue) + "s");
end;

subrule vO ($tietue):
  return ("v" + O($tietue));
end;


subrule vU ($tietue):
  return ("v" + U($tietue));
end;


subrule zO($tietue):
  return ("'" + O($tietue));
end;


subrule zU($tietue):
  return ("'" + U($tietue));
end;

# Operaatioita, jotka tehdään taivutuskaavan muodostamisen yhteydessä
# kaikille taivutuksille.
subrule muokkaa_taivutusta($tietue, $taivutus):

  # Näitä ei koskaan käytetä Voikossa
  $taivutus :=- liitesana_s;

  if nimentö in $taivutus and (not (liitesana in $taivutus)) and
     ($tietue.luokka /= asemosana or $tietue.perusmuoto /= "joka") then
    $taivutus :=+ [liitesana: $taivutus.nimentö];
  end;

  if ($tietue.luokka = nimisana) then
    $taivutus :=- voittoaste;
    $taivutus :=- yliaste;
    $taivutus :=- kerronto_sti;
    $taivutus :=- johdin_Us;
    if (not $tietue.perusmuoto matches ".*l[aä]inen") then
      $taivutus :=- johdin_UUs;
    end;
  end;
  
  if ($tietue.luokka = laatusana) then
    $taivutus :=- johdin_tOn;
    $taivutus :=- johdin_mAinen;
    $taivutus :=- johdin_ittAin;
    $taivutus :=- omistusliite;
  end;
  
  if ($tietue.luokka = johdin_vA) then
    $taivutus :=- johdin_tOn;
    $taivutus :=- johdin_mAinen;
    $taivutus :=- johdin_ittAin;
    if ($tietue.perusmuoto in <"va", "vä">) then
      $taivutus :=- nimisana;
    end;
  end;

  if ($tietue.tiedot /= nil and ei_vertm in $tietue.tiedot) then
    $taivutus :=- voittoaste;
    $taivutus :=- yliaste;
  end;

  if ($tietue.tiedot /= nil and ei_yks in $tietue.tiedot) then
    define $taivutus_kopio := $taivutus;
    foreach $jatko in $taivutus_kopio:
      if (luku_sijasta($jatko) = yksikkö and $jatko /= omanto_n) or ($jatko = liitesana) then
        $taivutus :=- $jatko;
      end;
    end;
  end;

  # Ei kaikkia johdoksia kaikista nimisanoista (esim. aateli -> aatelinen).
  #
  if ($tietue.tiedot /= nil) then
    if (ei_inen in $tietue.tiedot) then
      $taivutus :=- johdin_inen;
    end;
    if (ei_lAinen in $tietue.tiedot) then
      $taivutus :=- johdin_lAinen;
    end;
    if (ei_mAinen in $tietue.tiedot) then
      $taivutus :=- johdin_mAinen;
    end;
  end;

  # Näitä johdoksia ei toistaiseksi tueta
  if ($tietue.luokka = paikannimi) then
    $taivutus :=- johdin_mAinen;
  else
    $taivutus :=- johdin_lAinen;
  end;

  # Näitä johdoksia ei tehdä erisnimistä
  if ($tietue.luokka in <nimi, etunimi, sukunimi, paikannimi>) then
    $taivutus :=- johdin_tOn;
    $taivutus :=- johdin_UUs;
    $taivutus :=- johdin_ittAin;
    $taivutus :=- johdin_Us;
    $taivutus :=- johdin_mAinen;
    $taivutus :=- kerronto_sti;
    $taivutus :=- voittoaste;
    $taivutus :=- yliaste;
  end;
  
  if ($tietue.luokka in @nimisana + <laatusana>) then
    $taivutus :=- nimisana;
  end;
  
  return $taivutus;
end;

# Operaatioita, jotka tehdään taivutuskaavan muodostamisen yhteydessä
# kaikille tietueille.
subrule muokkaa_tietuetta($tietue, $taivutus):
  # Inen-loppuiset laatusanat
  if ($tietue.luokka in <laatusana, nimi_laatusana> and $tietue.perusmuoto matches ".*inen") then
    $tietue :=+ [inen_loppu: yes];
  end;
  if ($tietue.tiedot /= nil and ei_yks in $tietue.tiedot) then
    $tietue :=+ [ei_yks: yes];
  end;
  
  return $tietue;
end;

subrule taivutuskaava ($tietue, $taivutus):
  if (not ($tietue.luokka in <nimisana, nimi_laatusana>)) then
    $taivutus :=- johdin_inen;
  end;

  $taivutus := muokkaa_taivutusta($tietue, $taivutus);
  $tietue := muokkaa_tietuetta($tietue, $taivutus);

  define $lista := lajittele ($taivutus);

  define $t := <>;

  foreach $i in $lista:
    $t :=+ <taivutus ($tietue, $i.1, $i.2, [])>;
  end;

  return $t;
end;


# $tietue    Sanatietue
# $taivutus  Sanan taivutus eri taivutusmuodoissa.
# $ei_uusi   Taivutusmuodot, joita ei ole uudessa taivutuksessa.
#
subrule taivutuskaava2 ($tietue, $taivutus, $ei_uusi):
  if (($tietue.luokka in @nimisana + <laatusana>) and
       ($taivutus.nimentö /= nil)) then
    $taivutus :=+ [tavuviiva: $taivutus.nimentö];
  end;

  if (not ($tietue.luokka in <nimisana, nimi_laatusana>) or
     (leikkuu in $tietue.jatko)) then   # Ei leikkuu -> leikkuinen.
    $taivutus :=- johdin_inen;
  end;

  if ($ei_uusi /= <>) then
    $taivutus :=- $ei_uusi;
  end;

  $taivutus := muokkaa_taivutusta($tietue, $taivutus);
  $tietue := muokkaa_tietuetta($tietue, $taivutus);

  define $lista := lajittele ($taivutus);

  define $t := <>;

  foreach $i in $lista:
    $t :=+ <taivutus ($tietue, $i.1, $i.2, [])>;
  end;

  return $t;
end;


subrule tositapa0 ($tietue,
                   $kestämän_vahva_aste, $kestämän_heikko_aste,
                   $kertoman_vahva_aste, $kertoman_heikko_aste):
  return [kestämän_tekijäpääte_heikko: $kestämän_heikko_aste,
          kestämän_tekijäpääte_y3: $kestämän_vahva_aste,
          kestämän_tekijäpääte_m3: $kestämän_vahva_aste,

          kertoman_tekijäpääte_heikko: $kertoman_heikko_aste,
          kertoman_tekijäpääte_vahva: $kertoman_vahva_aste];
end;


subrule tositapa ($tietue,
                  $kestämän_vahva_aste, $kestämän_heikko_aste,
                  $kertoman_vahva_aste, $kertoman_heikko_aste,
                  $tekijä_4):
  return tositapa0 ($tietue,
                    $kestämän_vahva_aste, $kestämän_heikko_aste,
                    $kertoman_vahva_aste, $kertoman_heikko_aste)
         + $tekijä_4;
end;


subrule tositapa_ei_kestämä_y3 ($tietue,
                                $kestämän_vahva_aste, $kestämän_heikko_aste,
                                $kertoman_vahva_aste, $kertoman_heikko_aste,
                                $tekijä_4):
  return [kestämän_tekijäpääte_heikko: $kestämän_heikko_aste,
          kestämän_tekijäpääte_m3: $kestämän_vahva_aste,

          kertoman_tekijäpääte_heikko: $kertoman_heikko_aste,
          kertoman_tekijäpääte_vahva: $kertoman_vahva_aste]
         + $tekijä_4;
end;


subrule tositavan_kestämä ($tietue, $vahva_aste, $heikko_aste):
  return <taivutus ($tietue, $vahva_aste, @kestämän_tekijäpääte_vahva_aste,
                    [tapaluokka: tositapa, aikamuoto: kestämä]),
          taivutus ($tietue, $heikko_aste, <kestämän_tekijäpääte_heikko>,
                    [tapaluokka: tositapa, aikamuoto: kestämä])>;
end;


subrule tositavan_kestämä_y3 ($tietue, $vahva_aste):
  return <taivutus ($tietue + [kielto: molemmat], $vahva_aste, <liitesana, liitesana_pi, loppu>,
                    [tapaluokka: tositapa, aikamuoto: kestämä,
                     luku: yksikkö, tekijä: tekijä_3])>;
end;


subrule tositavan_kertoma ($tietue, $vahva_aste, $heikko_aste):
  return tositavan_kertoman_vahva_aste ($tietue, $vahva_aste) +
         tositavan_kertoman_heikko_aste ($tietue, $heikko_aste);
end;


subrule tositavan_kertoman_vahva_aste ($tietue, $vahva_aste):
  return <taivutus ($tietue, $vahva_aste, <kertoman_tekijäpääte_vahva>,
                    [tapaluokka: tositapa, aikamuoto: kertoma])>;
end;


subrule tositavan_kertoman_heikko_aste ($tietue, $heikko_aste):
  return <taivutus ($tietue, $heikko_aste, <kertoman_tekijäpääte_heikko>,
                    [tapaluokka: tositapa, aikamuoto: kertoma])>;
end;


#######################################################################


subrule ehtotapa2 ($tietue, $lisä):
  return <taivutus ($tietue, $lisä, <ehtotapa>, [])>;
end;


subrule käskytapa ($tietue, $heikko_aste):
  return <taivutus ($tietue, $heikko_aste,
                    <liitesana, loppu>,
                    [tapaluokka: käskytapa, aikamuoto: kestämä,
                    tekijä: tekijä_2, luku: yksikkö])>;
end;


# Teonsanasta johdettu tekijännimi ja ominaisudennimi
# punoa -> punoja,   tehdä -> tekijä.
# punoa -> punojuus, tehdä -> tekijyys
#
subrule tekijännimi ($tietue, $lisä, $taivutus):
  return tekijä ($tietue, $lisä, $taivutus);
end;


subrule tekijä ($tietue, $lisä, $taivutus):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $lisä;
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku + "j" + A($tietue);

  if ($tietue.tiedot /= nil and ym3 in $tietue.tiedot) then
    return <>;
  end;

  if ($taivutus = kulkija) then
    return <taivutus ($tietue, "", <johdin_jA_kulkija>, [])>;
  elseif ($taivutus = myyjä) then
    return <taivutus ($tietue, "", <johdin_jA_myyjä>, [])>;
  elseif ($taivutus = kantaja) then
    return <taivutus ($tietue, "", <johdin_jA_kantaja>, [])>;
  else
    error "suomi.all: subrule tekijännimi: väärä taivutus";
  end;
end;


############################################################
#
# Muuta tietue parien listaksi. Parin eka alkiona on
# merkkijono ja toisena alkiona lista niistä tietueen
# kenttien nimistä, joiden arvona on sama merkkijono.
#
# Esimerkiksi:
#
# [a: "a",
#  b: "a",
#  c: "b",
#  d: "a",
#  e: "b",
#  f: "b"]
#
#   ===>
#
# <<"a", <a, b, d>>,
#  <"b", <c, e, f>>>

subrule lajittele ($tietue):
  #
  # [sijan_nimi: merkkijono]
  # Otetaan kaikki merkkijonot joukkoon $joukko.
  # Se on joukko, koska kukin alkio on siinä vain kerran.
  #
  define $joukko := <>;

  foreach $i in $tietue:
    if (not ($tietue.$i in $joukko)) then
      $joukko :=+ <$tietue.$i>;
    end;
  end;

  define $r := <>;

  foreach $i in $joukko:
    $r :=+ <<$i, etsi ($tietue, $i)>>;
  end;

  define $t := <>;

  foreach $i in $r:
    if (nimentö in $i.2) then
      $i.2 :=+ <loppu>;
    end;
    $t :=+ <<$i.1, $i.2>>;
  end;
  return $t;
end;


# Etsi arvo joukosta.
# Jos ei löydy, palauta <>.
#
subrule etsi ($tietue, $arvo):
  define $t := <>;

  foreach $i in $tietue:
    if ($tietue.$i = $arvo) then
      $t :=+ <$i>;
    end;
  end;

  return $t;
end;


subrule koira ($tietue,
               $vahva_aste,
               $heikko_aste,
               $voittoaste):
  define $monikon_heikko_aste := $heikko_aste;
  if (ikä in $tietue.jatko) then         # Ikä => i'iksi.
    $monikon_heikko_aste := "'";
  end;
  return taivutuskaava ($tietue,
                        yksikkö9 ($tietue, $vahva_aste + A($tietue),
                                  $vahva_aste + A($tietue),
                                  $vahva_aste + A($tietue),
                                  $heikko_aste + A($tietue),
                                  [osanto_A: $vahva_aste + A($tietue)],
                                  sisätulento_Vn,
                                  $voittoaste,
                                  $vahva_aste + A($tietue)) +
                        [johdin_tOn:       $heikko_aste + A($tietue),
                         johdin_UUs:       $vahva_aste,
                         johdin_lAinen:    $vahva_aste + A($tietue),
                         johdin_mAinen:    $vahva_aste + A($tietue),
                         johdin_inen:      $vahva_aste + A($tietue)] +
                        monikko7 ($heikko_aste + A($tietue),
                                  $vahva_aste, $monikon_heikko_aste,
                                  [omanto_ien: $vahva_aste,
                                   omanto_in:  $vahva_aste + A($tietue)],
                                  [osanto_iA:  $vahva_aste],
                                  [sisätulento_iin: $vahva_aste], 
                                  $monikon_heikko_aste));
end;


subrule ruoka ($tietue):
  return koira ($tietue, "ok", "o", "e") +
         taivutuskaava ($tietue,
                        [omanto_n:         "ua",  # Ruuan.
                         tulento_ksi:      "ua",
                         sisäolento_ssA:   "ua",
                         ulkopaikallissija_llA:  "ua",
                         vajanto_ttA:      "ua",
                         johdin_tOn:       "ua",
# Ei tarvita johdosta johdin_inen. HV 13.5.2006. Eikä johdin_lAinen. HV 13.7.2006.
# Eikä johdinta johdin_mAinen. HV 24.7.2006.
                         nimentö_t:        "ua"]);
end;

subrule pitkä ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 ("tk" + A($tietue),
                                  "tk" + A($tietue),
                                  "tk" + A($tietue),
                                  "tk" + A($tietue),
                                  [osanto_A: "tk" + A($tietue)],
                                  sisätulento_Vn,
                                  "te",
                                  "tk" + A($tietue)) +
                        monikko7 ("tk" + A($tietue), "tk", "tk",
                                  [omanto_ien: "tk",
                                   omanto_in:  "tk" + A($tietue)],
                                  [osanto_iA:  "tk"],
                                  [sisätulento_iin: "tk"], 
                                  "s"));
end;


subrule asema ($tietue, $vahva_aste, $heikko_aste):
  return koira ($tietue, $vahva_aste, $heikko_aste, A($tietue))
         + voikko_lista_vain_lipulla(vanhat_muodot, taivutuskaava ($tietue, [osanto_tA: $vahva_aste + A($tietue)]));
end;


subrule kulkija ($tietue, $yksikkö, $monikko):
  return <taivutus ($tietue, "", <johdin_jA_kulkija>, [])>;
end;


subrule apila ($tietue, $yksikkö, $monikko):
  return taivutuskaava ($tietue,
                        yksikkö8 ($yksikkö, $yksikkö,
                                  $yksikkö, $yksikkö,
                                  [osanto_A: $yksikkö,
                                   osanto_tA: $yksikkö],
                                  sisätulento_Vn,
                                  $yksikkö, $yksikkö) +
                        [johdin_tOn:    $yksikkö,    # Apilaton.
                         johdin_lAinen: $yksikkö,    # Apilalainen.
                         johdin_mAinen: $yksikkö,    # Apilamainen.
                         johdin_inen:   $yksikkö] +  # Apilainen.
                        monikko7 ($yksikkö, $monikko, $monikko,
                                  [omanto_in: $yksikkö, omanto_iT: $monikko],
                                  [osanto_itA: $monikko],
                                  [sisätulento_ihin: $monikko], ""));
end;


subrule laatikko ($tietue,
                  $yksikön_vahva_aste,
                  $yksikön_heikko_aste,
                  $monikon_vahva_aste,
                  $monikon_heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($yksikön_vahva_aste, $yksikön_vahva_aste,
                                  $yksikön_vahva_aste, $yksikön_heikko_aste,
                                  [osanto_A:  $yksikön_vahva_aste],
###                                   osanto_tA: $yksikön_vahva_aste],
                                  sisätulento_Vn,
                                  $yksikön_heikko_aste,
                                  $yksikön_vahva_aste) +
                        [johdin_tOn:      $yksikön_heikko_aste,
                         johdin_UUs:      eka_kirjain ($yksikön_vahva_aste),
                         johdin_lAinen:   $yksikön_vahva_aste,
                         johdin_mAinen:   $yksikön_vahva_aste,
                         johdin_inen:     $yksikön_vahva_aste] +
                        monikko7 ($yksikön_heikko_aste,
                                  $monikon_vahva_aste, $monikon_heikko_aste,
                                  [omanto_jen:       $monikon_vahva_aste,
                                   omanto_iT:        $monikon_heikko_aste],
                                  [osanto_jA:        $monikon_vahva_aste,
                                   osanto_itA:       $monikon_heikko_aste],
                                  [sisätulento_ihin: $monikon_vahva_aste], "")) +
         taivutuskaava ($tietue,
                        [olento_inA:       $monikon_heikko_aste,
                         sisätulento_ihin: $monikon_heikko_aste,
                         seuranto_ine:         $monikon_heikko_aste]);
end;


subrule solakka ($tietue,
                 $yksikön_vahva_aste,
                 $yksikön_heikko_aste,
                 $monikon_vahva_aste,
                 $monikon_heikko_aste):
  return laatikko ($tietue,
                   $yksikön_vahva_aste,
                   $yksikön_heikko_aste,
                   $monikon_vahva_aste,
                   $monikon_heikko_aste)
         + taivutuskaava ($tietue, [omanto_in: $yksikön_vahva_aste]);
end;


subrule veranta ($tietue):
  return solakka ($tietue, tA($tietue), nA($tietue), tO($tietue), nO($tietue));
end;


subrule kantaja ($tietue):
  return apaja ($tietue);
end;


subrule apaja ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 (A($tietue), A($tietue),
                                  A($tietue), A($tietue),
                                  [osanto_A:  A($tietue),
                                   osanto_tA: A($tietue)],
                                  sisätulento_Vn,
                                  A($tietue), A($tietue)) +
                        [johdin_tOn:       A($tietue),
                         johdin_lAinen:    A($tietue),
                         johdin_mAinen:    A($tietue),
                         johdin_inen:      A($tietue)] +
                        monikko7 (A($tietue), "", "",
                                  [omanto_ien: "",
                                   omanto_in:  A($tietue),
                                   omanto_iT:  O($tietue)],
                                  [osanto_iA:  ""],
                                  [sisätulento_iin: ""], ""));
end;


subrule koko ($tietue,
              $yksikön_vahva_aste, $yksikön_heikko_aste,
              $monikon_vahva_aste, $monikon_heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö_valo ($yksikön_vahva_aste, $yksikön_heikko_aste) +
                        monikko7 ($yksikön_heikko_aste, $monikon_vahva_aste, $monikon_heikko_aste,
                                  [omanto_jen: $monikon_vahva_aste],
                                  [osanto_jA: $monikon_vahva_aste],
                                  [sisätulento_ihin: $monikon_vahva_aste],
                                  $monikon_heikko_aste));
end;


subrule valo ($tietue, $vahva_aste, $heikko_aste):
  return koko ($tietue, $vahva_aste, $heikko_aste, $vahva_aste, $heikko_aste);
end;


subrule arvelu ($tietue, $vahva_aste, $heikko_aste):
  define $r :=
          taivutuskaava ($tietue,
                         yksikkö_valo ($vahva_aste, $heikko_aste) +
                         monikko7 ($heikko_aste, $vahva_aste, $heikko_aste,
                                   [omanto_jen: $vahva_aste,
                                    omanto_iT:  $heikko_aste],
                                   [osanto_jA:  $vahva_aste,
                                    osanto_itA: $heikko_aste],
                                   [sisätulento_ihin: $vahva_aste],
                                   $heikko_aste));

  if ($vahva_aste /= $heikko_aste) then
    $r :=+ <taivutus ($tietue, $heikko_aste, <sisätulento_ihin>, [])>;
  end;

  return $r;
end;


subrule hontelo ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 (O($tietue),
                                  O($tietue),
                                  O($tietue),
                                  O($tietue),
                                  [osanto_A: O($tietue)],
                                  sisätulento_Vn,
                                  O($tietue),
                                  O($tietue)) +
                        [johdin_tOn:    O($tietue), 
                         johdin_Us:     U($tietue),
                         johdin_mAinen: O($tietue),
                         johdin_inen:   O($tietue)] +
                        monikko7 (O($tietue), O($tietue), O($tietue),
                                  [omanto_jen: O($tietue),
                                  omanto_iT:  O($tietue)],
                                  [osanto_jA:  O($tietue),
                                   osanto_itA: O($tietue)],
                                  [sisätulento_ihin: O($tietue)],
                                  O($tietue)));
end;


subrule risti ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        [tavuviiva:       $vahva_aste  + "i",
                         omistusliite:    $vahva_aste  + "i",
                         nimentö:         $vahva_aste  + "i",
                         omanto_n:        $heikko_aste + "i",
                         osanto_A:        $vahva_aste  + "i",
                         olento_nA:       $vahva_aste  + "i",
                         tulento_ksi:     $heikko_aste + "i",
                         sisäolento_ssA:  $heikko_aste + "i",
                         sisätulento_Vn:  $vahva_aste  + "i",
                         ulkopaikallissija_llA: $heikko_aste + "i",
                         vajanto_ttA:     $heikko_aste + "i",
                         kerronto_sti:    $heikko_aste + "i",
                         voittoaste:      $heikko_aste + "i",
                         johdin_tOn:      $heikko_aste + "i",
                         johdin_Us:       $vahva_aste  + "i",
                         johdin_lAinen:   $vahva_aste  + "i",
                         johdin_mAinen:   $vahva_aste  + "i",
                         johdin_inen:     $vahva_aste]
                        + yhdyssana ($vahva_aste + "i")
                        + monikko7 ($heikko_aste + "i",
                                    $vahva_aste + "e", $heikko_aste + "e",
                                    [omanto_en: $vahva_aste + "i",
                                     omanto_in: $vahva_aste + "e"],
                                    [osanto_jA: $vahva_aste + "e"],
                                    [sisätulento_ihin: $vahva_aste  + "e"],
                                    $heikko_aste + "e"));
end;


subrule siisti ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        [tavuviiva:       $vahva_aste  + "i",
                         omistusliite:    $vahva_aste  + "i",
                         nimentö:         $vahva_aste  + "i",
                         omanto_n:        $heikko_aste + "i",
                         osanto_A:        $vahva_aste  + "i",
                         olento_nA:       $vahva_aste  + "i",
                         tulento_ksi:     $heikko_aste + "i",
                         sisäolento_ssA:  $heikko_aste + "i",
                         sisätulento_Vn:  $vahva_aste  + "i",
                         ulkopaikallissija_llA: $heikko_aste + "i",
                         vajanto_ttA:     $heikko_aste + "i",
                         kerronto_sti:    $heikko_aste + "i",
                         voittoaste:      $heikko_aste + "i",
                         johdin_tOn:      $heikko_aste + "i",
                         johdin_Us:       $vahva_aste  + "e",
                         johdin_inen:     $vahva_aste]
                        + yhdyssana ($vahva_aste + "i")
                        + monikko7 ($heikko_aste + "i",
                                    $vahva_aste + "e", $heikko_aste + "e",
                                    [omanto_en: $vahva_aste + "i",
                                     omanto_in: $vahva_aste + "e"],
                                    [osanto_jA: $vahva_aste + "e"],
                                    [sisätulento_ihin: $vahva_aste  + "e"],
                                    $heikko_aste + "e"));
end;


subrule paperi_banaali ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "i", $vahva_aste  + "i",
                                  $vahva_aste + "i", $heikko_aste + "i",
                                  [osanto_A: $vahva_aste  + "i"],
                                  sisätulento_Vn,
                                  $heikko_aste + "i", $vahva_aste  + "i") +
                        [johdin_tOn:      $heikko_aste + "i",
                         johdin_Us:       $vahva_aste  + "i",
                         johdin_lAinen:   $vahva_aste  + "i",
                         johdin_mAinen:   $vahva_aste  + "i",
                         johdin_inen:     $vahva_aste] +
                         monikko7 ($heikko_aste + "i",
                                   $vahva_aste + "e", $heikko_aste + "e",
                                   [omanto_iT:  $heikko_aste + "e",
                                    omanto_en:  $vahva_aste  + "i",
                                    omanto_in:  $vahva_aste  + "e"],
                                   [osanto_itA: $heikko_aste + "e",
                                    osanto_jA:  $vahva_aste  + "e"],
                                   [sisätulento_ihin: $vahva_aste + "e"],
                                   $heikko_aste + "e"));
end;


subrule edam ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "i", $vahva_aste,
                                  $vahva_aste + "i", $heikko_aste + "i",
                                  [osanto_A: $vahva_aste  + "i"],
                                  sisätulento_Vn,
                                  $heikko_aste + "i", $vahva_aste) +
                        [johdin_tOn:      $heikko_aste + "i",
                         johdin_Us:       $vahva_aste  + "i",
                         johdin_lAinen:   $vahva_aste + "i",
                         johdin_mAinen:   $vahva_aste,
                         johdin_inen:     $vahva_aste] +
                         monikko7 ($heikko_aste + "i",
                                   $heikko_aste + "e", $heikko_aste + "e",
                                   [omanto_iT:  $heikko_aste + "e",
                                    omanto_en:  $vahva_aste  + "i"],
                                   [osanto_itA: $heikko_aste + "e",
                                    osanto_jA:  $vahva_aste  + "e"],
                                   [sisätulento_ihin: $vahva_aste + "e"],
                                   $heikko_aste + "e"))
         + yhdyssanan_taivutuskaava ($tietue, $vahva_aste);
end;


subrule sisar ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "e", $heikko_aste,
                                  $vahva_aste + "e", $vahva_aste + "e",
                                  [osanto_tA: $heikko_aste],
                                  sisätulento_Vn,
                                  $heikko_aste, $heikko_aste) +
                        [johdin_tOn:      $vahva_aste + "e",
                         johdin_mAinen:   $vahva_aste,
                         johdin_inen:     $vahva_aste] +
                        monikko7 ($vahva_aste + "e", $vahva_aste, $vahva_aste,
                                  [omanto_ien: $vahva_aste,
                                   omanto_ten: $heikko_aste],
                                  [osanto_iA:  $vahva_aste],
                                  [sisätulento_iin: $vahva_aste], $vahva_aste));
end;


subrule ahven ($tietue, $vahva_aste, $heikko_aste):
  return sisar ($tietue, $vahva_aste, $heikko_aste);
end;


subrule uistin ($tietue, $vahva_aste, $heikko_aste):
  return hapan_uistin ($tietue, $vahva_aste, $heikko_aste, "e");
end;


subrule hapan ($tietue, $vahva_aste, $heikko_aste):
  return hapan_uistin ($tietue, $vahva_aste, $heikko_aste, A($tietue)) +  # Happaman.
         hapan_uistin ($tietue, $vahva_aste, $heikko_aste, "e");          # Happamen.
end;



subrule hapan_uistin ($tietue, $vahva_aste, $heikko_aste, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + $ääntiö, $heikko_aste,
                                  $vahva_aste + $ääntiö, $vahva_aste + $ääntiö,
                                  [osanto_tA: $heikko_aste],
                                  sisätulento_Vn,
                                  $vahva_aste + $ääntiö, $heikko_aste) +
                        [johdin_tOn:      $vahva_aste + $ääntiö,
                         johdin_UUs:      $vahva_aste,
                         johdin_mAinen:   $heikko_aste,
                         johdin_lAinen:   $vahva_aste + $ääntiö,
                         johdin_inen:     $vahva_aste] +
                        monikko7 ($vahva_aste + $ääntiö,
                                  $vahva_aste, $vahva_aste,
                                  [omanto_ien: $vahva_aste,
                                   omanto_ten: $heikko_aste],
                                  [osanto_iA:  $vahva_aste],
                                  [sisätulento_iin: $vahva_aste],
                                  $vahva_aste));
end;


subrule onneton ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + mA($tietue), $heikko_aste + "n",
                                  $vahva_aste + mA($tietue), $vahva_aste + mA($tietue),
                                  [osanto_tA: $heikko_aste + "n"],
                                  sisätulento_Vn,
                                  $vahva_aste + mA($tietue), $heikko_aste + "n") +
                        monikko7 ($vahva_aste + mA($tietue),
                                  $vahva_aste + "m",
                                  $vahva_aste + "m",
                                  [omanto_ien: $vahva_aste + "m",
                                   omanto_in:  $vahva_aste + mA($tietue),
                                   omanto_ten: $heikko_aste + "n"],
                                  [osanto_iA:  $vahva_aste + "m"],
                                  [sisätulento_iin: $vahva_aste + "m"],
                                  $vahva_aste + "m") +
                        [johdin_UUs: $vahva_aste + "m"]) +
         taivutuskaava ($tietue,
                        [olento_nA:        $heikko_aste + "n"]) +  # Onneton+na.
         taivutuskaava ($tietue,
                        [nimentö:          $heikko_aste + "in",    # Onnetoin.
                         omanto_ten:       $heikko_aste + "in",    # Onnetoin+ten
                         osanto_tA:        $heikko_aste + "in",    # Onnetoin+ta.
                         olento_nA:        $heikko_aste + "in"]);  # Onnetoin+na.
end;


subrule kalsium ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "i", $vahva_aste,
                                  $vahva_aste + "i", $heikko_aste + "i",
                                  [osanto_A: $vahva_aste  + "i"],
                                  sisätulento_Vn,
                                  $vahva_aste + "i", $vahva_aste) +
                        [johdin_tOn:      $heikko_aste + "i",
                         johdin_lAinen:   $vahva_aste + "i",
                         johdin_mAinen:   $vahva_aste,
                         johdin_inen:     $vahva_aste] +
                        monikko7 ($heikko_aste + "i",
                                  $vahva_aste  + "e",
                                  $heikko_aste + "e",
                                  [omanto_en: $vahva_aste  + "i"],
                                  [osanto_jA: $vahva_aste  + "e"],
                                  [sisätulento_ihin: $vahva_aste  + "e"],
                                  $heikko_aste + "i"));
end;


subrule poppi ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "i", $vahva_aste + "i",
                                  $vahva_aste + "i", $heikko_aste + "i",
                                  [osanto_A: $vahva_aste  + "i"],
                                  sisätulento_Vn,
                                  $vahva_aste + "i", $vahva_aste + "i") +
                        [johdin_tOn:      $heikko_aste + "i",
                         johdin_mAinen:   $vahva_aste + "i",
                         johdin_inen:     $vahva_aste + "i"] +
                        monikko7 ($heikko_aste + "i",
                                  $vahva_aste  + "e",
                                  $heikko_aste + "e",
                                  [omanto_en: $vahva_aste  + "i"],
                                  [osanto_jA: $vahva_aste  + "e"],
                                  [sisätulento_ihin: $vahva_aste  + "e"],
                                  $heikko_aste + "i"))
         + <taivutus ($tietue, "", <liitesana, loppu>, [])>
         + yhdyssanan_taivutuskaava ($tietue, "");
end;


subrule nalle ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                                yksikkö8 ($vahva_aste, $vahva_aste,
                                          $vahva_aste, $heikko_aste,
                                          [osanto_A: $vahva_aste],
                                          sisätulento_Vn,
                                          $vahva_aste, $vahva_aste) +
                        [johdin_tOn:      $heikko_aste,
                         johdin_Us:       $vahva_aste,
                         johdin_lAinen:   $vahva_aste,
                         johdin_mAinen:   $vahva_aste,
                         johdin_inen:     $vahva_aste] +
                        monikko7 ($heikko_aste,
                                  $vahva_aste, $heikko_aste,
                                  [omanto_in:  $vahva_aste,
                                   omanto_jen: $vahva_aste],
                                  [osanto_jA:  $vahva_aste],
                                  [sisätulento_ihin: $vahva_aste],
                                  $heikko_aste));
end;


subrule kala ($tietue, $vahva_aste, $heikko_aste, $voittoaste, $yliaste):
  return raaka ($tietue,
                $vahva_aste, $heikko_aste,
                $vahva_aste, $heikko_aste,
                $voittoaste, $yliaste);
end;


subrule raaka ($tietue,
               $yksikön_vahva_aste,
               $yksikön_heikko_aste,
               $monikon_vahva_aste,
               $monikon_heikko_aste,
               $voittoaste,
               $yliaste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($yksikön_vahva_aste + A($tietue),
                                  $yksikön_vahva_aste + A($tietue),
                                  $yksikön_vahva_aste + A($tietue),
                                  $yksikön_heikko_aste + A($tietue),
                                  [osanto_A: $yksikön_vahva_aste  + A($tietue)],
                                  sisätulento_Vn,
                                  $voittoaste,
                                  $yksikön_vahva_aste + A($tietue)) +
                        [johdin_tOn:       $yksikön_heikko_aste + A($tietue),
                         johdin_UUs:       $yksikön_vahva_aste,
                         johdin_lAinen:    $yksikön_vahva_aste + A($tietue),
                         johdin_mAinen:    $yksikön_vahva_aste + A($tietue),
                         johdin_inen:      $yksikön_vahva_aste + A($tietue)] +
                        monikko7 ($yksikön_heikko_aste + A($tietue),
                                  $monikon_vahva_aste  + O($tietue),
                                  $monikon_heikko_aste + O($tietue),
                                  [omanto_in:  $yksikön_vahva_aste + A($tietue), 
                                   omanto_jen: $monikon_vahva_aste + O($tietue)],
                                  [osanto_jA:  $monikon_vahva_aste + O($tietue)],
                                  [sisätulento_ihin: $monikon_vahva_aste + O($tietue)],
                                  $yliaste));
end;


subrule lovi ($tietue, $vahva_aste, $heikko_aste):
  return kumpi ($tietue, $vahva_aste, $heikko_aste, "e") +
         taivutuskaava($tietue, [johdin_mAinen: $vahva_aste + "i"]);
end;

subrule piki ($tietue,
              $yksikön_vahva_aste,
              $yksikön_heikko_aste,
              $monikon_vahva_aste,
              $monikon_heikko_aste):
  return taivutuskaava2 ($tietue,
                         [nimentö:          $yksikön_vahva_aste  + "i",
                          omistusliite:     $yksikön_vahva_aste  + "e",
                          omanto_n:         $yksikön_heikko_aste + "e",
                          osanto_A:         $yksikön_vahva_aste  + "e",
                          olento_nA:        $yksikön_vahva_aste  + "e",
                          tulento_ksi:      $yksikön_heikko_aste + "e",
                          sisäolento_ssA:   $yksikön_heikko_aste + "e",
                          sisätulento_Vn:   $yksikön_vahva_aste  + "e",
                          ulkopaikallissija_llA:  $yksikön_heikko_aste + "e",
                          vajanto_ttA:      $yksikön_heikko_aste + "e",

                          nimentö_t:        $yksikön_heikko_aste + "e",
                          omanto_en:        $monikon_vahva_aste  + "i",
                          omanto_in:        $yksikön_vahva_aste  + "e",
                          osanto_iA:        $monikon_vahva_aste,
                          olento_inA:       $monikon_vahva_aste,
                          sija_monikko_1:     $monikon_heikko_aste,
                          sisätulento_iin:  $monikon_vahva_aste,
                          ulkopaikallissija_illA: $monikon_heikko_aste,
                          vajanto_ittA:     $monikon_heikko_aste,
                          seuranto_ine:     $monikon_vahva_aste,
## Näitä kolmea ei oikeastaan tarvita, koska tällä
## tavalla taipuvia laatusanoja ei ole, mutta
## niitä voi tulla...
                          kerronto_sti:    $yksikön_heikko_aste + "e",
                          voittoaste:      $yksikön_heikko_aste + "e",
                          yliaste:         $monikon_heikko_aste,

                          johdin_inen:      $yksikön_vahva_aste,
                          johdin_ittain:    $monikon_heikko_aste,
                          johdin_lAinen:    $yksikön_vahva_aste  + "e",
                          johdin_mAinen:    $yksikön_vahva_aste  + "i",
                          johdin_tOn:       $yksikön_heikko_aste + "e",
                          johdin_Us:        $yksikön_vahva_aste  + "i"]
                         + yhdyssana ($yksikön_vahva_aste  + "i"),
                         <omanto_in>);
end;


subrule kumpi ($tietue, $vahva_aste, $heikko_aste, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + $ääntiö, $vahva_aste  + "i",
                                  $vahva_aste + $ääntiö, $heikko_aste + $ääntiö,
                                  [osanto_A: $vahva_aste  + $ääntiö],
                                  sisätulento_Vn,
                                  $heikko_aste + $ääntiö, $vahva_aste  + "i") +
                        [johdin_tOn:      $heikko_aste + $ääntiö,
			 johdin_lAinen:   $vahva_aste + "e",
                         johdin_inen:     $vahva_aste] +
                        monikko7 ($heikko_aste + $ääntiö,
                                  $vahva_aste, $heikko_aste,
                                  [omanto_en:        $vahva_aste + "i",
                                   omanto_in:        $vahva_aste + $ääntiö],
                                  [osanto_iA:        $vahva_aste],
                                  [sisätulento_iin:  $vahva_aste],
                                  $vahva_aste + $ääntiö));
end;


subrule vapaa ($tietue, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($ääntiö, $ääntiö, $ääntiö, $ääntiö,
                                  [osanto_tA: $ääntiö], sisätulento_seen,
                                  $ääntiö, $ääntiö) +
                        [johdin_tOn:       $ääntiö,
                         johdin_Us:        "",
                         johdin_lAinen:    $ääntiö,
                         johdin_mAinen:    $ääntiö,
                         johdin_inen:      "",

                         nimentö_t:         $ääntiö,
                         omanto_iT:         "",
                         osanto_itA:        "",
                         olento_inA:        "",
                         sija_monikko_1:      "",
                         sisätulento_isiin: "",
                         sisätulento_ihin:  "",
                         ulkopaikallissija_illA:  "",
                         vajanto_ittA:      "",
                         seuranto_ine:          "",
                         yliaste:           ""]);
end;


subrule kamee ($tietue, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($ääntiö, $ääntiö, $ääntiö, $ääntiö,
                                  [osanto_tA: $ääntiö],
                                  [sisätulento_seen: $ääntiö,
                                   sisätulento_hVn: $ääntiö],
                                  $ääntiö, $ääntiö) +
                        [johdin_tOn:       $ääntiö,
                         johdin_lAinen:    $ääntiö,
                         johdin_mAinen:    $ääntiö,
                         johdin_inen:      ""] +
                        monikko7 ($ääntiö, "", "",
                                  [omanto_iT: ""],
                                  [osanto_itA: ""],
                                  [sisätulento_ihin:  "",
                                   sisätulento_isiin: ""],
                                  ""));
end;


subrule tee ($tietue, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($ääntiö, $ääntiö, $ääntiö, $ääntiö,
                                  [osanto_tA: $ääntiö],
                                  [sisätulento_hVn: $ääntiö],
                                  $ääntiö, $ääntiö) +
                        [johdin_tOn:       $ääntiö,
                         johdin_mAinen:    $ääntiö] +
# Ei tarvita johdosta johdin_inen. HV 13.5.2006. "Teinen".
                        monikko7 ($ääntiö, "", "",
                                  [omanto_iT: ""],
                                  [osanto_itA: ""],
                                  [sisätulento_ihin: ""],
                                  ""));
end;


subrule maa ($tietue, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($ääntiö, $ääntiö, $ääntiö, $ääntiö,
                                  [osanto_tA: $ääntiö], sisätulento_hVn,
                                  $ääntiö, $ääntiö) +
                        [johdin_tOn:      $ääntiö,
                         johdin_lAinen:   $ääntiö,
                         johdin_mAinen:   $ääntiö,
                         johdin_inen:     "",

                         nimentö_t: $ääntiö,
                         omanto_iT: "",
                         osanto_itA: "",
                         olento_inA: "",
                         sija_monikko_1: "",
                         sisätulento_ihin: "",
                         ulkopaikallissija_illA: "",
                         vajanto_ittA: "",
                         seuranto_ine: "",
                         johdin_ittAin: ""]);
end;


subrule tiu ($tietue, $ääntiö):
  return taivutuskaava ($tietue,
                        yksikkö8 ($ääntiö, $ääntiö, $ääntiö, $ääntiö,
                                  [osanto_tA: $ääntiö], sisätulento_hVn,
                                  $ääntiö, $ääntiö) +
                        [johdin_tOn:      $ääntiö,
                         johdin_mAinen:   $ääntiö]);
# Ei tarvita johdosta johdin_inen. HV 13.5.2006. "Tiuinen".
end;


subrule tosi ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 ("te", "si", "te", "de",
                                  [osanto_ttA: ""], sisätulento_Vn,
                                  "de", "si") +
                        [johdin_tOn:      "de",
                         johdin_mAinen:   "si",
                         johdin_lAinen:   "te",
                         johdin_inen:     "t"] +
                        monikko7 ("de", "s", "s",
                                  [omanto_ien: "s"],
                                  [osanto_iA: "s"],
                                  [sisätulento_iin:  "s"],
                                  "s"));
end;


subrule kansi ($tietue, $vahva_aste, $heikko_aste, $inen):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "e", "si",
                                  $vahva_aste + "e", $heikko_aste + "e",
                                  [osanto_ttA: ""], sisätulento_Vn,
                                  $heikko_aste + "e", "si") +
                        [johdin_tOn:      $heikko_aste + "e",
                         johdin_mAinen:   "si",
                         johdin_inen:     $inen,

                         nimentö_t:        $heikko_aste + "e",
                         omanto_ien:       "s",
                         omanto_ten:       $vahva_aste,
                         osanto_iA:        "s",
                         olento_inA:       "s",
                         sija_monikko_1:     "s",
                         sisätulento_iin:  "s",
                         ulkopaikallissija_illA: "s",
                         vajanto_ittA:     "s",
                         seuranto_ine:     "s",
                         johdin_ittAin:    "s"]);
end;


subrule hame ($tietue, $nimentö_osanto, $yksikkö, $monikko):
  return taivutuskaava ($tietue,
                        yksikkö8 ($yksikkö, $nimentö_osanto,
                                  $yksikkö, $yksikkö,
                                  [osanto_ttA: $nimentö_osanto],
                                  sisätulento_seen,
                                  $yksikkö, $nimentö_osanto) +
                        [johdin_tOn:       $yksikkö,
                         johdin_Us:        $monikko,
                         johdin_lAinen:    $nimentö_osanto,
                         johdin_mAinen:    $nimentö_osanto,
                         johdin_inen:      $monikko] +
                        monikko7 ($yksikkö, $monikko,  $monikko,
                                  [omanto_iT:         $monikko],
                                  [osanto_itA:        $monikko],
                                  [sisätulento_isiin: $monikko,
                                   sisätulento_ihin:  $monikko],
                                  $monikko));
end;


subrule alkeet ($tietue):
  return taivutuskaava ($tietue,
                        [johdin_tOn:    "e",
                         johdin_inen:   ""] +
# Ei tarvita johdinta johdin_lAinen ("alkeetlainen"). HV 13.7.2006.
# Eikä johdinta johdin_mAinen ("alkeetmainen"). HV 24.7.2006.
                        monikko7 ("e", "",  "",
                                  [omanto_iT:         ""],
                                  [osanto_itA:        ""],
                                  [sisätulento_isiin: "",
                                   sisätulento_ihin:  ""],
                                  ""));
end;


subrule suo ($tietue, $yksikkö, $monikko):
  return taivutuskaava ($tietue,
                        yksikkö8 ($yksikkö, $yksikkö, $yksikkö, $yksikkö,
                                  [osanto_tA: $yksikkö], sisätulento_hVn,
                                  $yksikkö, $yksikkö) +
                        [johdin_tOn:       $yksikkö,
                         johdin_lAinen:    $yksikkö,
                         johdin_mAinen:    $yksikkö,
                         johdin_inen:      $monikko,

                         nimentö_t:        $yksikkö,
                         omanto_iT:        $monikko,
                         osanto_itA:       $monikko,
                         olento_inA:       $monikko,
                         sija_monikko_1:     $monikko,
                         sisätulento_ihin: $monikko,
                         ulkopaikallissija_illA: $monikko,
                         vajanto_ittA:     $monikko,
                         seuranto_ine:     $monikko,
                         johdin_ittAin:    $monikko]);
end;


subrule lapsi ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 ("pse", "psi", "pse", "pse",
                                  [], sisätulento_Vn,
                                  "pse", "psi") +
                        [johdin_tOn:      "pse",
                         johdin_mAinen:   "psi",
                         johdin_inen:     "ps",

                         nimentö_t:        "pse",
                         omanto_ten:       "s",
                         omanto_ien:       "ps",
                         osanto_iA:        "ps",
                         olento_inA:       "ps",
                         sija_monikko_1:     "ps",
                         sisätulento_iin:  "ps",
                         ulkopaikallissija_illA: "ps",
                         vajanto_ittA:     "ps",
                         seuranto_ine:     "ps",
                         johdin_ittAin:    "ps"]);
end;


subrule veitsi ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 ("tse", "tsi", "tse", "tse",
                                  [osanto_tA: "s"], sisätulento_Vn,
                                  "tse", "tsi") +
                        [johdin_tOn:      "tse",
                         johdin_mAinen:   "tsi",
                         johdin_inen:     "ts",

                         nimentö_t:        "tse",
                         omanto_ien:       "ts",
                         omanto_ten:       "s",
                         osanto_iA:        "ts",
                         olento_inA:       "ts",
                         sija_monikko_1:     "ts",
                         sisätulento_iin:  "ts",
                         ulkopaikallissija_illA: "ts",
                         vajanto_ittA:     "ts",
                         seuranto_ine:     "ts",
                         johdin_ittAin:    "ts"]);
end;


subrule kalleus ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 ("te", "s", "te", "de",
                                  [osanto_ttA: ""], sisätulento_Vn,
                                  "de", "s") +
                        [johdin_tOn:      "de",
                         johdin_mAinen:   "s",
                         johdin_lAinen:   "te",
                         johdin_inen:     "ks",

                         nimentö_t: "de",
                         omanto_ien: "ks",
                         osanto_iA: "ks",
                         olento_inA: "ks",
                         sija_monikko_1: "ks",
                         sisätulento_iin: "ks",
                         ulkopaikallissija_illA: "ks",
                         vajanto_ittA: "ks",
                         seuranto_ine: "ks"]);
end;


subrule vieras ($tietue, $vahva_aste, $heikko_aste, $monikko, $johdin_Us):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste, $heikko_aste,
                                  $vahva_aste, $vahva_aste,
                                  [osanto_tA: $heikko_aste], sisätulento_seen,
                                  $vahva_aste, $heikko_aste) +
                        [johdin_tOn:        $vahva_aste,
                         johdin_Us:         $johdin_Us,
                         johdin_mAinen:     $heikko_aste,
                         johdin_lAinen:     $vahva_aste,
                         johdin_inen:       $monikko,

                         nimentö_t:         $vahva_aste,
                         omanto_iT:         $monikko,
                         omanto_ten:        $heikko_aste,
                         osanto_itA:        $monikko,
                         olento_inA:        $monikko,
                         sija_monikko_1:      $monikko,
                         sisätulento_isiin: $monikko,
                         sisätulento_ihin:  $monikko,
                         ulkopaikallissija_illA:  $monikko,
                         vajanto_ittA:      $monikko,
                         seuranto_ine:      $monikko,
                         johdin_ittAin:     $monikko,
                         yliaste:           $monikko]) +
         voikko_lista_vain_lipulla(vanhat_muodot, 
                        s_hV_loppuinen ($tietue,
                                        $monikko + hA($tietue),
                                        $monikko + "h") + # vierahat
                        taivutuskaava ($tietue,
                                        [olento_nA: $heikko_aste])  # Vieras+na.
                       );
end;


subrule kauris ($tietue, $kerake):
  define $vahva_aste := $kerake + "ii";
  define $monikko := $kerake + "i";

  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste, "is", $vahva_aste, $vahva_aste,
                                  [osanto_tA: "is"], sisätulento_seen,
                                  $vahva_aste, "is") +
                        [johdin_tOn:        $vahva_aste,
                         johdin_Us:         $monikko,
                         johdin_mAinen:     "is",
                         johdin_inen:       $kerake + "i",

                         nimentö_t:         $vahva_aste,
                         omanto_iT:         $monikko,
                         omanto_ten:        "is",
                         osanto_itA:        $monikko,
                         olento_inA:        $monikko,
                         sija_monikko_1:      $monikko,
                         sisätulento_isiin: $monikko,
                         sisätulento_ihin:  $monikko,
                         ulkopaikallissija_illA:  $monikko,
                         vajanto_ittA:      $monikko,
                         seuranto_ine:      $monikko,
                         johdin_ittAin:     $monikko,
                         yliaste:           $kerake + "e"]) +
         voikko_lista_vain_lipulla(vanhat_muodot,
	                 taivutuskaava ($tietue,
                                        [olento_nA: "is"])  # Kauris+na.
			 );
end;


subrule salaus ($tietue, $vahva_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;
  $tietue.alku :=+ $vahva_aste;
  $tietue.perusmuoto := $tietue.alku + U($tietue) + "s";
  return vastaus ($tietue);
end;


subrule vastaus ($tietue):
  return taivutuskaava ($tietue,
                        yksikkö8 ("kse", "s", "kse", "kse",
                                  [osanto_tA: "s"], sisätulento_Vn,
                                  "kse", "s") +
                        [johdin_tOn:      "kse",
                         johdin_lAinen:   "s",
                         johdin_mAinen:   "s",
                         johdin_inen:     "ks",

                         nimentö_t:        "kse",
                         omanto_ten:       "s",
                         omanto_ien:       "ks",
                         osanto_iA:        "ks",
                         olento_inA:       "ks",
                         sija_monikko_1:     "ks",
                         sisätulento_iin:  "ks",
                         ulkopaikallissija_illA: "ks",
                         vajanto_ittA:     "ks",
                         seuranto_ine:     "ks",
                         johdin_ittAin:    "ks"]);
end;


subrule kaunis ($tietue, $kerake, $johdin_Us):
  define $vahva_aste := $kerake + "ii";
  define $monikko := $kerake + "i";
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste, "is",
                                  $vahva_aste, $vahva_aste,
                                  [osanto_tA: "is"], sisätulento_seen,
                                  $vahva_aste, "is") +
                        [johdin_tOn:        $vahva_aste,
                         johdin_Us:         $johdin_Us] +
# Ei tarvita johdosta johdin_inen. HV 13.5.2006.
                        monikko7 ($vahva_aste, $monikko, $monikko,
                                  [omanto_iT:  $monikko,
                                   omanto_ten: "is"],
                                  [osanto_itA: $monikko],
                                  [sisätulento_isiin: $monikko,
                                   sisätulento_ihin: $monikko],
                                  $kerake + "e"))
         + s_hV_loppuinen ($tietue,
                           $monikko + "hi",
                           $monikko + "h")
         + taivutuskaava ($tietue,
                          [olento_nA: "is"])  # Kaunis+na.
         + voikko_lista_vain_lipulla(vanhat_muodot, taivutuskaava ($tietue,
                          [omanto_iT:         $kerake + "e",
                           osanto_itA:        $kerake + "e",
                           olento_inA:        $kerake + "e",
                           sija_monikko_1:      $kerake + "e",
                           sisätulento_ihin:  $kerake + "e",
                           sisätulento_isiin: $kerake + "e",
                           ulkopaikallissija_illA:  $kerake + "e",
                           vajanto_ittA:      $kerake + "e",
                           seuranto_ine:          $kerake + "e"]));
end;


subrule paras ($tietue, $vahva_aste, $heikko_aste, $monikko,
               $voittoaste, $yliaste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste, $heikko_aste,
                                  $vahva_aste, $vahva_aste,
                                  [osanto_tA: $heikko_aste],
                                  sisätulento_seen,
                                  $voittoaste, $heikko_aste) +
                         monikko7 ($vahva_aste, $monikko, $monikko,
                                   [omanto_iT:  $monikko,
                                    omanto_ten: $heikko_aste],
                                   [osanto_itA: $monikko],
                                   [sisätulento_isiin: $monikko,
                                    sisätulento_ihin: $monikko], $yliaste));
end;


# Askel- ja askele-tyyppisten sanojen taivutus.
#
# Sanojen taivutusmuotoja käytetään sekaisin, ja tämä
# sääntö tunnistaa molemmat paitsi yksikön nimennössä.
# Kaikilla sanoilla ei ole kahta erilaista yksinön
# nimentöä. On esim. hepene, mutta ei *hepen.
#
# Yksikkö     Monikko    Yksikkö      Monikko
# askel       askelet    askele       askeleet
# askelen     askelien   askeleen     askeleiden
#             askelten                askeleitten
# askelta     askelia    askeletta    askeleita
# askelena    askelina   askeleena    askeleina
# askeleksi   askeliksi  askeleeksi   askeleiksi
# askelessa   askelissa  askeleessa   askeleissa
# askelesta   askelista  askeleesta   askeleista
# askeleen    askeliin   askeleeseen  askeleisiin
#                                     askeleihin
# askelella   askelilla  askeleella   askeleilla
# askelelta   askelilta  askeleelta   askeleilta
# askelelle   askelille  askeleelle   askeleille
# askeletta   askelitta  askeleetta   askeleitta
#             askeline                askeleine
#             askelin                 askelein
#
# Käänteissanakirjassa "askelten" on askele-sanan monikon omanto,
# mutta Perussanakirjassa askel-sanan monikon omanto. Tässä se
# on askel-sanan sijamuoto, koska näin ohjelman saadaan
# vähän yksinkertaisemmaksi.

subrule taival ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + "e", $heikko_aste,
                                  $vahva_aste + "e", $vahva_aste + "e",
                                  [osanto_tA:  $heikko_aste],
                                  sisätulento_Vn,
                                  $vahva_aste + "e", $heikko_aste) +
                        [johdin_tOn:      $vahva_aste + "e",
                         johdin_mAinen:   $heikko_aste,
                         johdin_inen:     $vahva_aste + "e",

                         nimentö_t:        $vahva_aste + "e",
                         omanto_ien:       $vahva_aste,
                         omanto_ten:       $heikko_aste,
                         osanto_iA:        $vahva_aste,
                         olento_inA:       $vahva_aste,
                         sija_monikko_1:     $vahva_aste,
                         sisätulento_iin:  $vahva_aste,
                         ulkopaikallissija_illA: $vahva_aste,
                         vajanto_ittA:     $vahva_aste,
                         seuranto_ine:     $vahva_aste,
                         johdin_ittAin:    $vahva_aste]) +
# Taipale

         taivutuskaava ($tietue,
                        [omistusliite:     $vahva_aste + "ee",
                         nimentö:          $vahva_aste + "e",
                         omanto_n:         $vahva_aste + "ee",
                         osanto_ttA:       $vahva_aste + "e",
                         olento_nA:        $vahva_aste + "ee",
                         tulento_ksi:      $vahva_aste + "ee",
                         sisäolento_ssA:   $vahva_aste + "ee",
                         sisätulento_seen: $vahva_aste + "ee",
                         ulkopaikallissija_llA:  $vahva_aste + "ee",
                         vajanto_ttA:      $vahva_aste + "ee"]
                        + yhdyssana ($vahva_aste + "e") +

                        [johdin_tOn:       $vahva_aste + "ee",
                         johdin_mAinen:    $vahva_aste + "e",
                         johdin_inen:      $vahva_aste,

                         nimentö_t:         $vahva_aste + "ee",
                         omanto_iT:         $vahva_aste + "e",
                         osanto_itA:        $vahva_aste + "e",
                         olento_inA:        $vahva_aste + "e",
                         sija_monikko_1:      $vahva_aste + "e",
                         sisätulento_isiin: $vahva_aste + "e",
                         sisätulento_ihin:  $vahva_aste + "e",
                         ulkopaikallissija_illA:  $vahva_aste + "e",
                         vajanto_ittA:      $vahva_aste + "e",
                         seuranto_ine:      $vahva_aste + "e",
                         johdin_ittAin:     $vahva_aste + "e"]);
end;


# Loppu-s muuttuu ääntiöksi.
# Vai ne sijamuodot, joissa muutos tapahtuu.
#
# Kaunis -> kaun+i+in, kauni++iden.
# Altis  -> Alt+ti+in, alt+ti+iden.
# Uros   -> ur+o+on,   uro++iden.
#
# Parametrit $yksikkö ja $monikko ovat plusmerkkien välissä oleva sanan osa.
#
subrule s_V_loppuinen ($tietue, $yksikkö, $monikko):
  return taivutuskaava ($tietue,
                        [omistusliite:     $yksikkö,
                         omanto_n:         $yksikkö,
                         olento_nA:        $yksikkö,
                         tulento_ksi:      $yksikkö,
                         sisäolento_ssA:   $yksikkö,
                         sisätulento_seen: $yksikkö,
                         ulkopaikallissija_llA:  $yksikkö,
                         vajanto_ttA:      $yksikkö,

                         nimentö_t:         $yksikkö,
                         omanto_iT:         $monikko,
                         osanto_itA:        $monikko,
                         olento_inA:        $monikko,
                         sija_monikko_1:      $monikko,
                         sisätulento_isiin: $monikko,
                         sisätulento_ihin:  $monikko,
                         ulkopaikallissija_illA:  $monikko,
                         vajanto_ittA:      $monikko,
                         seuranto_ine:      $monikko]);
end;


# Loppu-s muuttuu h:ksi + ääntiöksi.
# Vai ne sijamuodot, joissa muutos tapahtuu.

# Kaunis -> kaunihin.
# Uros   -> urohon.

subrule s_hV_loppuinen ($tietue, $yksikkö, $monikko):
  return voikko_lista_vain_lipulla(vanhahkot_muodot, taivutuskaava ($tietue,
                        [omistusliite:     $yksikkö,
                         omanto_n:         $yksikkö,
                         olento_nA:        $yksikkö,
                         tulento_ksi:      $yksikkö,
                         sisäolento_ssA:   $yksikkö,
                         sisätulento_sen:  $yksikkö,
                         ulkopaikallissija_llA:  $yksikkö,
                         vajanto_ttA:      $yksikkö,
                         voittoaste:       $yksikkö,

                         nimentö_t:         $yksikkö,
                         omanto_ien:        $monikko,
                         omanto_iT:         $monikko,
                         osanto_iA:         $monikko,
                         olento_inA:        $monikko,
                         sija_monikko_1:      $monikko,
                         sisätulento_isin:  $monikko,
                         ulkopaikallissija_illA:  $monikko,
                         vajanto_ittA:      $monikko,
                         seuranto_ine:      $monikko,
                         yliaste:           $monikko]));
end;


subrule nainen ($tietue):
    return taivutuskaava ($tietue,
                          [omistusliite:     "se",
                           nimentö:          "nen",
                           omanto_n:         "se",
                           osanto_tA:        "s",
                           olento_nA:        "se",
                           tulento_ksi:      "se",
                           sisäolento_ssA:   "se",
                           sisätulento_Vn:   "se",
                           ulkopaikallissija_llA:  "se",
                           vajanto_ttA:      "se",
                           kerronto_sti :    "se",
                           voittoaste:       "se",
                           johdin_tOn:       "se",
                           johdin_UUs:       "s",
                           johdin_lAinen:    "s",
                           johdin_mAinen:    "s",
                           nimentö_t:        "se",
                           omanto_ien:       "s",
                           omanto_ten:       "s",
                           osanto_iA:        "s",
                           olento_inA:       "s",
                           sija_monikko_1:     "s",
                           sisätulento_iin:  "s",
                           ulkopaikallissija_illA: "s",
                           vajanto_ittA:     "s",
                           seuranto_ine:     "s",
                           yliaste:          "s",
                           johdin_ittAin:    "s",
                           tavuviiva:        "s"]
                          + yhdyssana ("s"));
end;


subrule vihanta ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        yksikkö8 ($vahva_aste + A($tietue), $vahva_aste + A($tietue),
                                  $vahva_aste + A($tietue), $heikko_aste + A($tietue),
                                  [osanto_A:  $vahva_aste  + A($tietue),
                                   osanto_tA: $vahva_aste  + A($tietue)],
                                  sisätulento_Vn,
                                  $heikko_aste + A($tietue),
                                  $vahva_aste + A($tietue)) +
                        [johdin_tOn:      $heikko_aste + A($tietue),
                         johdin_UUs:      $heikko_aste,
                         johdin_inen:     $vahva_aste + A($tietue)] +
                        monikko7 ($heikko_aste + A($tietue),
                                  $vahva_aste, $heikko_aste,
                                  [omanto_ien:       $vahva_aste,
                                   omanto_iT:        $vahva_aste + O($tietue),
                                   omanto_in:        $vahva_aste + A($tietue),
                                   omanto_jen:       $vahva_aste + O($tietue)],
                                  [osanto_iA:        $vahva_aste,
                                   osanto_itA:       $vahva_aste + O($tietue),
                                   osanto_jA:        $vahva_aste + O($tietue)],
                                  [sisätulento_ihin: $vahva_aste + O($tietue),
                                   sisätulento_iin:  $heikko_aste],
                                  $heikko_aste)) +
         taivutuskaava ($tietue,
                        [omanto_iT:        $heikko_aste + O($tietue),
                         osanto_itA:       $heikko_aste + O($tietue),
                         sisätulento_ihin: $heikko_aste + O($tietue)]);
end;


###########################################################################


# Teonsanat.


subrule punoa ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $heikko_aste)
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste, $heikko_aste,
                                    $vahva_aste, $heikko_aste, 
                                    tositapa_4_tt ($heikko_aste)) +
                          ehtotapa_ttA     ($tietue, $vahva_aste, $heikko_aste) +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste, $heikko_aste) +
                          käskytapa_ttA    ($tietue, $vahva_aste, $heikko_aste) +
                          nimitapa_laatutapa ($tietue, $vahva_aste, $heikko_aste) +
                          [johdin_ntA: $heikko_aste])
         + tekijännimi ($tietue, $vahva_aste, kantaja);
end;


subrule punoa_punottaa ($tietue, $vahva_aste, $heikko_aste):
  return punoa ($tietue, $vahva_aste, $heikko_aste)
         + punottaa ($tietue, $heikko_aste);
end;


subrule muistaa ($tietue,
                 $vahva_aste, $heikko_aste,
                 $kertoman_vahva_aste, $kertoman_heikko_aste):
  define $tekijä4 := $kertoman_heikko_aste + "e";

  return käskytapa ($tietue, $heikko_aste)
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste, $heikko_aste,
                                    $kertoman_vahva_aste, $kertoman_heikko_aste,
                                    tositapa_4_tt ($tekijä4)) +
                          ehtotapa_ttA     ($tietue, $vahva_aste, $tekijä4) +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste, $tekijä4) +
                          käskytapa_ttA    ($tietue, $vahva_aste, $tekijä4) +
                          nimitapa_laatutapa ($tietue, $vahva_aste, $tekijä4))
         + tekijännimi ($tietue, $vahva_aste, kantaja);
end;


subrule muistella ($tietue, $vahva_aste, $heikko_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.perusmuoto := $tietue.alku + $heikko_aste + "el" + lA($tietue);
  return katsella ($tietue, $vahva_aste + "el", $heikko_aste + "el");
end;


subrule muistaa_muistella ($tietue,
                           $vahva_aste, $heikko_aste,
                           $kertoman_vahva_aste, $kertoman_heikko_aste):
  return muistaa ($tietue,
                  $vahva_aste, $heikko_aste,
                  $kertoman_vahva_aste, $kertoman_heikko_aste)
         + muistella ($tietue, $kertoman_vahva_aste, $kertoman_heikko_aste);
end;


subrule muistua ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.alku :=+ U($tietue);
  $tietue.perusmuoto := $tietue.alku + A($tietue);
  return punoa ($tietue, "", "");
end;


subrule kaivaa ($tietue, $vahva_aste, $heikko_aste, $tekijännimi):
  return käskytapa ($tietue, $heikko_aste + A($tietue))
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + A($tietue),
                                    $heikko_aste + A($tietue),
                                    $vahva_aste + O($tietue),
                                    $heikko_aste + O($tietue),
                                    tositapa_4_tt ($heikko_aste + "e")) +
                          ehtotapa_ttA     ($tietue, $vahva_aste + A($tietue),
                                            $heikko_aste + "e") +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste + A($tietue),
                                            $heikko_aste + "e") +
                          käskytapa_ttA    ($tietue, $vahva_aste + A($tietue),
                                            $heikko_aste + "e") +
                          nimitapa_laatutapa ($tietue, $vahva_aste + A($tietue),
                                              $heikko_aste + "e"))
         + tekijännimi ($tietue, $vahva_aste + A($tietue), $tekijännimi);
end;


subrule sallia ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $heikko_aste + "i")
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + "i", $heikko_aste + "i",
                                    $vahva_aste, $heikko_aste,
                                    tositapa_4_tt ($heikko_aste + "i")) +
                          ehtotapa_ttA     ($tietue, $vahva_aste,       $heikko_aste + "i") +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste + "i", $heikko_aste + "i") +
                          käskytapa_ttA    ($tietue, $vahva_aste + "i", $heikko_aste + "i") +
                          nimitapa_laatutapa ($tietue, $vahva_aste + "i",
                                              $heikko_aste + "i") +
                          [johdin_ntA: $heikko_aste + "i"])
         + tekijännimi ($tietue, $vahva_aste + "i", kulkija);
end;


subrule katsella ($tietue, $vahva_aste, $heikko_aste):
  return  ehtotapa2 ($tietue, $vahva_aste + "e")
        + käskytapa ($tietue, $vahva_aste + "e")
         + taivutuskaava ($tietue,
                          tositapa ($tietue,  $vahva_aste + "e", $vahva_aste + "e",
                                    $vahva_aste, $vahva_aste,
                                    tositapa_4_l ($heikko_aste)) +
                          ehtotapa_tA     ($tietue, $vahva_aste, $heikko_aste) +
                          mahtotapa_le_tA ($tietue, $heikko_aste, $heikko_aste) +
                          käskytapa_tA    ($tietue, $heikko_aste, $heikko_aste) +
                          [nimitapa_1_lA:   $heikko_aste,
                           nimitapa_2:      $heikko_aste + "l",
                           nimitapa_2_tA:   $heikko_aste] +
                          nimitapa_3_tA_4 ($tietue, $vahva_aste + "e", $heikko_aste) +
                          laatutapa_1_tA  ($tietue, $vahva_aste + "e", $heikko_aste) +
                          laatutapa_2_lUt ($tietue, $heikko_aste))
         + tekijännimi ($tietue, $vahva_aste + "i", kulkija)
         + sana_U ($tietue, $vahva_aste);  # Katselu.
end;


subrule katketa_kohota ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $vahva_aste + A($tietue))
         + taivutuskaava ($tietue,
                          tositapa ($tietue,
                                    $vahva_aste + A($tietue), $vahva_aste + A($tietue),
                                    $vahva_aste + "s", $vahva_aste + "s",
                                    tositapa_4_tt ($heikko_aste)) +
                          ehtotapa_ttA     ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                          mahtotapa_ne_ttA ($tietue, $heikko_aste + "n",       $heikko_aste) +
                          käskytapa_ttA    ($tietue, $heikko_aste + "t",       $heikko_aste) +
                          [nimitapa_1_tA:   $heikko_aste,
                           nimitapa_2:      $heikko_aste + "t",
                           nimitapa_2_ttA:  $heikko_aste] +
                          nimitapa_3_ttA_4 ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                          laatutapa_1_ttA ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                          laatutapa_2_nUt_ttU ($tietue, $heikko_aste + "n", $heikko_aste) +
                          [johdin_ntA: $heikko_aste])
         + taivutuskaava ($tietue, [ehtotapa: $vahva_aste])   # Katke+isi, koho+isi.
         + tekijännimi ($tietue, $vahva_aste + A($tietue), kantaja);
end;


subrule katketa ($tietue, $vahva_aste, $heikko_aste):
  return katketa_kohota ($tietue, $vahva_aste, $heikko_aste)
    + voikko_lista_vain_lipulla(vanhat_muodot,
             tositavan_kestämä ($tietue, $vahva_aste + "e",
                                 $vahva_aste + "e")             # Katke+en, jne.
           + tositavan_kestämä_y3 ($tietue, $vahva_aste + "e")  # Katkee.
           + käskytapa ($tietue, $vahva_aste + "e"));            # Katkee.
end;


subrule nuolaista ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $vahva_aste + "e")
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + "e", $vahva_aste + "e",
                                    $vahva_aste, $vahva_aste,
                                    tositapa_4_t ($heikko_aste)) +
                          ehtotapa_tA     ($tietue, $vahva_aste,  $heikko_aste) +
                          mahtotapa_se_tA ($tietue, $heikko_aste,  $heikko_aste) +
                          käskytapa_tA    ($tietue, $heikko_aste, $heikko_aste) +
                          [nimitapa_1_tA:   $heikko_aste,
                           nimitapa_2:      $heikko_aste + "t",
                           nimitapa_2_tA:   $heikko_aste] +
                          nimitapa_3_tA_4 ($tietue, $vahva_aste + "e", $heikko_aste) +
                          laatutapa_1_tA ($tietue, $vahva_aste + "e", $heikko_aste) +
                          laatutapa_2_sUt ($tietue, $heikko_aste))
         + tekijännimi ($tietue, $vahva_aste + "i", kulkija);   # Nuolaisija.
end;


subrule nuolaista2 ($tietue):
    return nuolaista ($tietue, "is", "is")  # Nuolaista.
           + sana_U ($tietue, "is");        # Nuolaisu.
end;



# Vain kerakevartaloisia muotoja.
#
subrule seistä ($tietue):
  return taivutuskaava ($tietue,
                        [tositavan_kestämä_tAAn: "",
                         tositavan_kertoma_tiin: "",
                         ehtotapa_tA: "",
                         mahtotapa_se: "",
                         mahtotapa_tA: "",
                         käskytapa: "",
                         käskytapa_tA: "",
                         nimitapa_1_tA: "",
                         nimitapa_2: "t",
                         nimitapa_2_tA: "",
                         nimitapa_3_tA: "",
                         johdin_tAvA: "",
                         johdin_sUt_stU: ""]);
end;


subrule sana_U ($tietue, $lisä):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $lisä + U($tietue);
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku;

  return arvelu ($tietue, "", "");
end;


subrule aavistus ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ U($tietue);
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku + "s";

  return vastaus ($tietue);
end;


subrule sana_Us ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ "k" + U($tietue) + U($tietue);
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku + "s";

  return kalleus ($tietue);
end;


subrule sana_Vs ($tietue, $lisä):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $lisä;
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku +"s";

  return vastaus ($tietue);
end;

subrule murros ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ "ro";
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku +"s";
  $tietue.äs := a;

  return vastaus ($tietue);
end;

# Kirjoittaa, kirjottaa => kirjoittautua, kirjottautua.
#
subrule kirjoittautua ($tietue, $lisä):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $lisä + A($tietue) + U($tietue);
  $tietue.perusmuoto := $tietue.alku + "t" + U($tietue) + A($tietue);
  return antautua ($tietue, tU($tietue), dU($tietue));
end;


# Kirjoittaa, kirjottaa => kirjoitella, kirjotella.
#
subrule kirjoitella ($tietue, $lisä):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $lisä;
  $tietue.perusmuoto := $tietue.alku + "el" + lA($tietue);
  return katsella ($tietue, "tel", "el");
end;


subrule selvitä ($tietue, $vahva_aste, $heikko_aste):
   return haluta ($tietue, $vahva_aste, $heikko_aste);
end;


subrule kohota ($tietue, $vahva_aste, $heikko_aste):
  return katketa_kohota ($tietue, $vahva_aste, $heikko_aste)
  + voikko_lista_vain_lipulla(vanhat_muodot,
         tositavan_kestämä ($tietue, $vahva_aste + O($tietue),
                              $vahva_aste + O($tietue))               # Koho+on, jne.
         + tositavan_kestämä_y3 ($tietue, $vahva_aste + O($tietue))   # Kohoo.
         + käskytapa ($tietue, $vahva_aste + O($tietue))              # Kohoo.
         + tekijännimi ($tietue, $vahva_aste + O($tietue), kantaja)); # Kohooja.
end;


subrule kohota_kohoilla ($tietue, $vahva_aste, $heikko_aste):
  return kohota ($tietue, $vahva_aste, $heikko_aste)
         + salailla ($tietue, $vahva_aste);  # Kohota => kohoilla.
end;


subrule haluta ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        tositapa ($tietue,
                                  $vahva_aste + A($tietue), $vahva_aste + A($tietue),
                                  $vahva_aste + "s", $vahva_aste + "s",
                                  tositapa_4_tt ($heikko_aste)) +
                        ehtotapa_ttA     ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                        mahtotapa_ne_ttA ($tietue, $heikko_aste + "n",       $heikko_aste) +
                        käskytapa_ttA    ($tietue, $heikko_aste + "t",       $heikko_aste) +
                        [nimitapa_1_tA:   $heikko_aste,
                         nimitapa_2:      $heikko_aste + "t",
                         nimitapa_2_ttA:  $heikko_aste] +
                        nimitapa_3_ttA_4 ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                        laatutapa_1_ttA ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                        laatutapa_2_nUt_ttU ($tietue, $heikko_aste + "n", $heikko_aste))
         + käskytapa ($tietue, $vahva_aste + A($tietue))
         + tekijännimi ($tietue, $vahva_aste + A($tietue), kantaja);
end;


subrule kihistä ($tietue):
  return nuolaista ($tietue, "is", "is")
         + kihajaa ($tietue);
end;


subrule kihajaa ($tietue):
  $tietue.äs := ääntiösointu_kihistä ($tietue);

  return tositavan_kestämä ($tietue, AjA($tietue), AjA($tietue))  # Kihaja+n.
         + tositavan_kertoma ($tietue, Aj($tietue), Aj($tietue))  # Kihaj+i.
         + ehtotapa2 ($tietue, AjA($tietue));                     # Kihaja+isi.
end;


subrule kihinä ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ "in";
  $tietue.luokka := nimisana;
  $tietue.perusmuoto := $tietue.alku + A($tietue);

  return apila ($tietue, A($tietue), O($tietue));
end;


subrule kihahtaa ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.äs := ääntiösointu_kihistä ($tietue);
  $tietue.alku :=+ A($tietue) + "h";
  $tietue.perusmuoto := $tietue.alku + "t" + AA($tietue);
  return  muistaa_muistella ($tietue, tA($tietue), dA($tietue), "t", "d")
          + taivutuskaava ($tietue, [johdin_Us_ksen: "d"]);  # Kihahdus.
end;


subrule kihauttaa_kihautella ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.äs := ääntiösointu_kihistä ($tietue);
  $tietue.alku :=+ A($tietue) + U($tietue) + "t";
  $tietue.perusmuoto := $tietue.alku + "t" + AA($tietue);
  return muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "")
         + taivutuskaava ($tietue, [johdin_Us_ksen: ""]);  # Kihautus.
end;


subrule antautua ($tietue, $vahva_aste, $heikko_aste):
    return punoa ($tietue, $vahva_aste, $heikko_aste);
end;


subrule laskea ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $heikko_aste + "e")
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + "e", $heikko_aste + "e",
                                    $vahva_aste, $heikko_aste,
                                    tositapa_4_tt ($heikko_aste + "e")) +
                          ehtotapa_ttA     ($tietue, $vahva_aste,       $heikko_aste + "e") +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste + "e", $heikko_aste + "e") +
                          käskytapa_ttA    ($tietue, $vahva_aste + "e", $heikko_aste + "e") +
                          nimitapa_laatutapa_i ($tietue,
                                                $vahva_aste + "e",
                                                $heikko_aste + "e",
                                                $vahva_aste + "i") +
                          [johdin_ntA: $heikko_aste + "e"])
         + tekijännimi ($tietue, $vahva_aste + "i", kulkija);
end;


subrule laskea_laskeskella ($tietue, $vahva_aste, $heikko_aste):
  return laskea ($tietue, $vahva_aste, $heikko_aste)
         + muistella ($tietue,
                      $heikko_aste + "esk",
                      $heikko_aste + "esk"); # Laskeskella.
end;


subrule haastaa_haastella ($tietue, $vahva_aste, $heikko_aste):
  return tositavan_kertoma ($tietue, $vahva_aste, $heikko_aste)
         + käskytapa ($tietue, $heikko_aste + A($tietue))
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + A($tietue), $heikko_aste + A($tietue),
                                    $vahva_aste + O($tietue), $heikko_aste + O($tietue),
                                    tositapa_4_tt ($heikko_aste + "e")) +
                          ehtotapa_ttA     ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          käskytapa_ttA    ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          nimitapa_laatutapa ($tietue,
                                              $vahva_aste + A($tietue),
                                              $heikko_aste + "e"))
         + tekijännimi ($tietue, $vahva_aste + A($tietue), kantaja)
         + muistella ($tietue, $vahva_aste, $heikko_aste);     # Haastella.
end;


subrule huutaa ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $heikko_aste + A($tietue))
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + A($tietue), $heikko_aste + A($tietue), 
                                    "s", "s", tositapa_4_tt ($heikko_aste + "e")) +
                          ehtotapa_ttA     ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          käskytapa_ttA    ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          [nimitapa_1_A:    $vahva_aste + A($tietue),
                           nimitapa_2:      $vahva_aste + A($tietue),
                           nimitapa_2_ttA:  $heikko_aste + "e"] +
                          nimitapa_3_ttA_4 ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          laatutapa_1_ttA ($tietue,
                                           $vahva_aste + A($tietue),
                                           $heikko_aste + "e") +
                          laatutapa_2_nUt_ttU ($tietue,
                                               $vahva_aste + A($tietue),
                                               $heikko_aste + "e"))
         + tekijännimi ($tietue, $vahva_aste + A($tietue), kantaja);
end;


subrule aleta ($tietue, $vahva_aste, $heikko_aste):
  return käskytapa ($tietue, $vahva_aste + "ne")
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + "ne",
                                    $vahva_aste + "ne",
                                    $vahva_aste + "n", $vahva_aste + "n",
                                    tositapa_4_tt ($heikko_aste)) +
                          ehtotapa_ttA     ($tietue, $vahva_aste  + "n",
                                            $heikko_aste) +
                          mahtotapa_ne_ttA ($tietue, $heikko_aste + "n",
                                            $heikko_aste) +
                          käskytapa_ttA    ($tietue, $heikko_aste + "t",
                                            $heikko_aste) +
                          [nimitapa_1_tA:   $heikko_aste,
                           nimitapa_2:      $heikko_aste + "t",
                           nimitapa_2_ttA:  $heikko_aste] +
                          nimitapa_3_ttA_4 ($tietue, $vahva_aste + "ne",
                                            $heikko_aste) +
                           laatutapa_1_ttA ($tietue, $vahva_aste + "ne",
                                            $heikko_aste) +
                           laatutapa_2_nUt_ttU ($tietue, $heikko_aste + "n",
                                                $heikko_aste))
         + taivutuskaava ($tietue, [ehtotapa: $vahva_aste + "ne"])  # Aleneisi.
         + tekijännimi ($tietue, $vahva_aste + "ni", kulkija);
end;


subrule alentaa ($tietue, $heikko_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $heikko_aste + "n";
  $tietue.perusmuoto := $tietue.alku + tAA($tietue);
  return huutaa ($tietue, "t", "n")
         + taivutuskaava ($tietue, [johdin_Us_ksen: "n"]);  # Alennus.
end;


subrule alentua ($tietue, $heikko_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $heikko_aste + "n";
  $tietue.perusmuoto := $tietue.alku + "t" + UA($tietue);
  return punoa ($tietue, tU($tietue), nU($tietue));
end;


subrule alennella ($tietue, $heikko_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $heikko_aste + "n";
  $tietue.luokka := teonsana;
  $tietue.perusmuoto := $tietue.alku + "nel" + lA($tietue);
#define $a := transmit ($tietue.perusmuoto);
  return katsella ($tietue, "tel", "nel");
end;


subrule salata ($tietue, $vahva_aste, $heikko_aste):
  return tositavan_kestämä_y3 ($tietue, $vahva_aste + A($tietue))
         + taivutuskaava ($tietue,
                          tositapa_ei_kestämä_y3
                            ($tietue,
                             $vahva_aste + A($tietue),
                             $vahva_aste + A($tietue),
                             $vahva_aste + "s",
                             $vahva_aste + "s",
                             tositapa_4_tt ($heikko_aste)) +
                          ehtotapa_ttA     ($tietue, $vahva_aste,  $heikko_aste) +
                          mahtotapa_ne_ttA ($tietue, $heikko_aste + "n", $heikko_aste) +
                          käskytapa_ttA    ($tietue, $heikko_aste + "t", $heikko_aste) +
                          [nimitapa_1_tA:  $heikko_aste,
                           nimitapa_2:     $heikko_aste + "t",
                           nimitapa_2_ttA: $heikko_aste] +
                          nimitapa_3_ttA_4 ($tietue, $vahva_aste + A($tietue), $heikko_aste) +
                          laatutapa_1_ttA ($tietue,
                                           $vahva_aste + A($tietue),
                                           $heikko_aste) +
                          laatutapa_2_nUt_ttU ($tietue,
                                               $heikko_aste + "n",
                                               $heikko_aste) +
                          [johdin_Us_ksen: $vahva_aste])
         + tekijännimi ($tietue, $vahva_aste + A($tietue), kantaja);
end;


subrule salata_salailla ($tietue, $vahva_aste, $heikko_aste):
  return salata ($tietue, $vahva_aste, $heikko_aste)
         + salailla ($tietue, $vahva_aste);
end;


subrule arvailla ($tietue):
  return ehtotapa2 ($tietue, "e")
         + käskytapa ($tietue, "e")
         + taivutuskaava ($tietue,
                          tositapa ($tietue,  "e", "e", "", "",
                                    tositapa_4_l ("")) +
                          ehtotapa_tA     ($tietue, "", "") +
                          mahtotapa_le_tA ($tietue, "", "") +
                          käskytapa_tA    ($tietue, "", "") +
                          [nimitapa_1_lA:   "",
                           nimitapa_2:      "l",
                           nimitapa_2_tA:   ""] +
                           nimitapa_3_tA_4 ($tietue, "e", "") +
                           laatutapa_1_tA  ($tietue, "e", "") +
                           laatutapa_2_lUt ($tietue, ""))
         + tekijännimi ($tietue, "i", kulkija)
         + sana_U ($tietue, "");
end;


subrule paistaa ($tietue, $vahva_aste, $heikko_aste):
  return tositavan_kertoma ($tietue, $vahva_aste, $heikko_aste)
         + käskytapa ($tietue, A($tietue))
         + taivutuskaava ($tietue,
                          tositapa ($tietue, $vahva_aste + A($tietue), $vahva_aste + A($tietue),
                                    $vahva_aste + O($tietue), $heikko_aste + O($tietue),
                                    tositapa_4_tt ($heikko_aste + "e")) +
                          ehtotapa_ttA     ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          mahtotapa_ne_ttA ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          käskytapa_ttA    ($tietue, $vahva_aste + A($tietue), $heikko_aste + "e") +
                          nimitapa_laatutapa ($tietue,
                                              $vahva_aste + A($tietue),
                                              $heikko_aste + "e"))
         + tekijännimi ($tietue, $vahva_aste + A($tietue), kulkija);
end;


subrule voida ($tietue, $lisä1, $lisä2):
  return tositavan_kestämä_y3 ($tietue, $lisä1)
         + käskytapa ($tietue, $lisä1)
         + taivutuskaava ($tietue,
                          tositapa_ei_kestämä_y3
                            ($tietue, $lisä1, $lisä1, $lisä2, $lisä2,
                             tositapa_4_d ($lisä1)) +
                          ehtotapa_tA      ($tietue, $lisä2, $lisä1) +
                          mahtotapa_ne_tA  ($tietue, $lisä1, $lisä1) +
                          käskytapa_tA     ($tietue, $lisä1, $lisä1) +
                          [nimitapa_1_dA:   $lisä1,
                           nimitapa_2:      $lisä1 + "d",
                           nimitapa_2_tA:   $lisä1] +
                          nimitapa_3_tA_4 ($tietue, $lisä1, $lisä1) +
                          [johdin_vE:      $lisä1,
                           johdin_tAvA:    $lisä1] +
                          laatutapa_2_nUt_dU ($tietue, $lisä1, $lisä1) +
                          [johdin_nti: $lisä1])
         + tekijännimi ($tietue, $lisä1, myyjä);
end;


subrule kanavoida ($tietue, $lisä1, $lisä2):
  return tositavan_kestämä_y3 ($tietue, $lisä1)
         + käskytapa ($tietue, $lisä1)
         + taivutuskaava ($tietue,
                          tositapa_ei_kestämä_y3
                            ($tietue, $lisä1, $lisä1, $lisä2, $lisä2,
                             tositapa_4_d ($lisä1)) +
                          ehtotapa_tA      ($tietue, $lisä2, $lisä1) +
                          mahtotapa_ne_tA  ($tietue, $lisä1, $lisä1) +
                          käskytapa_tA     ($tietue, $lisä1, $lisä1) +
                          [nimitapa_1_dA:   $lisä1,
                           nimitapa_2:      $lisä1 + "d",
                           nimitapa_2_tA:   $lisä1] +
                          nimitapa_3_tA_4 ($tietue, $lisä1, $lisä1) +
                          laatutapa_1_tA ($tietue, $lisä1, $lisä1) +
                          laatutapa_2_nUt_dU ($tietue, $lisä1, $lisä1) +
                          [johdin_nti: $lisä1])
         + tekijännimi ($tietue, $lisä1, myyjä);
end;


subrule tulla ($tietue, $tositapa_4, $mahtotapa,
               $nimitapa_1, $nimitapa_2_lisä, $laatutapa_2):
  return käskytapa ($tietue, "e")
         + taivutuskaava ($tietue,
                          tositapa ($tietue,  "e", "e", "", "", $tositapa_4) +
                          [ehtotapa:        "",
                           ehtotapa_tA:     "",
                           $mahtotapa:      "",
                           mahtotapa_tA:    "",
                           käskytapa:       "",
                           käskytapa_tA:    "",
                           $nimitapa_1:     "",
                           nimitapa_2:      $nimitapa_2_lisä,
                           nimitapa_2_tA:   ""] +
                          nimitapa_3_tA_4 ($tietue, "e", "") +
                          laatutapa_1_tA ($tietue, "e", "") +
                          $laatutapa_2)
         + tekijännimi ($tietue, "i", kulkija);
end;


subrule ehtotapa_tA ($tietue, $vahva_aste, $heikko_aste):
  return [ehtotapa: $vahva_aste, ehtotapa_tA: $heikko_aste];
end;


subrule ehtotapa_ttA ($tietue, $vahva_aste, $heikko_aste):
  return [ehtotapa: $vahva_aste, ehtotapa_ttA: $heikko_aste];
end;


subrule mahtotapa_ne_ttA ($tietue, $vahva_aste, $heikko_aste):
#define $a := transmit ("huuhaa " + $vahva_aste + " " + $heikko_aste);
  return [mahtotapa_ne:        $vahva_aste,
          mahtotapa_ttA:       $heikko_aste];
end;


subrule mahtotapa_se_tA ($tietue, $vahva_aste, $heikko_aste):
  return [mahtotapa_se:        $vahva_aste,
          mahtotapa_tA:        $heikko_aste];
end;


le mahtotapa_ne_tA ($tietue, $vahva_aste, $heikko_aste):
  return [mahtotapa_ne:        $vahva_aste,
          mahtotapa_tA:        $heikko_aste];
end;


subrule mahtotapa_le_tA ($tietue, $vahva_aste, $heikko_aste):
  return [mahtotapa_le:        $vahva_aste,
          mahtotapa_tA:        $heikko_aste];
end;


subrule käskytapa_ttA ($tietue, $vahva_aste, $heikko_aste):
  return [käskytapa:        $vahva_aste,
          käskytapa_ttA:    $heikko_aste];
end;


subrule käskytapa_tA ($tietue, $vahva_aste, $heikko_aste):
  return [käskytapa:        $vahva_aste,
          käskytapa_tA:     $heikko_aste];
end;


subrule nimitapa_3_ttA_4 ($tietue, $vahva_aste, $heikko_aste):
  return [nimitapa_3:       $vahva_aste,
          nimitapa_3_ttA:   $heikko_aste,
          nimitapa_45:       $vahva_aste,
          johdin_mA:        $vahva_aste];
end;


subrule nimitapa_3_tA_4 ($tietue, $vahva_aste, $heikko_aste):
  return [nimitapa_3:       $vahva_aste,
          nimitapa_3_tA:    $heikko_aste,
          nimitapa_45:       $vahva_aste,
          johdin_mA:        $vahva_aste];
end;


subrule nimitapa_laatutapa ($tietue, $vahva_aste, $heikko_aste):
  return nimitapa_laatutapa_i ($tietue, $vahva_aste, $heikko_aste, $vahva_aste);
end;


subrule nimitapa_laatutapa_i ($tietue, $vahva_aste, $heikko_aste, $nimitapa_2):
  return [nimitapa_1_A:    $vahva_aste,
          nimitapa_2:      $nimitapa_2,
          nimitapa_2_ttA:  $heikko_aste] +
         nimitapa_3_ttA_4    ($tietue, $vahva_aste, $heikko_aste) +
         laatutapa_1_ttA     ($tietue, $vahva_aste, $heikko_aste) +
         laatutapa_2_nUt_ttU ($tietue, $vahva_aste, $heikko_aste);
end;


subrule laatutapa_1_tA ($tietue, $vahva_aste, $heikko_aste):
  return [johdin_vA:      $vahva_aste,
          johdin_tAvA:    $heikko_aste];
end;


subrule laatutapa_1_ttA ($tietue, $vahva_aste, $heikko_aste):
  return [johdin_vA:       $vahva_aste,
          johdin_ttAvA:    $heikko_aste];
end;


subrule laatutapa_2_lUt ($tietue, $lisä):
  return [johdin_lUt:      $lisä,
          johdin_tU:       $lisä,
          johdin_lU:       $lisä];
end;


subrule laatutapa_2_nUt ($tietue, $vahva_aste, $heikko_aste):
  return [johdin_nUt:      $vahva_aste,
          johdin_tU:       $heikko_aste,
          johdin_nU:       $heikko_aste];
end;


subrule laatutapa_2_nUt_dU ($tietue, $vahva_aste, $heikko_aste):
  return [johdin_nUt:      $vahva_aste,
          johdin_tU:       $heikko_aste,
          johdin_dU:       $heikko_aste];
end;


subrule laatutapa_2_nUt_ttU ($tietue, $vahva_aste, $heikko_aste):
  return [johdin_nUt:      $vahva_aste,
          johdin_ttU:      $heikko_aste];
end;


subrule laatutapa_2_rUt ($tietue, $vahva_aste, $heikko_aste):
  return [johdin_rUt:      $vahva_aste,
          johdin_tU:       $heikko_aste,
          johdin_rU:       $heikko_aste];
end;


subrule laatutapa_2_sUt ($tietue, $lisä):
  return [johdin_sUt_stU:      $lisä];
end;


subrule eka_kirjain ($sana):
  if ($sana matches "k.*") then
    return "k";
  elseif ($sana matches "p.*") then
    return "p";
  elseif ($sana matches "t.*") then
    return "t";
  else
    error "eka kirjain: 1. kirjain ei ole k, p eikä t";
  end;
end;


# Sana, joka taipuu yksikössä kuten autio.
#
subrule yksikkö_autio ($tietue, $lisä, $osannot):
  if ($tietue.luokka = nimisana) then
    return yksikkö8 ($lisä, $lisä, $lisä, $lisä,
                     $osannot,
                     sisätulento_Vn,
                     $lisä, $lisä) +
           [johdin_tOn:    $lisä,
            johdin_mAinen: $lisä,
            johdin_inen:   $lisä];
  else
    define $johdin := johdin_UUs;
    if (last($tietue.alku) matches @ääntiö) then
      $johdin := johdin_Us;
    end;
    return yksikkö8 ($lisä, $lisä, $lisä, $lisä,
                     $osannot,
                     sisätulento_Vn,
                     $lisä, $lisä) +
           [johdin_tOn:    $lisä,
            johdin_lAinen: $lisä,
            johdin_inen:   $lisä,
            $johdin: ""];
  end;
end;


# Sana, joka taipuu yksikössä kuten tuohi.
#
subrule yksikkö_tuohi ($lisä1, $lisä2):
  return yksikkö8 ($lisä1, $lisä2, $lisä1, $lisä1, 
                    [osanto_tA: ""], sisätulento_Vn,
                   $lisä1, $lisä2) +
         [johdin_tOn:    $lisä1,
          johdin_lAinen: $lisä1,
          johdin_mAinen: $lisä2,
          johdin_inen: ""];
end;


subrule yksikkö_meri ($e, $i):
  return [tavuviiva:       $i,
          omistusliite:    $e,
          nimentö:         $i,
          omanto_n:        $e,
          olento_nA:       $e,  # Mere+nä.
          tulento_ksi:     $e,
          sisäolento_ssA:  $e,
          sisätulento_Vn:  $e,
          ulkopaikallissija_llA: $e,
          vajanto_ttA:     $e,
          kerronto_sti:    $e,
          voittoaste:      $e,
          johdin_tOn:      $e,
          johdin_inen:     ""]
         + yhdyssana ($i);
end;


subrule yksikkö_valo ($vahva_aste, $heikko_aste):
  return [tavuviiva:       $vahva_aste,
          omistusliite:    $vahva_aste,
          nimentö:         $vahva_aste,
          omanto_n:        $heikko_aste,
          osanto_A:        $vahva_aste,
          olento_nA:       $vahva_aste,
          tulento_ksi:     $heikko_aste,
          sisäolento_ssA:  $heikko_aste,
          sisätulento_Vn:  $vahva_aste,
          ulkopaikallissija_llA: $heikko_aste,
          vajanto_ttA:     $heikko_aste,
          kerronto_sti:    $heikko_aste,
          voittoaste:      $heikko_aste,
          johdin_tOn:      $heikko_aste, 
          johdin_Us:       $vahva_aste,
          johdin_lAinen:   $vahva_aste,
          johdin_mAinen:   $vahva_aste,
          johdin_inen:     $vahva_aste]
          + yhdyssana ($vahva_aste);
end;


# Yksikön taivutus.
# osanto  sisätulento
# A       Vn
# A tA    Vn
# tA      Vn
# ttA     Vn
#
# tA      hVn
#
# tA      seen
# ttA     seen

subrule yksikkö8 ($omistusliite,
                  $nimentö,
                  $vahva_aste,
                  $heikko_aste,
                  $osanto,
                  $sisätulento,
                  $voittoaste,
                  $yhdyssana):
  define $st := <>;
  if (value_type($sisätulento) = record) then
    $st := $sisätulento;
  else
    $st := [$sisätulento: $vahva_aste];
  end;

  return [tavuviiva:       $nimentö,
          omistusliite:    $omistusliite,
          nimentö:         $nimentö,
          omanto_n:        $heikko_aste] +
         $osanto +
         [olento_nA:       $vahva_aste,
          tulento_ksi:     $heikko_aste,
          sisäolento_ssA:  $heikko_aste] +
         $st +
         [ulkopaikallissija_llA: $heikko_aste,
          vajanto_ttA:     $heikko_aste,
          kerronto_sti:    $heikko_aste,
          voittoaste:      $voittoaste]
         + yhdyssana ($yhdyssana);
end;


subrule yksikkö8b ($omistusliite,
                   $nimentö,
                   $vahva_aste,
                   $heikko_aste,
                   $osanto,
                   $sisätulento,
                   $yhdyssana):
  define $st := <>;
  if (value_type($sisätulento) = record) then
    $st := $sisätulento;
  else
    $st := [$sisätulento: $vahva_aste];
  end;

  return [tavuviiva:       $nimentö,
          omistusliite:    $omistusliite,
          nimentö:         $nimentö,
          omanto_n:        $heikko_aste] +
         $osanto +
         [olento_nA:       $vahva_aste,
          tulento_ksi:     $heikko_aste,
          sisäolento_ssA:  $heikko_aste] +
         $st +
         [ulkopaikallissija_llA: $heikko_aste,
          vajanto_ttA:     $heikko_aste,
          kerronto_sti:    $heikko_aste]
         + yhdyssana ($yhdyssana);
end;


subrule yksikkö9 ($tietue,
                  $omistusliite,
                  $nimentö,
                  $vahva_aste,
                  $heikko_aste,
                  $osanto,
                  $sisätulento,
                  $voittoaste,
                  $yhdyssana):
  if ($tietue.luokka in <laatusana, nimi_laatusana, johdin_vA>) then
    return yksikkö8 ($omistusliite,
                     $nimentö,
                     $vahva_aste,
                     $heikko_aste,
                     $osanto,
                     $sisätulento,
                     $voittoaste,
                     $yhdyssana);
  else
    return yksikkö8b ($omistusliite,
                      $nimentö,
                      $vahva_aste,
                      $heikko_aste,
                      $osanto,
                      $sisätulento,
                      $yhdyssana);
  end;
end;


subrule monikko6 ($vahva_aste,
                  $heikko_aste,
                  $omanto,
                  $osanto,
                  $sisätulento,
                  $yliaste):
  return $omanto +
         $osanto +
         [olento_inA:       $vahva_aste,
          sija_monikko_1:     $heikko_aste] +
         $sisätulento +
         [ulkopaikallissija_illA: $heikko_aste,
          vajanto_ittA:     $heikko_aste,
          seuranto_ine:     $vahva_aste,
          yliaste:          $yliaste,
          johdin_ittAin:    $heikko_aste];
end;


subrule monikko7 ($nimentö_t,
                  $vahva_aste,
                  $heikko_aste,
                  $omanto,
                  $osanto,
                  $sisätulento,
                  $yliaste):
  define $monikon_nimentö := [nimentö_t: $nimentö_t];
  if (value_type($nimentö_t) = record) then
    $monikon_nimentö := $nimentö_t;
  end;

  return $monikon_nimentö +
         monikko6 ($vahva_aste,
                   $heikko_aste,
                   $omanto,
                   $osanto,
                   $sisätulento,
                   $yliaste);
end;


subrule tositapa_4_d ($lisä):
  return [tositavan_kestämä_dAAn: $lisä,
          tositavan_kertoma_tiin: $lisä];
end;


subrule tositapa_4_l ($lisä):
  return [tositavan_kestämä_lAAn: $lisä,
          tositavan_kertoma_tiin: $lisä];
end;


subrule tositapa_4_n ($lisä):
  return [tositavan_kestämä_nAAn: $lisä,
          tositavan_kertoma_tiin: $lisä];
end;


subrule tositapa_4_r ($lisä):
  return [tositavan_kestämä_rAAn: $lisä,
          tositavan_kertoma_tiin: $lisä];
end;


subrule tositapa_4_t ($lisä):
  return [tositavan_kestämä_tAAn: $lisä,
          tositavan_kertoma_tiin: $lisä];
end;


subrule tositapa_4_tt ($lisä):
  return [tositavan_kestämä_tAAn: $lisä,
          tositavan_kertoma_ttiin: $lisä];
end;


# Etsi merkkijono $u merkkijonosta $s.
# Palauta $u:n indeksi tai -1 jos ei löydy.
#
#subrule indeksi ($s, $u):
#  if (length($s) greater_equal length($u)) then
#    foreach $i in length($s) - length($u) + 1:
#      if (substring ($s, $i, $i + length($u) - 1) = $u) then
#        return $i;
#      end;
#    end;
#  end;
#  return -1;
#end;


subrule juonto ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;
  $tietue.äs := ääntiösointu ($tietue);
  $tietue.perusmuoto := $tietue.alku + tO($tietue);
  return valo ($tietue, tO($tietue), nO($tietue));
end;

subrule pyörtö ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;
  $tietue.äs := ääntiösointu ($tietue);
  $tietue.perusmuoto := $tietue.alku + tO($tietue);
  return valo ($tietue, tO($tietue), rO($tietue));
end;


subrule kiiski ($tietue):
  return risti ($tietue, "", "") +
         taivutuskaava ($tietue, 
                        [omistusliite:     "e",
                         omanto_n:         "e",
                         osanto_A:         "e",
                         olento_nA:        "e",
                         tulento_ksi:      "e",
                         sisäolento_ssA:   "e",
                         sisätulento_Vn:   "e",
                         ulkopaikallissija_llA:  "e",
                         vajanto_ttA:      "e",
                         nimentö_t:        "e",
                         omanto_ien:       "",
                         osanto_ia:        "",
                         olento_inA:       "",
                         sija_monikko_1:     "",
                         sisätulento_iin:  "",
                         ulkopaikallissija_illA: "",
                         vajanto_ittA:     "",
                         seuranto_ine:     "",
                         johdin_tOn:       "e",
                         johdin_ittain:    ""]);
end;


subrule muisto ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;

  define $loppu := "o";
  if ($tietue.alku matches ".*" + @yäö + ".*") then
    $loppu := "ö";
  end;
  $tietue.alku :=+ $loppu;
  $tietue.perusmuoto := $tietue.alku;
  $tietue.äs := ääntiösointu ($tietue);
  return valo ($tietue, "", "");
end;


subrule hohto ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;
  $tietue.äs := ääntiösointu ($tietue);
  $tietue.perusmuoto := $tietue.alku + tO($tietue);
  return valo ($tietue, tO($tietue), dO($tietue));
end;


subrule hohdattaa ($tietue, $vahva_aste, $heikko_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.alku :=+ $heikko_aste + A($tietue) + "t";
  $tietue.luokka := teonsana;
  $tietue.äs := ääntiösointu ($tietue);
  $tietue.perusmuoto := $tietue.alku + tAA($tietue);
#define $a := transmit ($tietue);
  return muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "")
         + taivutuskaava ($tietue, [johdin_Us_ksen: ""]);
end;


subrule heitto ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;
  $tietue.äs := ääntiösointu ($tietue);
  $tietue.perusmuoto := $tietue.alku + tO($tietue);
  return valo ($tietue, tO($tietue), O($tietue));
end;


subrule haravoitua ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.äs := ääntiösointu ($tietue);
  $tietue.alku :=+ "i";
  $tietue.perusmuoto := $tietue.alku + "t" + UA($tietue);
  return punoa ($tietue, tU($tietue), dU($tietue));
end;

subrule merkkejä_ennen_loppuosaa($tietue):
  if ($tietue.rakenne = nil) then
    return 0;
  end;
  define $merkkejä := 0;
  define $ennen_loppuosaa := 0;
  foreach $i in length($tietue.rakenne):
    if substring($tietue.rakenne, $i) = "=" then
      $ennen_loppuosaa := $merkkejä;
    elseif substring($tietue.rakenne, $i) = "-" then
      $merkkejä :=+ 1;
      $ennen_loppuosaa := $merkkejä;
    else
      $merkkejä :=+ 1;
    end;
  end;
  return $ennen_loppuosaa;
end;

subrule ääntiösointu ($tietue):
  define $l := length($tietue.alku);
  define $ennen_loppuosaa := merkkejä_ennen_loppuosaa($tietue);
  foreach $i in -($l - $ennen_loppuosaa):
    if substring($tietue.alku, $l + $i + 1) matches @yäö then
      return ä;
    elseif substring($tietue.alku, $l + $i + 1) matches @uao then
      return a;
    end;
  end;
  return a;
end;

subrule ääntiösointu_kihistä ($tietue):
  define $l := length($tietue.alku);
  define $neutraali := a;
  foreach $i in -$l:
    if substring($tietue.alku, $l + $i + 1) matches @yäö then
      return ä;
    elseif substring($tietue.alku, $l + $i + 1) matches @uao then
      return a;
    elseif substring($tietue.alku, $l + $i + 1) = "e" then
      $neutraali := ä;
    end;
  end;
  return $neutraali;
end;

subrule salailla ($tietue, $vahva_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.alku :=+ $vahva_aste + "il";
  $tietue.perusmuoto := $tietue.alku + lA($tietue);
  return arvailla ($tietue);
end;

subrule huiskaista ($tietue, $ääntiö):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.alku :=+ $ääntiö;
  $tietue.perusmuoto := $tietue.alku + "ist" + $ääntiö;
  return nuolaista2 ($tietue);
end;


subrule punottaa ($tietue, $heikko_aste):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.alku :=+ $heikko_aste + "t";
  $tietue.perusmuoto := $tietue.alku + "t" + AA($tietue);
  return muistaa_muistella ($tietue, tA($tietue), A($tietue), "t", "")
         + taivutuskaava ($tietue, [johdin_Us_ksen: ""]);
end;


subrule pahentua ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := teonsana;
  $tietue.perusmuoto := $tietue.alku + "t" + UA($tietue);

  return punoa ($tietue, tU($tietue), nU($tietue));
end;


subrule yhdyssanan_taivutuskaava ($tietue, $yhdyssana):
 return taivutuskaava ($tietue, yhdyssana ($yhdyssana));
end;


subrule yhdyssana ($yhdyssana):
  return [nimisana:        $yhdyssana,
	  tavuviiva:       $yhdyssana];
end;


subrule murto ($tietue):
  $tietue :=+ johdoksen_lähtötiedot($tietue);
  $tietue.luokka := nimisana;
  $tietue.äs := a;
  $tietue.perusmuoto := $tietue.alku + tO($tietue);
  return valo ($tietue, tO($tietue), rO($tietue));
end;


subrule sivumpana ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        [osanto_A:        $vahva_aste,
                         olento_nA:       $vahva_aste,
                         tulento_ksi:     $heikko_aste,
                         sisäolento_ssA:  $heikko_aste,
                         sisätulento_Vn:  $vahva_aste,
                         ulkopaikallissija_llA: $heikko_aste,
                         tulento_s:       $heikko_aste]);
end;


subrule keväämmällä ($tietue, $vahva_aste, $heikko_aste):
  return taivutuskaava ($tietue,
                        [olento_nA:       $vahva_aste,
                         tulento_ksi:     $heikko_aste,
                         ulkopaikallissija_llA: $heikko_aste]);
end;

subrule voikko_lista_vain_lipulla($lippu, $lista):
  if (switch ($lippu) = no) then return <>;
  else return $lista;
  end;
end;

# Rakentaa listasta sanatietueita tietueen, jonka attribuutteina
# on luokkasymboleita ja arvoina listoja, jotka sisältävät kyseistä
# luokkaa vastaavat sanatietueet alkuperäisestä listasta.
subrule map_by_class($list):
  define $map := [];
  foreach $l in $list:
    if not $l.luokka in $map then
      $map :=+ [$l.luokka: <>];
    end;
    $map.($l.luokka) :=+ <$l>;
  end;
  return $map;
end;

# Yhdistää tietueet, jotka poikkeavat toisistaan vain äs-kentän osalta.
subrule yhdistä_sama_äs($lista):
  if length($lista) = 2 and $lista.1 - äs = $lista.2 - äs then
    return <$lista.1 + [äs: aä]>;
  end;
  return $lista;
end;

# Yhdistää tietueet, jotka poikkeavat toisistaan vain lähtöluokka-kentän osalta.
subrule yhdistä_johdokset($lista):
  if length($lista) = 2 and $lista.1 - lähtöluokka = $lista.2 - lähtöluokka then
    if $lista.<1,lähtöluokka> = nil then
      return <$lista.2>;
    elseif $lista.<2,lähtöluokka> = nil then
      return <$lista.1>;
    end;
  end;
  return $lista;
end;

# Yhdistää tietueet, jotka poikkeavat toisistaan vain jatko-kentän osalta.
subrule yhdistä_sama_jatko($lista):
  if length($lista) = 1 then
    # Optimoidaan yleisin tapaus
    return $lista;
  end;
  define $combined := <>;
  define $newCombined := <>;
  define $didCombine := no;
  foreach $current in $lista:
    $newCombined := <>;
    $didCombine := no;
    foreach $previous in $combined:
      if $previous - jatko = $current - jatko then
        $newCombined :=+ <$previous + [jatko: $previous.jatko + $current.jatko]>;
        $didCombine := yes;
      else
        $newCombined :=+ <$previous>;
      end;
    end;
    if not $didCombine then
      $newCombined :=+ <$current>;
    end;
    $combined := $newCombined;
  end;
  return $combined;
end;

output_filter output($lista_orig):
  # Tuotantoversiossa ei tarvita kaikkia kenttiä
  define $lista := $lista_orig;
  if (not @voikko_debug) then
    $lista := <>;
    foreach $l in $lista_orig:
      $lista :=+ <$l - perusmuoto - aikamuoto>;
    end;
  end;

  foreach $i in length($lista):
    # Kaikkia lippuja ei tarvita
    if ($lista.$i.tiedot /= nil) then
      $lista.$i.tiedot :=- <ei_sukija, murre, ei_vertm, ei_yks, ei_inen, ei_lAinen, ei_mAinen>;
      if (not johdin_inen in $lista.$i.jatko) then
        $lista.$i.tiedot :=- <inen>;
      end;
      if (length($lista.$i.tiedot) = 0) then
        $lista.$i :=- tiedot;
      end;
    end;

    # Ylimääräiset merkit pois rakenne-kentästä
    if $lista.$i.rakenne /= nil then
      repeat while last($lista.$i.rakenne) = "p";
        $lista.$i.rakenne := substring($lista.$i.rakenne, 1L, 2R);
      end;
      if substring($lista.$i.rakenne, 1L) = "=" then
        $lista.$i.rakenne := substring($lista.$i.rakenne, 2L, 1R);
      end;
    end;
    
    # Nimentöä tarvitaan aikaisemmin prosessissa merkkinä siitä, että sanan voi lopettaa ko. kohdassa.
    # Tässä vaiheessa sen voi poistaa.
    if ($lista.$i.luokka in @nimisana + <laatusana>) then
      $lista.$i.jatko :=- <nimentö>;
    end;
  end;

  # Poistetaan täydelliset kaksoiskappaleet
  $lista := set($lista);

  # Luodaan pintamuotoa vastaavat lopulliset tietueet luokittain
  define $lista_luokittain := map_by_class($lista);
  foreach $luokka in $lista_luokittain:
    define $osalista := $lista_luokittain.($luokka);
    $osalista := yhdistä_sama_äs($osalista);
    $osalista := yhdistä_sama_jatko($osalista);
    $osalista := yhdistä_johdokset($osalista);
    foreach $l in $osalista:
      result $l + [jatko: set($l.jatko)];
    end;
  end;
end;