--1 English Word Classes and Morphological Parameters
--
-- This is a resource module for English morphology, defining the
-- morphological parameters and word classes of English. It is aimed
-- to be complete w.r.t. the description of word forms.
-- However, it only includes those parameters that are needed for
-- analysing individual words: such parameters are defined in syntax modules.
--
-- We use the language-independent prelude.

resource TypesEng = open Prelude in {

--
--2 Enumerated parameter types 
--
-- These types are the ones found in school grammars.
-- Their parameter values are atomic.

param 
  Number = Sg | Pl ;
  Gender = NoHum | Hum ;
  Case   = Nom | Gen ;
  Person = P1 | P2 | P3 ;
  Degree = Pos | Comp | Sup ;

-- For data abstraction, we define

oper 
  singular = Sg ;
  plural = Pl ;

--2 Word classes and hierarchical parameter types
--
-- Real parameter types (i.e. ones on which words and phrases depend) 
-- are often hierarchical. The alternative would be cross-products of
-- simple parameters, but this would usually overgenerate.
--

--3 Common nouns
--
-- Common nouns are inflected in number and case.

  CommonNoun : Type = {s : Number => Case => Str} ;


--
--3 Adjectives
--
-- The major division is between the comparison degrees, but it
-- is also good to leave room for adjectives that cannon be compared.
-- It is, however, productive to form an adverbial from any adjective.

param AForm = AAdj | AAdv ;

oper
  Adjective : Type = SS1 AForm ;
  AdjDegr = {s : Degree => AForm => Str} ;

--3 Verbs
--
-- We treat the full conjugation now.
-- The present tense is made to depend on person, which correspond to forms
-- in the singular; plural forms are uniformly equal to the 2nd person singular.

param
  VForm = InfImp | Indic Person | Past Number | PPart ;

oper
  VerbP3 : Type = {s : VForm => Str} ;

-- A full verb can moreover have a particle.

  Particle : Type = Str ;
  Verb = VerbP3 ** {s1 : Particle} ; 

--
--3 Pronouns
--
-- For pronouns, we need four case forms: "I" - "me" - "my" - "mine".

param
  NPForm = NomP | AccP | GenP | GenSP ; 

oper
  Pronoun  : Type = {s : NPForm => Str ; n : Number ; p : Person} ;

-- Coercions between pronoun cases and ordinaty cases.

  toCase  : NPForm -> Case = \c -> case c of {GenP => Gen ; _ => Nom} ;
  toNPForm : Case -> NPForm = \c -> case c of {Gen  => GenP ; _ => NomP} ; ---

--3 Proper names
--
-- Proper names only need two cases.

  ProperName : Type = SS1 Case ;

--3 Relative pronouns
--
-- Relative pronouns are inflected in gender (human/nonhuman), number, and case.

  RelPron : Type = {s : Gender => Number => NPForm => Str} ;
} ;

