1

英语有复合动词,加直接(ing)是不正确的,比如加ing到

"turn on" -> RGL -> ParadigmsEng -> verbalN -> "turn onning"

显然上面所做的不正确,所以我试图在verbalN中出现一个新的操作,如果动词是两个单词的一部分,那么第一个遵循verbalN规则,而另一个保持不变。我写了下面的代码,但是没有用。

oper
compVerbalN : Str -> Str -> verbalN
= \x,y -> (verbalN (x.s) ++ y.s));

我知道上述操作可能并不正确,但我仍然无法理解 GF 操作如何协同工作的想法。

谢谢

4

1 回答 1

1

修复你的代码

您的代码不起作用有几个原因:

  1. 返回类型必须是一个类别,但是verbalN是一个操作符。所以应该是这样compVerbalN : Str -> Str -> N,或者更确切地说compVerbalN : V -> Str -> N
  2. 在函数体中,您错误地使用了参数。
    • 您尝试访问 and 的字段s,但根据类型签名,它们是字符串,而不是具有命名字段的记录。xy
    • 您尝试将verbalN字符串作为参数,但实际上它需要一个V.

让我们假设为了练习,你想要这个类型签名,Str -> Str -> N. 然后你需要做这样的事情:

compVerbalN : Str -> Str -> N = \turning,on ->
  let turning_N : N = mkN turning ;
   in turning_N ** {
        s = \\num,cas => turning_N.s ! num ! cas ++ on
      } ;

在 GF shell 中测试:

> cc -table compVerbalN "turning" "on"
g . Neutr
s . Sg => Nom => turning on
s . Sg => Gen => turning's on
s . Pl => Nom => turnings on
s . Pl => Gen => turnings' on

这会产生正确的结果,但像这样戳穿 GF 类别的内部结构是有风险的。RGL API 是固定的,但是 RGL 的实现细节总是可以改变的,比如一些表有什么参数以及调用什么字段名。因此,如果可以仅使用 RGL API 构建某些东西,那么您应该这样做。

如何使用 RGL

要构造助词动词,您需要使用 ParadigmsEng 构造函数partV,它具有以下类型签名:

partV : V -> Str -> V -- with particle, e.g. switch + on

如果你的动词结构正确,那么verbalN应该产生正确的名词。这是一个例子:

resource Test = open SyntaxEng, ParadigmsEng in {
  oper
    turn_on_V : V = partV (mkV "turn") "on" ;
    turning_on_N : N = verbalN turn_on_V ;
}

在 GF shell 中测试(之后i -retain Test.gf):

> cc -table turning_on_N
g . Neutr
s . Sg => Nom => turning on
s . Sg => Gen => turning's on
s . Pl => Nom => turnings on
s . Pl => Gen => turnings' on

更新您的 RGL

在回答这个问题时,我注意到verbalN最初并没有包含粒子,所以我在几分钟前的提交中添加了它。所以为了看到那个输出,你需要更新你的 RGL。

如果无法更新您的 RGL(例如,您在无法安装东西的学校计算机上工作),那么您将需要使用compVerbalN此答案开头的结构。

于 2020-11-26T19:08:54.617 回答