“玩玩具总动员”去年出版的“”
Sentence = mkUtt( mkImp (mkVP
(mkV2 "play")
(mkNP (mkCN
(mkCN (mkN "Toy Story"))
(mkS pastTense simultaneousAnt(mkCl (mkVP
(mkV2 "publish")
(mkNP (mkCN (mkN "last yser")))
)))
))
));在GF中创建关系从句时,句子的语法S总是会添加,这两个句子之间的是用代替的任何方法。
发布于 2020-11-22 11:50:20
首先,您创建的结构不是关系子句,而是这个结构:
mkCN : CN -> S -> CN -- rule that she sleeps关系子句在RGL中具有RS类型。
如何构建一个实际的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上测试它时,我们看到,尽管名称是,which_RP实际上是“那个”。
> l play_TS
play Toy Story , that was published last year如何将“那”改为“哪”
当您想要创建一个新的词法项时,首先要检查的是范例模块。不幸的是,英语没有mkRP。像相对代词这样的事物通常被认为是封闭的:只有一小部分,固定的数量。封闭类的其他示例是基本数字(您不能只在4到5之间构造一个新的整数!)还有行列式。与之形成对比的是,像名词、动词和形容词这样的开放类经常会弹出。对于开放类,范例模块有许多选项。但不适用于封闭类,比如关系代词。
因此,如果范例没有帮助,那么接下来要检查的是特定于语言的额外的模块。
检查特定于语言的额外模块
如果您自己的计算机上有RGL源代码,则只需转到gf-rgl/src/english目录和which的grep目录。或者您可以使用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存储库中发出,如果它是明显错误或缺失的东西。
但无论如何,这里有一个普遍的,不安全的黑客,可以快速构建你想要的东西。
首先,让我们来看看RP的lincat in CatEng,{s : RCase => Str ; a : RAgr}。然后让我们看看它在RelativeEng中的实现。在这里,你也看到了为什么总是“那个”的解释:不像谁和谁,“那个”适用于动画和无生命的NPs。
所以我会这样做来强制字符串“其中”:
oper
myWhich_RP : RP = which_RP ** {s = table {_ => "which"}} ;**语法意味着记录扩展。我们使用原始which_RP中的所有其他字段,但是在s字段中,我们放置了一个表,该表的所有分支都包含字符串“whose”。(您可以阅读更多关于这种技术的在我的博客里。)
然后,我们使用新定义的myWhich_RP来形成关系子句:
oper
which_is_published_last_year_RCl : RCl = mkRCl myWhich_RP published_last_year_VP ;这也有效,但不安全,因为每当RGL更改时,任何接触原始实现的代码都可能中断。
https://stackoverflow.com/questions/64953377
复制相似问题