Запуск приведенного ниже кода генерирует его для меня при использовании английских файлов из RGL. Но изменение файлов библиотеки на испанский дает этот вывод vende &+ lo me, где, с другой стороны, правильный вывод должен быть чем-то вроде этого vendeme esto.
concrete TestSpa of Test = open SyntaxSpa, ParadigmsSpa, IrregSpa, LexiconSpa in {
lincat
Utterance = Utt;
lin
Sentence = mkUtt(mkImp(mkVP
sell_V3
it_NP
i_NP
));
}
В чем причина этой ошибки и как ее исправить, спасибо!
Да, повелительные формы и клитики в дитранзитивных конструкциях — известная проблема в романских языках RGL, см. https://github.com/GrammaticalFramework/gf-rgl/tree/master/src/spanish#known-issues
Есть несколько решений:
Например, мы замечаем, что РГЯ не присоединяет косвенное дополнение к глаголу, но мы можем его взломать: давайте превратим косвенное дополнение в прямое, а прямое в наречие, и тогда мы получим то, что хотим.
Sentence =
let vendeme : VP = mkVP <sell_V3 : V2> i_NP ; -- hack: pretend that i_NP is direct object, to get vendeme. (Unfortunately no é on véndeme.)
esto : Adv = ParadigmsSpa.mkAdv "esto" ; -- hack: make "esto" into an adverb
in mkUtt (mkImp (mkVP vendeme esto)) ; -- using mkVP : VP -> Adv -> VP
Проверка вывода:
> l Sentence
vende &+ me esto
Просто упомянем для полноты картины: вы можете убрать &+ с флагом -bind
:
> l -bind Sentence
vendeme esto
Я знаю, что акцента нет, и это позор. Но большинство «реальных» применений GF включают использование его как части какой-либо программы, а не отдельного приложения в оболочке GF, и это дает нам больше возможностей для исправления таких проблем.
Проблема ограничивается конструкциями, в которых и прямое, и косвенное дополнение являются местоимениями. Если вы используете GF из любого другого приложения, вы можете добавить этап постобработки.
Я запускаю эту команду, когда у меня есть испанская грамматика ресурсов в оболочке GF.
Lang> gt ImpVP (ComplSlash (Slash3V3 sell_V3 (UsePron ?)) (UsePron ?)) | l
vende &+ la le
vende &+ la les
vende &+ la me
...
vende &+ te nos
vende &+ te os
vende &+ te te
Это дает вам кучу строк, и все они неверны. Вы можете написать правила замены, такие как s/vende &+ la le/véndesela/
, на любом другом языке программирования, а затем запустить вывод GF через свой скрипт.