在 GF 上的 RGL 中添加 -ing 后缀

问题描述 投票:0回答:1

英语中有复合动词,直接添加 (ing) 是不正确的,例如添加 ing to

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

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

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

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

gf
1个回答
1
投票

修复你的代码

您的代码由于以下几个原因无法工作:

  1. 返回类型必须是类别,但
    verbalN
    是操作符。所以它应该像
    compVerbalN : Str -> Str -> N
    ,或者更确切地说
    compVerbalN : V -> Str -> N
  2. 在函数体中,您错误地使用了参数。
    • 您尝试访问
      s
      x
      y
      字段,但根据类型签名,它们是字符串,而不是具有命名字段的记录。
    • 您尝试给
      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
之类的结构。

© www.soinside.com 2019 - 2024. All rights reserved.