在 GF 中使用分数 GF 语法

问题描述

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

location /media {
    root /home/username/projectname/;

但是这种方法不适用于所有语言,因为在德语中 mkNP(mkCN (mkN("ein")) (mkNP(mkCN (mkN("ein")) (mkNP(mkN("halb")))))); 之间没有空格,并且使用 eineinhalb 获取名词的复数可能适用于英语和德语,但不适用于对于其他语言,例如法语,实际上有一个真正的 aPl_Det

因此我尝试扩展一个NP并在其s添加多个字符串,例如follow

aPl_Det

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

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);
}}

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

解决方法

卡片/Det 或 NP

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

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

不幸的是,RGL oper for mkCard 需要像“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。

屈折分数的通解

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

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

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