1
0
forked from GitHub/gf-core

resource examples

This commit is contained in:
aarne
2005-12-19 16:31:40 +00:00
parent 476f6a9fa3
commit 97d36f0c93
19 changed files with 1040 additions and 207 deletions

View File

@@ -0,0 +1,34 @@
--# -path=.:prelude
resource LexEng = open SyntaxEng, MorphoEng, Prelude in {
oper
-- constructors for open lexicon
mkN : (man,men : Str) -> CN ;
regN : (car : Str) -> CN ;
mkA : (hot : Str) -> AP ;
mkV : (go,goes : Str) -> V ;
regV : (walk : Str) -> V ;
mkV2 : (look : V) -> (at : Str) -> V2 ;
dirV2 : (eat : V) -> V2 ;
--------------------------------------------
-- definitions, hidden from users
mkN x y = mkNoun x y ** {lock_CN = <>} ;
regN x = regNoun x ** {lock_CN = <>} ;
mkA x = ss x ** {lock_AP = <>} ;
mkV x y = mkVerb x y ** {lock_V = <>} ;
regV x = regVerb x ** {lock_V = <>} ;
mkV2 x p = x ** {c = p ; lock_V2 = <>} ;
dirV2 x = mkV2 x [] ;
}

View File

@@ -0,0 +1,4 @@
interface LexFoods = open Syntax in {
}

View File

@@ -0,0 +1,46 @@
--# -path=.:prelude
resource LexIta = open SyntaxIta, MorphoIta, Prelude in {
oper
-- constructors for genders
Gender : Type ;
masculine, feminine : Gender ;
-- constructors for open lexicon
mkN : Gender -> (vino,vini : Str) -> CN ;
regN : (vino : Str) -> CN ;
femN : CN -> CN ;
mkA : (nero,nera,neri,nere : Str) -> AP ;
regA : (nero : Str) -> AP ;
mkV : (ama,amano : Str) -> V ;
regV : (amare : Str) -> V ;
mkV2 : (aspettare : V) -> (a : Str) -> V2 ;
dirV2 : (mangiare : V) -> V2 ;
--------------------------------------------
-- definitions, hidden from users
Gender = MorphoIta.Gender ;
masculine = Masc ;
feminine = Fem ;
mkN g x y = mkNoun g x y ** {lock_CN = <>} ;
regN x = regNoun x ** {lock_CN = <>} ;
mkA x y z u = mkAdjective x y z u ** {lock_AP = <>} ;
regA x = regAdjective x ** {lock_AP = <>} ;
mkV x y = mkVerb x y ** {lock_V = <>} ;
regV x = regVerb x ** {lock_V = <>} ;
mkV2 x p = x ** {c = p ; lock_V2 = <>} ;
dirV2 x = mkV2 x [] ;
}

View File

@@ -0,0 +1,33 @@
--# -path=.:prelude
resource MorphoEng = open Prelude in {
param
Number = Sg | Pl ;
oper
Noun, Verb : Type = {s : Number => Str} ;
mkNoun : Str -> Str -> Noun = \x,y -> {
s = table {
Sg => x ;
Pl => y
}
} ;
regNoun : Str -> Noun = \s -> case last s of {
"s" | "z" => mkNoun s (s + "es") ;
"y" => mkNoun s (init s + "ies") ;
_ => mkNoun s (s + "s")
} ;
mkVerb : Str -> Str -> Verb = \x,y -> mkNoun y x ;
regVerb : Str -> Verb = \s -> case last s of {
"s" | "z" => mkVerb s (s + "es") ;
"y" => mkVerb s (init s + "ies") ;
"o" => mkVerb s (s + "es") ;
_ => mkVerb s (s + "s")
} ;
}

View File

