首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GF中使用分数

在GF中使用分数
EN

Stack Overflow用户
提问于 2021-04-20 01:57:38
回答 1查看 64关注 0票数 1

我试图在RGL中添加小数和两位数的分数,同时保留在、mkNumeral、mkDigits之后的名词的原始单数/复数规则。我试着用多个名词作为

代码语言:javascript
复制
    mkNP(mkCN
           (mkN("ein"))
           (mkNP(mkCN
               (mkN("ein"))
               (mkNP(mkN("halb"))))));

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

因此,我尝试扩展一个NP并将多个字符串添加到它的中,如下所示

代码语言:javascript
复制
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实例,但是它们对于这个问题并不重要。

代码语言:javascript
复制
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意味着什么?如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-22 09:10:01

卡片/Det或NP

你是想用分数作为限定符("eineinhalb“),还是只使用独立的名词短语("eineinhalb")?无论哪种方式,都有几种不同的方式,它们都不需要扩展NPs。

如果分数不拐弯抹角,快速而肮脏的解

不幸的是,mkCard期望输入类似于"35",如果您键入字母或小数点,则会出现错误。

但是,如果您的分数不变化,或者即使它们在语言中转换,但是应用程序不需要拐点,那么最简单的方法就是使用符号模块,特别是下面的两个选项

代码语言:javascript
复制
mkSymb : Str -> Symb  ;     -- x
symb   : Symb -> Card ;     -- n (number)

默认情况下,symb函数使Card变为复数。所以你可以做任何这样的卡片:

代码语言:javascript
复制
oper myMkCard : Str -> Card = \s -> symb (mkSymb s) ;

GF语法

这是德语的通用代码。

代码语言:javascript
复制
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
}

测试输出:

代码语言:javascript
复制
> 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中解决,而不是每个人都有自己的黑客行为。

知道分数的哪一部分相互影响是非常重要的。例如,在瑞典语中,“1”是" en“或" ett”,这取决于性别,而"one“则是"en och en halv”或"ett och ett halvt“。这些都是复杂的事情,其实现属于RGL。

折变分数的通解

我们应该在RGL中扩展mkCard操作,以便它接受像"3.5“或”1.5“这样的输入。我可以自愿这样做,因为我自己知道的语言,但它不会在我的优先名单上。

如果您想在RGL的分叉中尝试一下,请查看不同语言的数字模块,看看数字是如何构造的。例如,代表德国人,您可以使用它并尝试找出以下问题

  • 您需要更改或添加什么,以使其输出“吸入器”?
  • 吸入器在不同的病例和数量中表现如何?你是说“吸入器”,“吸入器”还是别的什么?
  • 序数呢--你能说“第一和第六节”吗?(我假设一般情况下不会,这就是为什么我只是建议改变mkCard,而不是mkNumeral :-P)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67171468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档