英语中有复合动词,直接添加 (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 操作如何协同工作的想法。
您的代码由于以下几个原因无法工作:
verbalN
是操作符。所以它应该像 compVerbalN : Str -> Str -> N
,或者更确切地说 compVerbalN : V -> Str -> N
。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 构建某些内容,那么您应该这样做。
要构造助词动词,您需要使用 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
在回答这个问题时,我注意到
verbalN
最初并不包含粒子,所以我在几分钟前的提交中添加了它。因此,为了查看该输出,您需要更新 RGL。
如果无法更新您的 RGL(例如,您在无法安装东西的学校计算机上工作),那么您将需要使用本答案开头的
compVerbalN
之类的结构。