@@ -0,0 +1,87 @@
--# -path=.:prelude
-- This is a simple Italian resource morphology for the GF tutorial.
resource MorphoIta = open Prelude in {
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
oper
Noun : Type = {s : Number => Str ; g : Gender} ;
Adjective : Type = {s : Gender => Number => Str} ;
-- we will only use present indicative third person verb forms
Verb : Type = {s : Number => Str} ;
-- this function takes the gender and both singular and plural forms
mkNoun : Gender -> Str -> Str -> Noun = \g,vino,vini -> {
s = table {
Sg => vino ;
Pl => vini
} ;
g = g
} ;
-- this function takes the singular form
regNoun : Str -> Noun = \vino ->
let
vin = init vino ;
o = last vino
in
case o of {
"a" => mkNoun Fem vino (vin + "e") ; -- pizza
"o" | "e" => mkNoun Masc vino (vin + "i") ; -- vino, pane
_ => mkNoun Masc vino vino -- tram
} ;
-- to make nouns such as "carne", "università" feminine
femNoun : Noun -> Noun = \mano -> {
s = mano.s ;
g = Fem
} ;
-- this takes both genders and numbers
mkAdjective : (x1,_,_,x4 : Str) -> Adjective = \nero,nera,neri,nere -> {
s = table {
Masc => (mkNoun Masc nero neri).s ;
Fem => (mkNoun Fem nera nere).s
}
} ;
-- this takes the masculine singular form
regAdjective : Str -> Adjective = \nero ->
let ner = init nero in
case last nero of {
"o" => mkAdjective (ner + "o") (ner + "a") (ner + "i") (ner + "e") ;
"e" => mkAdjective (ner + "e") (ner + "e") (ner + "i") (ner + "i") ;
_ => mkAdjective nero nero nero nero
} ;
-- this function takes the singular and plural forms
mkVerb : Str -> Str -> Verb = \ama,amano -> {
s = table {
Sg => ama ;
Pl => amano
}
} ;
-- this function takes the infinitive form
regVerb : Str -> Verb = \amare ->
let am = Predef.tk 3 amare in
case Predef.dp 3 amare of {
"ere" => mkVerb (am + "e") (am + "ono") ; -- premere
"ire" => mkVerb (am + "isce") (am + "iscono") ; -- finire
_ => mkVerb (am + "a") (am + "ano") -- amare
} ;
}

View File

@@ -0,0 +1,46 @@
abstract Syntax = {
flags startcat=Phr ;
cat
S ; -- declarative sentence e.g. "this pizza is good"
NP ; -- noun phrase e.g. "this pizza"
CN ; -- common noun e.g. "pizza"
Det ; -- determiner e.g. "this"
AP ; -- adjectival phrase e.g. "very good"
AdA ; -- adadjective e.g. "very"
VP ; -- verb phrase e.g. "is good"
V ; -- intransitive verb e.g. "boil"
V2 ; -- two-place verb e.g. "eat"
fun
PosVP, NegVP : NP -> VP -> S ;
PredAP : AP -> VP ;
PredV : V -> VP ;
PredV2 : V2 -> NP -> VP ;
DetCN : Det -> CN -> NP ;
ModCN : AP -> CN -> CN ;
AdAP : AdA -> AP -> AP ;
-- entries of the closed lexicon
this_Det : Det ;
that_Det : Det ;
these_Det : Det ;
those_Det : Det ;
every_Det : Det ;
theSg_Det : Det ;
thePl_Det : Det ;
a_Det : Det ;
plur_Det : Det ;
two_Det : Det ;
very_AdA : AdA ;
too_AdA : AdA ;
}

View File

@@ -0,0 +1,67 @@
--# -path=.:prelude
concrete SyntaxEng of Syntax = open Prelude, MorphoEng in {
lincat
S = {s : Str} ;
NP = {s : Str ; n : Number} ;
CN = {s : Number => Str} ;
Det = {s : Str ; n : Number} ;
AP = {s : Str} ;
AdA = {s : Str} ;
VP = {s : Bool => Number => Str} ;
V = {s : Number => Str} ;
V2 = {s : Number => Str ; c : Str} ;
lin
PosVP np vp = {s = np.s ++ vp.s ! True ! np.n} ;
NegVP np vp = {s = np.s ++ vp.s ! False ! np.n} ;
PredAP ap = {s = \\b,n => copula b n ++ ap.s} ;
PredV v = {s = \\b,n => predVerb b n v} ;
PredV2 v2 np = {s = \\b,n => predVerb b n v2 ++ v2.c ++ np.s} ;
DetCN det cn = {s = det.s ++ cn.s ! det.n ; n = det.n} ;
ModCN ap cn = {s = \\n => ap.s ++ cn.s ! n} ;
AdAP ada ap = {s = ada.s ++ ap.s} ;
this_Det = {s = "this" ; n = Sg} ;
that_Det = {s = "that" ; n = Sg} ;
these_Det = {s = "these" ; n = Pl} ;
those_Det = {s = "those" ; n = Pl} ;
every_Det = {s = "every" ; n = Sg} ;
theSg_Det = {s = "the" ; n = Sg} ;
thePl_Det = {s = "the" ; n = Pl} ;
a_Det = {s = artIndef ; n = Sg} ;
plur_Det = {s = [] ; n = Pl} ;
two_Det = {s = "two" ; n = Pl} ;
very_AdA = {s = "very"} ;
too_AdA = {s = "too"} ;
oper
copula : Bool -> Number -> Str = \b,n -> case n of {
Sg => posneg b "is" ;
Pl => posneg b "are"
} ;
predVerb : Bool -> Number -> Verb -> Str = \b,n,verb ->
let inf = verb.s ! Sg in
case b of {
True => verb.s ! n ;
False => posneg b ((regVerb "do").s ! n) ++ inf
} ;
posneg : Bool -> Str -> Str = \b,do -> case b of {
True => do ;
False => do + "n't"
} ;
artIndef : Str =
pre {"a" ; "an" / strs {"a" ; "e" ; "i" ; "o"}} ;
}

