我之前问了一个关于扩展which_RP记录和更改relative子句的问题">到";其">在此问题下。
最近,我开始研究意大利语,每当我使用函数someSg_Det或somePl_Det时,我分别会得到以下结果。
qualche albero
qualche alberi
根据我对意大利语的了解,我知道对于单个名词 但是GF编译器不断报告这个错误: 扩展缺少变量DiffIta。案例。经过搜索,我在DiffRomance.gf文件中找到了paramCase。尽管我找到了DiffRomance。Case,但我仍然无法扩展此函数。 你能解释一下DiffRomance的用法吗。案例以及扩展此功能的正确方法。谢谢~qualche albero
是正确的,但对于复数名词,我们必须根据名词的性别使用alcune
或alcuni
。因此,我试图将函数somePl_Det扩展到omePlM_Det和somePlF_DetsomePlM_Det : Str -> Det =
str ->
somePl_Det ** {s = table {_ => "alcuni"}};
somePlF_Det : Str -> Det =
str ->
somePl_Det ** {s = table {_ => "alcune"}};
Happend in operation somePlM_Det
type of "alcuni"
Expected: DiffIta.Case => Str;
inferred: Str;
Happend in operation somePlF_Det
type of "alcune"
Expected: DiffIta.Case => Str;
inferred: Str;
只是为了让任何阅读这个答案而不是前一个答案的人都清楚:
someWord ** {s = "some string"}
是一个黑客,当RGL更新时,不能保证它会工作。
我确实建议了这个破解,因为它可能很有用:有时RGL并不能准确地输出你想要它做的事情,但它并不是一个真正的错误,应该在上游修复。然后,您可以在应用程序语法中本地覆盖一些RGL定义,但您应该意识到潜在的不稳定性。
现在来回答这个问题。
意大利RGL中Det
的Lincat
你正试图做到这一点:
somePlM_Det : Str -> Det =
str ->
somePl_Det ** {s = table {_ => "alcuni"}};
您正试图将table {_ => "alcuni"}
插入意大利语Det的s
字段中。让我们看看真正的关键是什么:
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
N = {s : Whatever => Str ; g : Gender} ;
相反,名词(等(的所有修饰语和量词都有一个变量性别。所以他们的关键看起来是这样的:
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
和somePlF_Det
是没有意义的。我们只想将一个somePl_Det
应用于任何CN
,CN
决定Det
是输出alcune
还是输出alcuni
。
如何使用Case
另一个错误的做法是用单个字符串"替换"拐点表的每个分支;alcune";或";alcuni";。这些案例(和性别(实际上起到了一定的作用。让我们看看其他Det的表格,它不需要修复。
我在目录gf-rgl/src/italian
中,打开GF外壳。(前缀为>
的命令是在GF外壳内完成的。我使用标志-retain -no-pmcfg
,因为意大利RG太慢了,这使它更快。(
$ 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
这似乎是上游修复的东西,而不是对每个人的本地语法单独进行破解。
将StructurelIta中的第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-reo的分支,并在你自己的分支中修复了这个问题,那么你可以从你的分支发出一个pull请求,并将其合并到上游。