我试图在RGL中添加小数和两位数的分数,同时保留在、mkNumeral、或mkDigits之后的名词的原始单数/复数规则。我试着用多个名词作为
mkNP(mkCN
(mkN("ein"))
(mkNP(mkCN
(mkN("ein"))
(mkNP(mkN("halb"))))));但是这种方法并不适用于所有的语言,因为在德语中eineinhalb中没有空格,使用aPl_Det来获得名词的复数可能适用于英语和德语,但对于其他语言,例如法语,实际上有一个真正的aPl_Det。
因此,我尝试扩展一个NP并将多个字符串添加到它的的中,如下所示
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意味着什么?如何解决这个问题?
发布于 2021-04-22 09:10:01
卡片/Det或NP
你是想用分数作为限定符("eineinhalb“),还是只使用独立的名词短语("eineinhalb")?无论哪种方式,都有几种不同的方式,它们都不需要扩展NPs。
如果分数不拐弯抹角,快速而肮脏的解
不幸的是,mkCard期望输入类似于"35",如果您键入字母或小数点,则会出现错误。
但是,如果您的分数不变化,或者即使它们在语言中转换,但是应用程序不需要拐点,那么最简单的方法就是使用符号模块,特别是下面的两个选项
mkSymb : Str -> Symb ; -- x
symb : Symb -> Card ; -- n (number)默认情况下,symb函数使Card变为复数。所以你可以做任何这样的卡片:
oper myMkCard : Str -> Card = \s -> symb (mkSymb s) ;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中解决,而不是每个人都有自己的黑客行为。
知道分数的哪一部分相互影响是非常重要的。例如,在瑞典语中,“1”是" en“或" ett”,这取决于性别,而"one“则是"en och en halv”或"ett och ett halvt“。这些都是复杂的事情,其实现属于RGL。
折变分数的通解
我们应该在RGL中扩展mkCard操作,以便它接受像"3.5“或”1.5“这样的输入。我可以自愿这样做,因为我自己知道的语言,但它不会在我的优先名单上。
如果您想在RGL的分叉中尝试一下,请查看不同语言的数字模块,看看数字是如何构造的。例如,代表德国人,您可以使用它并尝试找出以下问题
mkCard,而不是mkNumeral :-P)https://stackoverflow.com/questions/67171468
复制相似问题