1

我之前问了一个关于扩展 which_RP 记录的问题,以及在此问题下将相对子句“that”更改为“which”

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

qualche albero
qualche alberi

根据我对意大利语的了解,我知道对于单数名词qualche albero是正确的,但对于复数名词,我们必须使用alcunealcuni取决于名词的性别。因此,我尝试将函数somePl_Det扩展为somePlM_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.Case。搜索后,我发现 param Case位于文件DiffRomance.gf中。即使我找到了 DiffRomance.Case但我仍然无法扩展此功能。

您能否解释一下DiffRomance.Case的用法以及扩展此功能的正确方法是什么。谢谢~

4

1 回答 1

1

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

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

名词(通过继承CNs 和NPs)具有固有的性别。这意味着他们的 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 存储库的分支,并在您自己的分支中修复此问题,那么您可以从您的分支发出拉取请求并将其合并到上游。

于 2021-03-12T08:30:24.697 回答