使用GF中的分数

  • 本文关键字:GF 使用 gf
  • 更新时间 :
  • 英文 :


我试图将小数和两位数的分数添加到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意味着什么?如何解决这样的问题?

卡/Det或NP

你想用分数作为限定词("eineinhalb-Katzen"(,还是只使用独立的名词短语("einein halb"(?无论哪种方式,都有几种不同的方式,没有一种需要扩展NP。

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

不幸的是,mkCard的RGL运算器期望输入类似于"0";35〃;,如果你键入字母或小数点,它会出错。

但是,如果你的分数没有变化,或者即使它们在语言中发生了变化,但你的应用程序不需要变化,那么最简单的方法就是使用符号模块,特别是下面的一对操作

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中解决,而不是让每个人都自己动手。

知道分数的哪些部分有屈折是非常重要的。例如在瑞典语中;一个";是";en";或";ett";取决于性别;一个半";是";en och en halv";或";ett och ett halvt";。这些都是复杂的事情,其实现属于RGL。

变形分数的一般解法

我们应该只是扩展RGL中的CCD_ 7操作符;3.5〃;或";1½〃;。我可以自愿为我自己熟悉的语言做这件事,但这不会是我的首要任务。

如果你想在你自己的RGL分支中尝试一下,看看不同语言的数字模块,看看数字是如何构造的。例如,这是德语的mkDigit,你可以玩它,试着找出以下问题

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

最新更新