Расширение DCG в Прологе - PullRequest
1 голос
/ 13 февраля 2020

Я пишу генератор кода, который преобразует грамматики определенных предложений в другие грамматические обозначения. Для этого мне нужно развернуть правило грамматики:

:- initialization(main).

main :- 
        -->(example,A),writeln(A).
% this should print ([a],example1), but this is a runtime error

example --> [a],example1.
example1 --> [b].

Но -->(example, A) не расширяет правило, даже если здесь определено -->/2. Есть ли другой способ получить доступ к определениям правил грамматики DCG?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Как вы написали в комментариях, если вы хотите преобразовать DCG в CHR, вам нужно применить преобразование перед расширением DCG по умолчанию на предложения. Например, если ваш код сохранен в grammars.pl файле:

?- assertz(term_expansion((H --> B), '--->'(H,B))).
true.

?- assertz(goal_expansion((H --> B), '--->'(H,B))).
true.

?- [grammars].
[a],example1
true.
1 голос
/ 13 февраля 2020

Это предположение о том, что вы ожидаете и почему у вас возникли проблемы. Меня это просто беспокоит, потому что я знаю, что вы умны и должны быть в состоянии соединить точки из комментариев. (Комментарии были удалены, когда они были опубликованы, но ОП их видел.)

Это очень точно c для SWI-Prolog.

Когда загружается код Prolog, он автоматически проходит через термин расширение, как указано в expand.pl .

Любое предложение с --> будет расширено на основе правил dcg_translate_rule / 2 . Поэтому, когда вы используете перечисление / 1 в коде после его загрузки, предложения с --> уже были расширены. Так что AFAIK вы не можете видеть ([a],example1), который является кодом перед загрузкой и расширением термина, но example([a|A], B) :- example(A, B), который является кодом после загрузки и расширением термина.

Единственный способ получить требуемый код - это отключить термин расширение во время загрузки, но тогда код, который должен был быть расширен, не будет и код не запустится.

Вы также можете попытаться найти источник для загруженного кода, но я также думаю, что это не то, что вы хотите сделать.

Исходя из этого I'm writing a code generator that converts definite clause grammars to other grammar notations., возможно, вам нужно заменить код для dcg_translate_rule / 2 или каким-то образом перехватывает код при загрузке и перед расширением термина.

HTH


Что касается ошибки, связанной с -->(example,A),writeln(A)., потому что это не является допустимым предложением DCG.

...