View File

@@ -0,0 +1,81 @@
--# -path=.:prelude
concrete SyntaxIta of Syntax = open Prelude, MorphoIta in {
lincat
S = {s : Str} ;
NP = {s : Str ; g : Gender ; n : Number} ;
CN = {s : Number => Str ; g : Gender} ;
Det = {s : Gender => Str ; n : Number} ;
AP = {s : Gender => Number => Str} ;
AdA = {s : Str} ;
VP = {s : Bool => Gender => Number => Str} ;
V = {s : Number => Str} ;
V2 = {s : Number => Str ; c : Str} ;
lin
PosVP np vp = {s = np.s ++ vp.s ! True ! np.g ! np.n} ;
NegVP np vp = {s = np.s ++ vp.s ! False ! np.g ! np.n} ;
PredAP ap = {s = \\b,g,n => posneg b ++ copula n ++ ap.s ! g ! n} ;
PredV v = {s = \\b,_,n => posneg b ++ v.s ! n} ;
PredV2 v2 np = {s = \\b,_,n => posneg b ++ v2.s ! n ++ v2.c ++ np.s} ;
DetCN det cn = {s = det.s ! cn.g ++ cn.s ! det.n ; g = cn.g ; n = det.n} ;
ModCN ap cn = {s = \\n => cn.s ! n ++ ap.s ! cn.g ! n ; g = cn.g} ;
AdAP ada ap = {s = \\n,g => ada.s ++ ap.s ! n ! g} ;
this_Det = mkDet Sg (regAdjective "questo") ;
that_Det = mkDet Sg (regAdjective "quello") ;
these_Det = mkDet Pl (regAdjective "questo") ;
those_Det = mkDet Pl (regAdjective "quello") ;
every_Det = {s = \\_ => "ogni" ; n = Sg} ;
theSg_Det = {s = artDef Sg ; n = Sg} ;
thePl_Det = {s = artDef Pl ; n = Pl} ;
a_Det = {s = artIndef ; n = Pl} ;
plur_Det = {s = \\_ => [] ; n = Pl} ;
two_Det = {s = \\_ => "due" ; n = Pl} ;
very_AdA = {s = "molto"} ;
too_AdA = {s = "troppo"} ;
oper
copula : Number -> Str = \n -> case n of {
Sg => "è" ;
Pl => "sono"
} ;
posneg : Bool -> Str = \b -> case b of {
True => [] ;
False => "non"
} ;
mkDet : Number -> Adjective -> Det = \n,adj -> {
s = \\g => adj.s ! g ! n ;
n = n ;
lock_Det = <>
} ;
artDef : Number -> Gender => Str = \n -> case n of {
Sg => table {
Masc => pre {"il" ; "lo" / sImpuro} ;
Fem => "la"
} ;
Pl => table {
Masc => pre {"i" ; "gli" / sImpuro ; "gli" / vowel} ;
Fem => "le"
}
} ;
artIndef : Gender => Str = table {
Masc => pre {"un" ; "uno" / sImpuro} ;
Fem => pre {"una" ; "un'" / vowel}
} ;
sImpuro : Strs = strs {"sb" ; "sp" ; "sy" ; "z"} ;
vowel : Strs = strs {"a" ; "e" ; "i" ; "o" ; "u"} ;
}