GF中行列式的扩展

  • 本文关键字:扩展 行列式 GF gf
  • 更新时间 :
  • 英文 :


我之前问了一个关于扩展which_RP记录和更改relative子句的问题">";其">在此问题下。

最近,我开始研究意大利语,每当我使用函数someSg_DetsomePl_Det时,我分别会得到以下结果。

qualche albero
qualche alberi

根据我对意大利语的了解,我知道对于单个名词qualche albero是正确的,但对于复数名词,我们必须根据名词的性别使用alcunealcuni。因此,我试图将函数somePl_Det扩展到omePlM_DetsomePlF_Det

somePlM_Det : Str -> Det =
str ->
somePl_Det ** {s = table {_ => "alcuni"}};
somePlF_Det : Str -> Det =
str ->
somePl_Det ** {s = table {_ => "alcune"}};

但是GF编译器不断报告这个错误:

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;

扩展缺少变量DiffIta。案例。经过搜索,我在DiffRomance.gf文件中找到了paramCase。尽管我找到了DiffRomance。Case,但我仍然无法扩展此函数。

你能解释一下DiffRomance的用法吗。案例以及扩展此功能的正确方法。谢谢~

只是为了让任何阅读这个答案而不是前一个答案的人都清楚:

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中,那些有性别或其他名词类的语言,其设计通常如下。

名词(以及通过继承CNs和NPs(具有固有的性别。这意味着他们的关键看起来是这样的:

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.gmod.s中选择字符串。变量x可以表示任何其他拐点特征,例如大小写或数字,这对本例来说无关紧要。

因此,定义somePlM_DetsomePlF_Det是没有意义的。我们只想将一个somePl_Det应用于任何CNCN决定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请求,并将其合并到上游。

最新更新