首先,您制作的结构不是相对子句,而是这种结构:
mkCN : CN -> S -> CN -- rule that she sleeps
相对子句具有RS
RGL 中的类型。
如何构建一个实际的 RS
在这里,我逐渐构建了 RS。如果您愿意,请随意将这些步骤放回一个表达式,但我发现这样的事情更清楚。
oper
last_year_Adv : Adv = ParadigmsEng.mkAdv "last year" ;
published_last_year_VP : VP = mkVP (passiveVP (mkV2 "publish")) last_year_Adv ;
which_is_published_last_year_RCl : RCl = mkRCl which_RP published_last_year_VP ;
which_was_published_last_year_RS : RS = mkRS pastTense which_is_published_last_year_RCl ;
lin
play_TS = mkUtt (mkImp (mkVP
(mkV2 "play")
(mkNP
(mkNP (mkPN "Toy Story"))
which_was_published_last_year_RS)
)
) ;
现在,当我们在 GF shell 上测试它时,我们看到尽管有名字,但which_RP
实际上是“那个”。
> l play_TS
play Toy Story , that was published last year
如何将“那个”变成“哪个”
当你想创建一个新的词法项时,首先要检查的是 Paradigms 模块。不幸的是,没有mkRP
英语。诸如关系代词之类的东西通常被认为是封闭的类:它们只有一小部分,固定数量。封闭类的其他例子是基本数字(你不能只是在 4 和 5 之间组成一个新的整数!)和限定符。将此与诸如名词、动词和形容词之类的开放课程进行对比,这些课程一直在弹出。对于公开课,Paradigms 模块有很多选择。但不适用于封闭类,如关系代词。
因此,如果 Paradigms 没有帮助,接下来要检查的是特定于语言的Extra模块。
检查特定语言的额外模块
如果您在自己的计算机上拥有 RGL 源代码,则只需转到该目录gf-rgl/src/english
并 grep 获取which
. 或者您可以使用RGL 浏览器搜索感兴趣的功能。
而且在ExtraEng中确实有一个关系代词,也叫which_RP
. (还有一个叫做who_which_RP
.)所以现在你可以在你的语法中做这些修改:
concrete MyGrammarEng of MyGrammar =
open SyntaxEng,
ParadigmsEng,
ExtraEng -- Need to open ExtraEng in the concrete!
in ** {
-- … as usual, except for
oper
which_is_published_last_year_RCl : RCl =
mkRCl ExtraEng.which_RP -- Use the ExtraEng.which_RP!
published_last_year_VP ;
其余的代码和以前一样。这会产生您想要的结果。
> l play_TS
play Toy Story , which was published last year
最后的黑客攻击
因此,您查看了所有可能的模块,但一无所获。考虑将其作为gf-rgl 存储库中的一个问题,如果它是明显错误或缺失的东西。
但无论如何,这里有一个通用的、不安全的技巧来快速构建你想要的东西。
首先,让我们看一下 CatEng 中RP
的lincat,{s : RCase => Str ; a : RAgr}
. 然后让我们看看它在RelativeEng中的实现。在那里,您还可以看到为什么总是“that”的解释:与who和which不同,“that”适用于有生命和无生命的 NP。
所以我会这样做来强制字符串“which”:
oper
myWhich_RP : RP = which_RP ** {s = table {_ => "which"}} ;
**
语法意味着记录扩展。我们使用原始的所有其他字段which_RP
,但在s
字段中,我们放置了一个表,其所有分支都包含字符串“which”。(您可以在我的博客中阅读有关此技术的更多信息。)
myWhich_RP
然后我们在形成关系子句时使用新定义的:
oper
which_is_published_last_year_RCl : RCl = mkRCl myWhich_RP published_last_year_VP ;
这也有效,但不安全,因为每当 RGL 更改时,任何触及原始实现的代码都可能中断。