只是为了让任何阅读此答案而不是以前的人都清楚:
someWord ** {s = "some string"}
是一个 hack,当 RGL 更新时,不能保证它会起作用。
我确实建议过 hack,因为它很有用:有时 RGL 并不能准确地输出你想要它做的事情,但这并不是一个应该在上游修复的错误。然后,您可以在应用程序语法中本地覆盖一些 RGL 定义,但您应该注意潜在的不稳定性。
现在来回答这个问题。
Det
意大利语 RGL的 Lincat
你正在尝试这样做:
somePlM_Det : Str -> Det =
\str ->
somePl_Det ** {s = table {_ => "alcuni"}};
您正在尝试在意大利语中插入table {_ => "alcuni"}
Dets
字段。让我们在这里看看实际的 lincat 是什么:
Det = {
s : Gender => Case => Str ;
n : Number ;
s2 : Str ; -- -ci
sp : Gender => Case => Str ; -- substantival: mien, mienne
isNeg : Bool -- negative element, e.g. aucun
} ;
请注意s
类型为 的字段Gender => Case => Str
。那是两个嵌套列表,而您试图只给它一个列表。
这会起作用,但没有意义:
somePlF_Det : Str -> Det =
\str ->
somePl_Det ** {s = table {_ => table {_ => "alcune"}}};
那有什么问题?两件事,下面解释。
Det
有变量Gender
——不是固有的
在 RGL 中,那些有性别或其他名词类的语言,设计通常如下。
名词(通过继承CN
s 和NP
s)具有固有的性别。这意味着他们的 lincat 看起来像这样:
lincat
N = {s : Whatever => Str ; g : Gender} ;
相比之下,名词(等)的所有修饰语和量词都具有可变的性别。所以他们的 lincats 看起来像这样:
lincat
Det, Quant, A, AP, RS ... = {s : Gender => Whatever => Str} ;
性别位于变形表的左侧,这意味着修饰符/量词的输出取决于其最终头部的性别。名词(或 CN,或 NP)将是头部,我们将使用头部的固有性别从修饰语/量词中选择正确的性别。GF 代码如下所示:
-- In the abstract syntax
fun
Modify : Modifier -> Head -> Head ;
-- In the concrete syntax (different file)
lin
Modify mod head = {
s = \\x => mod.s ! head.g ! x ++ head.s ! x
} ;
我们用来head.g
从 中选择字符串mod.s
。该变量x
可以表示任何其他变形特征,例如大小写或数字——对于这个例子来说无关紧要。
somePlM_Det
所以定义and是没有意义的somePlF_Det
。我们只想将一个应用somePl_Det
到 anyCN
中,并且CN
决定Det
将输出alcune
还是alcuni
.
做什么用Case
另一个错误的做法是用单个字符串“alcune”或“alcuni”替换变形表的每个分支。这些案例(和性别)实际上做了一些事情。让我们看一下其他不需要修复的 Det 表。
我在目录中gf-rgl/src/italian
并打开 GF shell。(以>
_-retain -no-pmcfg
$ gf
> i -retain -no-pmcfg LangIta.gf
> cc -unqual -table many_Det
s . Masc => Nom => molti
s . Masc => Acc => molti
s . Masc => CPrep P_di => di molti
s . Masc => CPrep P_a => a molti
s . Masc => CPrep P_da => da molti
s . Masc => CPrep P_in => in molti
s . Masc => CPrep P_su => su molti
s . Masc => CPrep P_con => con molti
s . Fem => Nom => molte
s . Fem => Acc => molte
s . Fem => CPrep P_di => di molte
s . Fem => CPrep P_a => a molte
s . Fem => CPrep P_da => da molte
s . Fem => CPrep P_in => in molte
s . Fem => CPrep P_su => su molte
s . Fem => CPrep P_con => con molte
所有这些介词都是变形表的一部分!如果您想知道为什么,那是因为这些介词与冠词合并。首先,它们不合并的示例:
> cc -one PrepNP in_Prep (DetCN many_Det (UseN house_N))
in molte case
> cc -one PrepNP with_Prep (DetCN many_Det (UseN cat_N))
con molti gatti
有了这些,它们确实合并了。
> cc -one PrepNP in_Prep (DetCN (DetQuant DefArt NumPl) (UseN house_N))
nelle case -- not "in le case"
> cc -one PrepNP with_Prep (DetCN (DetQuant DefArt NumPl) (UseN cat_N))
coi gatti -- not "con i gatti"
这就是为什么我们需要在屈折表中使用大小写。如果我somePl_Det
用你写的代替,我会得到这个:
> cc -one PrepNP with_Prep (DetCN somePl_Det (UseN cat_N))
alcuni gatti -- "with" is missing!
> cc -one PrepNP in_Prep (DetCN somePl_Det (UseN house_N))
alcuni case -- "in" is missing, and no gender agreement!
如何实际修复somePl_Det
这似乎是要在上游修复的东西,而不是单独攻击每个人的本地语法。
将StructuralIta 中的第 86 行替换为:
somePl_Det = {s,sp = \\g,c => prepCase c ++ genForms "alcuni" "alcune" ! g ; n = Pl ; s2 = [] ; isNeg = False} ;
重新编译你的 RGL,从现在开始,你应该得到这个输出:
> cc -one PrepNP in_Prep (DetCN somePl_Det (UseN house_N))
in alcune case
> cc -one PrepNP with_Prep (DetCN somePl_Det (UseN cat_N))
con alcuni gatti
如果您创建 gf-rgl 存储库的分支,并在您自己的分支中修复此问题,那么您可以从您的分支发出拉取请求并将其合并到上游。