扩展Prolog中的DCG

问题描述 投票:1回答:2

我正在编写一个代码生成器,将定句语法转换为其他语法符号。为此,我需要扩展一个语法规则:

:- 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语法规则的定义吗?

prolog swi-prolog dcg
2个回答
1
投票

这是对您的期望以及您为什么遇到问题的猜测。这只是让我感到烦恼,因为我知道您很聪明,应该能够将评论中的内容联系起来。 (发布时删除了评论,但OP确实看到了它们。)

这是专门针对SWI-Prolog。

[加载Prolog代码后,它会自动进行术语扩展,如expand.pl中所述。

带有-->的任何子句将根据dcg_translate_rule/2的规则进行扩展。因此,在代码加载后在代码上使用listing/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子句。


0
投票

当你在评论中写道,如果你想DCG中转换成CHRS,您需要申请转换默认扩展DCG中的成条款。例如,假设您的代码已保存到grammars.pl文件中:

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

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

?- [grammars].
[a],example1
true.
© www.soinside.com 2019 - 2024. All rights reserved.