Files
gf-core/lib/resource-1.0/api/Constructors.gf

581 lines
24 KiB
Plaintext

--1 Constructors: the High-Level Syntax API
-- This module gives access to (almost) all functions in the resource
-- syntax API defined in [Grammar Grammar.html]. It uses overloaded
-- function names to reduce the burden of remembering different names.
--
-- The principle is simply:
-- to construct an object of type $C$, use the function $mkC$.
--
-- For example, to the object
--
-- $PredVP (UsePron she_Pron) (ComplV2 love_V2 (UsePN paris_PN))$
--
-- can now also be written
--
-- $mkCl (mkNP she_Pron) (mkVP love_V2 (mkNP paris_PN))$
--
-- In addition to exact variants of the $Grammar$ functions, the module
-- gives some common special cases using deeper terms and default arguments.
-- An example of deeper terms is two-place coordination such as
--
-- $mkNP : Conj -> NP -> NP -> NP$.
--
-- An example of default arguments is present-tense sentences,
--
-- $mkS : Cl -> S$.
--
-- The "old" API can of course be used simultaneously with this one.
-- Typically, $Grammar$ and $Paradigms$ are needed to be $open$ed in addition
-- to this.
incomplete resource Constructors = open Grammar in {
oper
--2 Texts, phrases, and utterances
mkText : overload {
mkText : Text ; -- [empty text]
mkText : Phr -> Text -> Text -- John walks. ...
} ;
mkPhr : overload {
mkPhr : PConj -> Utt -> Voc -> Phr; -- But go home my friend
mkPhr : Utt -> Phr ; -- Go home
mkPhr : S -> Phr -- I go home
} ;
mkUtt : overload {
mkUtt : S -> Utt ; -- John walks
mkUtt : QS -> Utt ; -- is it good
mkUtt : Pol -> Imp -> Utt ; -- (don't) help yourself
mkUtt : Imp -> Utt ; -- help yourself
mkUtt : IP -> Utt ; -- who
mkUtt : IAdv -> Utt ; -- why
mkUtt : NP -> Utt ; -- this man
mkUtt : Adv -> Utt ; -- here
mkUtt : VP -> Utt -- to sleep
} ;
--2 Sentences, and clauses
mkS : overload {
mkS : Tense -> Ant -> Pol -> Cl -> S ; -- John wouldn't have walked
mkS : Cl -> S ; -- John walks
mkS : Conj -> S -> S -> S ; -- John walks and Mary talks
mkS : DConj -> S -> S -> S ; -- either I leave or you come
mkS : Conj -> ListS -> S ; -- John walks, Mary talks, and Bob runs
mkS : DConj -> ListS -> S ; -- either I leave, you come, or he runs
mkS : Adv -> S -> S -- today, I will sleep
} ;
mkCl : overload {
mkCl : NP -> VP -> Cl ; -- John walks
mkCl : VP -> Cl ; -- it rains
mkCl : NP -> RS -> Cl ; -- it is you who did it
mkCl : Adv -> S -> Cl ; -- it is yesterday she arrived
mkCl : NP -> Cl -- there is a house
} ;
--2 Verb phrases and imperatives
mkVP : overload {
mkVP : V -> VP ; -- sleep
mkVP : V2 -> NP -> VP ; -- use it
mkVP : V3 -> NP -> NP -> VP ; -- send a message to her
mkVP : VV -> VP -> VP ; -- want to run
mkVP : VS -> S -> VP ; -- know that she runs
mkVP : VQ -> QS -> VP ; -- ask if she runs
mkVP : VA -> AP -> VP ; -- look red
mkVP : V2A -> NP -> AP -> VP ; -- paint the house red
mkVP : AP -> VP ; -- be warm
mkVP : NP -> VP ; -- be a man
mkVP : Adv -> VP ; -- be here
mkVP : VP -> Adv -> VP ; -- sleep here
mkVP : AdV -> VP -> VP -- always sleep
} ;
mkImp : overload {
mkImp : VP -> Imp ; -- go there now
mkImp : V -> Imp ; -- go
mkImp : V2 -> NP -> Imp -- take it
} ;
--2 Noun phrases and determiners
mkNP : overload {
mkNP : Det -> CN -> NP ; -- the old man
mkNP : Det -> N -> NP ; -- the man
mkNP : PN -> NP ; -- John
mkNP : Pron -> NP ; -- he
mkNP : Predet -> NP -> NP ; -- all the men
mkNP : NP -> V2 -> NP ; -- the number squared
mkNP : NP -> Adv -> NP ; -- Paris at midnight
mkNP : Conj -> NP -> NP -> NP ; -- John and Mary walk
mkNP : DConj -> NP -> NP -> NP ; -- both John and Mary walk
mkNP : Conj -> ListNP -> NP ; -- John, Mary, and Bill walk
mkNP : DConj -> ListNP -> NP -- both John, Mary, and Bill walk
} ;
mkDet : overload {
mkDet : QuantSg -> Ord -> Det ; -- this best (man)
mkDet : Det ; -- the (man)
mkDet : QuantSg -> Det ; -- this (man)
mkDet : QuantPl -> Num -> Ord -> Det ; -- these five best (men)
mkDet : QuantPl -> Det ; -- these (men)
mkDet : Quant -> Det ; -- this (man)
mkDet : Num -> Det ; -- five (men)
mkDet : Pron -> Det -- my (house)
} ;
--2 Numerals - cardinal and ordinal
mkNum : overload {
mkNum : Num ; -- [no num]
mkNum : Int -> Num ; -- 51
mkNum : Digit -> Num
} ;
mkOrd : overload {
mkOrd : Ord ; -- [no ord]
mkOrd : Int -> Ord ; -- 51st
mkOrd : Digit -> Ord ; -- fifth
mkOrd : A -> Ord -- largest
} ;
--2 Common nouns
mkCN : overload {
mkCN : N -> CN ; -- house
mkCN : N2 -> NP -> CN ; -- son of the king
mkCN : N3 -> NP -> NP -> CN ; -- flight from Moscow (to Paris)
mkCN : N2 -> CN ; -- son
mkCN : N3 -> CN ; -- flight
mkCN : AP -> CN -> CN ; -- big house
mkCN : CN -> AP -> CN ; -- big house
mkCN : CN -> RS -> CN ; -- house that John owns
mkCN : CN -> Adv -> CN ; -- house on the hill
mkCN : CN -> SC -> CN ; -- fact that John smokes, question if he does
mkCN : CN -> NP -> CN -- number x, numbers x and y
} ;
--2 Adjectival phrases
mkAP : overload {
mkAP : A -> AP ; -- warm
mkAP : A -> NP -> AP ; -- warmer than Spain
mkAP : A2 -> NP -> AP ; -- divisible by 2
mkAP : A2 -> AP ; -- divisible by itself
mkAP : AP -> SC -> AP ; -- great that she won; uncertain if she did
mkAP : AdA -> AP -> AP ; -- very uncertain
mkAP : Conj -> AP -> AP -> AP ; -- warm and nice
mkAP : DConj -> AP -> AP -> AP ;-- both warm and nice
mkAP : Conj -> ListAP -> AP ; -- warm, nice, and cheap
mkAP : DConj -> ListAP -> AP -- both warm, nice, and cheap
} ;
--2 Adverbs
mkAdv : overload {
mkAdv : A -> Adv ; -- quickly
mkAdv : Prep -> NP -> Adv ; -- in the house
mkAdv : CAdv -> A -> NP -> Adv ; -- more quickly than John
mkAdv : CAdv -> A -> S -> Adv ; -- more quickly than he runs
mkAdv : AdA -> Adv -> Adv ; -- very quickly
mkAdv : Subj -> S -> Adv ; -- when he arrives
mkAdv : Conj -> Adv -> Adv -> Adv; -- here and now
mkAdv : DConj -> Adv -> Adv -> Adv; -- both here and now
mkAdv : Conj -> ListAdv -> Adv ; -- here, now, and with you
mkAdv : DConj -> ListAdv -> Adv -- both here, now, and with you
} ;
--2 Questions and interrogative pronouns
mkQS : overload {
mkQS : Tense -> Ant -> Pol -> QCl -> QS ; -- wouldn't John have walked
mkQS : QCl -> QS -- does John walk
} ;
mkQCl : overload {
mkQCl : Cl -> QCl ; -- does John walk
mkQCl : IP -> VP -> QCl ; -- who walks
mkQCl : IP -> Slash -> QCl ; -- who does John love
mkQCl : IP -> NP -> V2 -> QCl ; -- who does John love
mkQCl : IAdv -> Cl -> QCl ; -- why does John walk
mkQCl : Prep -> IP -> Cl -> QCl ; -- with whom does John walk
mkQCl : IAdv -> NP -> QCl ; -- where is John
mkQCl : IP -> QCl -- which houses are there
} ;
mkIP : overload {
mkIP : IDet -> Num -> Ord -> CN -> IP ; -- which five best songs
mkIP : IDet -> N -> IP ; -- which song
mkIP : IP -> Adv -> IP -- who in Europe
} ;
--2 Relative clauses and relative pronouns
mkRS : overload {
mkRS : Tense -> Ant -> Pol -> RCl -> RS ; -- who wouldn't have walked
mkRS : RCl -> RS -- who walks
} ;
mkRCl : overload {
mkRCl : Cl -> RCl ; -- such that John loves her
mkRCl : RP -> VP -> RCl ; -- who loves John
mkRCl : RP -> Slash -> RCl -- whom John loves
} ;
mkRP : overload {
mkRP : RP ; -- which
mkRP : Prep -> NP -> RP -> RP -- all the roots of which
} ;
--2 Objectless sentences and sentence complements
mkSlash : overload {
mkSlash : NP -> V2 -> Slash ; -- (whom) he sees
mkSlash : NP -> VV -> V2 -> Slash ; -- (whom) he wants to see
mkSlash : Slash -> Adv -> Slash ; -- (whom) he sees tomorrow
mkSlash : Cl -> Prep -> Slash -- (with whom) he walks
} ;
mkSC : overload {
mkSC : S -> SC ; -- that you go
mkSC : QS -> SC ; -- whether you go
mkSC : VP -> SC -- to go
} ;
--.
-- Definitions
mkAP = overload {
mkAP : A -> AP -- warm
= PositA ;
mkAP : A -> NP -> AP -- warmer than Spain
= ComparA ;
mkAP : A2 -> NP -> AP -- divisible by 2
= ComplA2 ;
mkAP : A2 -> AP -- divisible by itself
= ReflA2 ;
mkAP : AP -> SC -> AP -- great that she won, uncertain if she did
= SentAP ;
mkAP : AdA -> AP -> AP -- very uncertain
= AdAP ;
mkAP : Conj -> AP -> AP -> AP
= \c,x,y -> ConjAP c (BaseAP x y) ;
mkAP : DConj -> AP -> AP -> AP
= \c,x,y -> DConjAP c (BaseAP x y) ;
mkAP : Conj -> ListAP -> AP
= \c,xy -> ConjAP c xy ;
mkAP : DConj -> ListAP -> AP
= \c,xy -> DConjAP c xy
} ;
mkAdv = overload {
mkAdv : A -> Adv -- quickly
= PositAdvAdj ;
mkAdv : Prep -> NP -> Adv -- in the house
= PrepNP ;
mkAdv : CAdv -> A -> NP -> Adv -- more quickly than John
= ComparAdvAdj ;
mkAdv : CAdv -> A -> S -> Adv -- more quickly than he runs
= ComparAdvAdjS ;
mkAdv : AdA -> Adv -> Adv -- very quickly
= AdAdv ;
mkAdv : Subj -> S -> Adv -- when he arrives
= SubjS ;
mkAdv : Conj -> Adv -> Adv -> Adv
= \c,x,y -> ConjAdv c (BaseAdv x y) ;
mkAdv : DConj -> Adv -> Adv -> Adv
= \c,x,y -> DConjAdv c (BaseAdv x y) ;
mkAdv : Conj -> ListAdv -> Adv
= \c,xy -> ConjAdv c xy ;
mkAdv : DConj -> ListAdv -> Adv
= \c,xy -> DConjAdv c xy
} ;
mkCl = overload {
mkCl : NP -> VP -> Cl -- John walks
= PredVP ;
mkCl : VP -> Cl -- it rains
= ImpersCl ;
mkCl : NP -> RS -> Cl -- it is you who did it
= CleftNP ;
mkCl : Adv -> S -> Cl -- it is yesterday she arrived
= CleftAdv ;
mkCl : NP -> Cl -- there is a house
= ExistNP
} ;
mkNP = overload {
mkNP : Det -> CN -> NP -- the man
= DetCN ;
mkNP : Det -> N -> NP -- the man
= \d,n -> DetCN d (UseN n) ;
mkNP : PN -> NP -- John
= UsePN ;
mkNP : Pron -> NP -- he
= UsePron ;
mkNP : Predet -> NP -> NP -- only the man
= PredetNP ;
mkNP : NP -> V2 -> NP -- the number squared
= PPartNP ;
mkNP : NP -> Adv -> NP -- Paris at midnight
= AdvNP ;
mkNP : Conj -> NP -> NP -> NP
= \c,x,y -> ConjNP c (BaseNP x y) ;
mkNP : DConj -> NP -> NP -> NP
= \c,x,y -> DConjNP c (BaseNP x y) ;
mkNP : Conj -> ListNP -> NP
= \c,xy -> ConjNP c xy ;
mkNP : DConj -> ListNP -> NP
= \c,xy -> DConjNP c xy
} ;
mkDet = overload {
mkDet : QuantSg -> Ord -> Det -- this best man
= DetSg ;
mkDet : Det -- the man
= DetSg (SgQuant DefArt) NoOrd ;
mkDet : QuantSg -> Det -- this man
= \q -> DetSg q NoOrd ;
mkDet : QuantPl -> Num -> Ord -> Det -- these five best men
= DetPl ;
mkDet : QuantPl -> Det -- these men
= \q -> DetPl q NoNum NoOrd ;
mkDet : Quant -> Det -- this man
= \q -> DetSg (SgQuant q) NoOrd ;
mkDet : Num -> Det -- five men
= \n -> DetPl (PlQuant IndefArt) n NoOrd ;
mkDet : Pron -> Det -- my (house)
= \p -> DetSg (SgQuant (PossPron p)) NoOrd
} ;
mkNum = overload {
mkNum : Num -- [no num]
= NoNum ;
mkNum : Int -> Num -- 51
= NumInt ;
mkNum : Digit -> Num
= \d -> NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 d)))))
} ;
mkOrd = overload {
mkOrd : Ord -- [no ord]
= NoOrd ;
mkOrd : Int -> Ord -- 51st
= OrdInt ;
mkOrd : Digit -> Ord -- fifth
= \d -> OrdNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 d))))) ;
mkOrd : A -> Ord -- largest
= OrdSuperl
} ;
mkCN = overload {
mkCN : N -> CN -- house
= UseN ;
mkCN : N2 -> NP -> CN -- son of the king
= ComplN2 ;
mkCN : N3 -> NP -> NP -> CN -- flight from Moscow (to Paris)
= \f,x -> ComplN2 (ComplN3 f x) ;
mkCN : N2 -> CN -- son
= UseN2 ;
mkCN : N3 -> CN -- flight
= UseN3 ;
mkCN : AP -> CN -> CN -- big house
= AdjCN ;
mkCN : CN -> AP -> CN -- big house
= \x,y -> AdjCN y x ;
mkCN : CN -> RS -> CN -- house that John owns
= RelCN ;
mkCN : CN -> Adv -> CN -- house on the hill
= AdvCN ;
mkCN : CN -> SC -> CN -- fact that John smokes, question if he does
= SentCN ;
mkCN : CN -> NP -> CN -- number x, numbers x and y
= ApposCN
} ;
mkPhr = overload {
mkPhr : PConj -> Utt -> Voc -> Phr -- But go home my friend
= PhrUtt ;
mkPhr : Utt -> Phr -- Go home
= \u -> PhrUtt NoPConj u NoVoc ;
mkPhr : S -> Phr -- I go home
= \s -> PhrUtt NoPConj (UttS s) NoVoc
} ;
mkUtt = overload {
mkUtt : S -> Utt -- John walks
= UttS ;
mkUtt : QS -> Utt -- is it good
= UttQS ;
mkUtt : Pol -> Imp -> Utt -- (don't) help yourself
= UttImpSg ;
mkUtt : Imp -> Utt -- help yourself
= UttImpSg PPos ;
mkUtt : IP -> Utt -- who
= UttIP ;
mkUtt : IAdv -> Utt -- why
= UttIAdv ;
mkUtt : NP -> Utt -- this man
= UttNP ;
mkUtt : Adv -> Utt -- here
= UttAdv ;
mkUtt : VP -> Utt -- to sleep
= UttVP
} ;
mkQCl = overload {
mkQCl : Cl -> QCl -- does John walk
= QuestCl ;
mkQCl : IP -> VP -> QCl -- who walks
= QuestVP ;
mkQCl : IP -> Slash -> QCl -- who does John love
= QuestSlash ;
mkQCl : IP -> NP -> V2 -> QCl -- who does John love
= \ip,np,v -> QuestSlash ip (SlashV2 np v) ;
mkQCl : IAdv -> Cl -> QCl -- why does John walk
= QuestIAdv ;
mkQCl : Prep -> IP -> Cl -> QCl -- with whom does John walk
= \p,ip -> QuestIAdv (PrepIP p ip) ;
mkQCl : IAdv -> NP -> QCl -- where is John
= \a -> QuestIComp (CompIAdv a) ;
mkQCl : IP -> QCl -- which houses are there
= ExistIP
} ;
mkIP = overload {
mkIP : IDet -> Num -> Ord -> CN -> IP -- which five best songs
= IDetCN ;
mkIP : IDet -> N -> IP -- which song
= \i,n -> IDetCN i NoNum NoOrd (UseN n) ;
mkIP : IP -> Adv -> IP -- who in Europe
= AdvIP
} ;
mkRCl = overload {
mkRCl : Cl -> RCl -- such that John loves her
= RelCl ;
mkRCl : RP -> VP -> RCl -- who loves John
= RelVP ;
mkRCl : RP -> Slash -> RCl -- whom John loves
= RelSlash
} ;
mkRP = overload {
mkRP : RP -- which
= IdRP ;
mkRP : Prep -> NP -> RP -> RP -- all the roots of which
= FunRP
} ;
mkSlash = overload {
mkSlash : NP -> V2 -> Slash -- (whom) he sees
= SlashV2 ;
mkSlash : NP -> VV -> V2 -> Slash -- (whom) he wants to see
= SlashVVV2 ;
mkSlash : Slash -> Adv -> Slash -- (whom) he sees tomorrow
= AdvSlash ;
mkSlash : Cl -> Prep -> Slash -- (with whom) he walks
= SlashPrep
} ;
mkImp = overload {
mkImp : VP -> Imp -- go
= ImpVP ;
mkImp : V -> Imp
= \v -> ImpVP (UseV v) ;
mkImp : V2 -> NP -> Imp
= \v,np -> ImpVP (ComplV2 v np)
} ;
mkSC = overload {
mkSC : S -> SC -- that you go
= EmbedS ;
mkSC : QS -> SC -- whether you go
= EmbedQS ;
mkSC : VP -> SC -- to go
= EmbedVP
} ;
mkS = overload {
mkS : Tense -> Ant -> Pol -> Cl -> S
= UseCl ;
mkS : Cl -> S
= UseCl TPres ASimul PPos ;
mkS : Conj -> S -> S -> S
= \c,x,y -> ConjS c (BaseS x y) ;
mkS : DConj -> S -> S -> S
= \c,x,y -> DConjS c (BaseS x y) ;
mkS : Conj -> ListS -> S
= \c,xy -> ConjS c xy ;
mkS : DConj -> ListS -> S
= \c,xy -> DConjS c xy ;
mkS : Adv -> S -> S
= AdvS
} ;
mkQS = overload {
mkQS : Tense -> Ant -> Pol -> QCl -> QS
= UseQCl ;
mkQS : QCl -> QS
= UseQCl TPres ASimul PPos
} ;
mkRS = overload {
mkRS : Tense -> Ant -> Pol -> RCl -> RS
= UseRCl ;
mkRS : RCl -> RS
= UseRCl TPres ASimul PPos
} ;
mkText = overload {
mkText : Text -- [empty text]
= TEmpty ;
mkText : Phr -> Text -> Text -- John walks. ...
= TFullStop
} ;
mkVP = overload {
mkVP : V -> VP -- sleep
= UseV ;
mkVP : V2 -> NP -> VP -- use it
= ComplV2 ;
mkVP : V3 -> NP -> NP -> VP -- send a message to her
= ComplV3 ;
mkVP : VV -> VP -> VP -- want to run
= ComplVV ;
mkVP : VS -> S -> VP -- know that she runs
= ComplVS ;
mkVP : VQ -> QS -> VP -- ask if she runs
= ComplVQ ;
mkVP : VA -> AP -> VP -- look red
= ComplVA ;
mkVP : V2A -> NP -> AP -> VP -- paint the house red
= ComplV2A ;
mkVP : AP -> VP -- be warm
= \a -> UseComp (CompAP a) ;
mkVP : NP -> VP -- be a man
= \a -> UseComp (CompNP a) ;
mkVP : Adv -> VP -- be here
= \a -> UseComp (CompAdv a) ;
mkVP : VP -> Adv -> VP -- sleep here
= AdvVP ;
mkVP : AdV -> VP -> VP -- always sleep
= AdVVP
} ;
}