问题
我试图使用RGL在GF上生成句子It's sunny on Monday and rainy on Tuesday。我在RGL页面上寻找一种生成这个句子的方法,但是我找不到任何可能对此有帮助的方法。查看Extend.gf on GitHub以获得有关GF的更多信息,我发现了以下三行:
MkVPS : Temp -> Pol -> VP -> VPS ; -- hasn't slept
ConjVPS : Conj -> [VPS] -> VPS ; -- has walked and won't sleep
PredVPS : NP -> VPS -> S ; -- she [has walked and won't sleep]乍一看,它们似乎很有希望,但当我尝试在真正的代码上实现它们时,似乎滥用了[VPS]。我的代码:
mkPhr(PredVPS
(it_NP)
(ConjVPS
(and_Conj)
(MkVPS
(mkTemp (futureTense) (simultaneousAnt))
(positivePol)
(mkVP
(mkVP (mkA "sunny"))
(SyntaxEng.mkAdv (on_Prep) (mkNP (mkN ("Monday"))))))
(MkVPS
(mkTemp (futureTense) (simultaneousAnt))
(positivePol)
(mkVP
(mkVP (mkA "rainy"))
(SyntaxEng.mkAdv (on_Prep) (mkNP (mkN ("Tuesday"))))))));但是我遇到了这个错误,这显然是定义的变量和预期变量的问题。
missing record fields: s1, s2 type of MkVPS (mkTemp futureTense simultaneousAnt) positivePol (AdvVP ((\a -> UseComp (CompAP (PositA a))) (regA "rainy")) (PrepNP on_Prep ((\n -> MassNP (UseN n)) (regN "Monday"))))
expected: {s1 : ResEng.Agr => Str; s2 : ResEng.Agr => Str}
inferred: {s : ResEng.Agr => Str; lock_VPS : {}}问题
使用[VPS]的正确方法是什么?
发布于 2022-02-11 02:41:46
对清单的澄清
与其他列表类别C一样,您需要使用一个构造函数,该构造函数需要两个(或更多)C,并创建一个[C]。
对于RGL中的类别,有mkC : Conj -> C -> C -> C类型的方便选项,但在屏蔽项下,这些选项还需要为[C]调用适当的构造函数。(构造函数名为BaseC和ConsC,您可以在lists 这里上阅读更多内容。)
如何在VPSs中使用连词
因此,VPS不在API中,因此没有使用类型签名Conj -> VPS -> VPS -> VPS的方便程序。相反,您需要显式地调用BaseVPS。这是工作代码,我把你的长表达式切成小块。
resource VPS = open SyntaxEng, ParadigmsEng, ExtendEng in {
oper
-- Lexicon
sunny_A : A = mkA "sunny" ;
rainy_A : A = mkA "rainy" ;
monday_N : N = mkN "Monday" ;
tuesday_N : N = mkN "Tuesday" ;
-- Helper functions
adj_on_day : A -> N -> VP = \a,n ->
mkVP (mkVP a) (SyntaxEng.mkAdv on_Prep (mkNP n)) ;
sunny_on_Monday_VP : VP = adj_on_day sunny_A monday_N ;
rainy_on_Tuesday_VP : VP = adj_on_day rainy_A tuesday_N ;
tenseVPS : Tense -> VP -> VPS = \tns,vp ->
MkVPS (mkTemp tns simultaneousAnt) positivePol vp ;
futureVPS = tenseVPS futureTense ;
pastVPS = tenseVPS pastTense ;
-- Constructing the phrase
-- lin: "it will be sunny on Monday and will be rainy on Tuesday"
futFutPhrase : Phr =
mkPhr (
PredVPS it_NP
(ConjVPS -- : Conj -> [VPS] -> VPS
and_Conj -- : Conj
(BaseVPS -- : VPS -> VPS -> [VPS]
(futureVPS sunny_on_Monday_VP) -- : VPS
(futureVPS rainy_on_Tuesday_VP) -- : VPS
)
)
) ;
-- lin: "it was sunny on Monday and will be rainy on Tuesday"
pastFutPhrase : Phr =
mkPhr (
PredVPS it_NP
(ConjVPS -- : Conj -> [VPS] -> VPS
and_Conj -- : Conj
(BaseVPS -- : VPS -> VPS -> [VPS]
(pastVPS sunny_on_Monday_VP) -- : VPS
(futureVPS rainy_on_Tuesday_VP) -- : VPS
)
)
) ;
}它的作用是这样的:
$ gf
Languages:
> i -retain VPS.gf
> cc -one futFutPhrase
it will be sunny on Monday and will be rainy on Tuesday
> cc -one pastFutPhrase
it was sunny on Monday and will be rainy on Tuesday所以在这两种情况下,时态都是重复的,因为连词是在VPS水平上,而不是在AP层次上。
如何创建你想要的短语
如果您想使用省略号,“星期一将是晴天,星期二会下雨”,则需要使用AdvAP将“周一”附加到AP " sunny“,然后进行AP连接,将该AP转换为VP,然后像往常一样在Cl中使用该VP。下面是代码,这是一个独立于前一个文件的文件:
resource APConj = open SyntaxEng, ParadigmsEng, (A=AdjectiveEng) in {
oper
-- Lexicon
sunny_A : A = mkA "sunny" ;
rainy_A : A = mkA "rainy" ;
monday_N : N = mkN "Monday" ;
tuesday_N : N = mkN "Tuesday" ;
-- Helper functions
adj_on_day : A -> N -> AP = \a,n ->
A.AdvAP (mkAP a) (SyntaxEng.mkAdv on_Prep (mkNP n)) ;
sunny_on_Monday_AP : AP = adj_on_day sunny_A monday_N ;
rainy_on_Tuesday_AP : AP = adj_on_day rainy_A tuesday_N ;
-- Constructing the phrase
sunnyRainyEllipsisPhrase : Phr =
mkPhr (
mkCl (
mkVP (mkAP and_Conj sunny_on_Monday_AP rainy_on_Tuesday_AP)
)
) ;
}工作方式如下:
$ gf
Languages:
> i -retain APConj.gf
> cc -one sunnyRainyEllipsisPhrase
it is sunny on Monday and rainy on Tuesdayhttps://stackoverflow.com/questions/71061653
复制相似问题