1

我正在尝试将小数和两位数的小数添加到 RGL 中,同时保留mkNumeralmkDigits之后的名词的原始单数/复数规则。我尝试使用多个名词作为

    mkNP(mkCN
           (mkN("ein"))
           (mkNP(mkCN
               (mkN("ein"))
               (mkNP(mkN("halb"))))));

但是这种方法不适用于所有语言,因为德语eineinhalb之间没有空格,并且使用aPl_Det来获取名词的复数可能适用于英语和德语,但不适用于其他语言,例如实际上有一个真实的 aPl_Det.

因此我尝试扩展一个 NP 并将多个字符串添加到它的 s中,例如跟随

open SyntaxEng, ParadigmsEng, ResEng in {
oper 
   newNp : Str -> N -> NP =
       \num, noun -> case occur (".")(num) of{
           PTrue => 
              let myNewNP = it_NP ** {s = (mkNP(mkDet(mkNumeral(dropDec num)))).s ++ "point" ++ (mkNP(mkDet(mkNumeral(decNum num)))).s ++ noun ! Pl} ;
                   -- noun is plural here because any number greater than 1 is plural, and I don't expect the user to input 1.00

              in myNewNP;
           PFalse => mkNP(mkDet(mkNumeral (num)))(noun)};

   decNum : Str -> Str = \num -> dp (2) (num);
   dropDec : Str -> Str = \num -> tk (3) (num);
}}

我得到的错误信息如下。符号 (...) 表示还有其他 mkDet 实例,但它们对于这个问题并不重要。

no overload instance of mkDet
for 
    {s : Bool => CardOrd => Case => Str; lock_Numeral : {}; n : Number}
among
...
...
    {s : Bool => CardOrd => Case => Str; lock_Numeral : {}; n : Number}
...
...
with value type Str

值类型 Str 是什么意思以及如何解决这样的问题?

4

1 回答 1

1

Card/Det 或 NP

您想使用分数作为限定词(“eineinhalb Katzen”),还是仅使用独立的名词短语(“eineinhalb”)?无论哪种方式,都有几种不同的方式,其中没有一种需要扩展 NP。

如果分数不变形,则快速而肮脏的解决方案

不幸的是,RGL oper formkCard需要像“35”这样的输入,如果您输入字母或小数点,它会出错。

但是,如果您的分数不变形,或者即使它们在语言中变形但您的应用程序不需要变形,那么最简单的方法是使用Symbolic module,特别是以下一对操作符

mkSymb : Str -> Symb  ;     -- x
symb   : Symb -> Card ;     -- n (number)

symb函数Card默认使用复数形式。所以你可以像这样制作任何卡片:

oper myMkCard : Str -> Card = \s -> symb (mkSymb s) ;

GF语法

这是德语的有效GF代码。

resource Fractions = open SymbolicGer, SyntaxGer, LexiconGer in {
  oper
    one_and_half_Card : Card = symb (mkSymb "eineinhalb") ;

    one_and_half_NP : NP = mkNP (mkDet one_and_half_Card) ; -- standalone NP
    one_and_half_cats_NP : NP = mkNP one_and_half_Card cat_N ; -- determiner for cat_N
}

测试输出:

> cc -unqual -table one_and_half_cats_NP
s . NPC Nom => eineinhalb Katzen
s . NPC Acc => eineinhalb Katzen
s . NPC Dat => eineinhalb Katzen
s . NPC Gen => eineinhalb Katzen
s . NPP CAnDat => an eineinhalb Katzen
s . NPP CInAcc => in eineinhalb Katzen
s . NPP CInDat => in eineinhalb Katzen
s . NPP CZuDat => zu eineinhalb Katzen
s . NPP CVonDat => von eineinhalb Katzen
a . Ag Fem Pl P3

根据语言和应用程序,这可能是一个可接受的快速而肮脏的解决方案。但总的来说,这应该在 RGL 中解决,而不是让每个人都自己破解。

知道分数的哪些部分变形是非常重要的。例如在瑞典语中,“one”是“en”或“ett”,取决于性别,“one and half”是“en och en halv”或“ett och ett halvt”。这些都是复杂的事情,其实现属于 RGL。

屈折分数的一般解决方案

我们应该只扩展mkCardRGL 中的 oper 以便它接受像“3.5”或“1½”这样的输入。我可以自愿为我自己知道的语言做这件事,但它不会在我的优先级列表中。

如果您想在自己的 RGL 分支中尝试一下,请查看不同语言的数字模块,并了解数字是如何构造的。例如,这是mkDigitfor German,您可以玩它并尝试找出以下问题

  • 您需要更改或添加什么以使其输出“eineinhalb”?
  • eineinhalb 在不同情况和数字下的表现如何?你会说“einereinhalb”、“eineinhalber”还是别的什么?
  • 序数怎么样——你能说“第一个和一半”吗?(我假设不是一般情况,这就是为什么我只建议改变mkCard,而不是mkNumeral:-P)
于 2021-04-22T09:10:01.110 回答