在Prolog中扩展DCGs

在Prolog中扩展DCGs,prolog,swi-prolog,dcg,Prolog,Swi Prolog,Dcg,我正在编写一个代码生成器,将定分句语法转换为其他语法符号。为此,我需要展开一个语法规则: :- initialization(main). main :- -->(example,A),writeln(A). % this should print ([a],example1), but this is a runtime error example --> [a],example1. example1 --> [b]. 但是-->(例如,A)不会扩展规

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

:- initialization(main).

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

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

但是
-->(例如,A)
不会扩展规则,即使这里似乎定义了
-->/2
。是否有其他方法可以访问DCG语法规则的定义?

这是对您的期望以及出现问题的原因的猜测。这让我很烦,因为我知道你很聪明,应该能够把评论中的点滴联系起来。(发布时,评论被删除,但OP确实看到了。)

这对于SWI Prolog来说非常具体

加载Prolog代码时,它会自动进行术语扩展,如中所述

任何带有
-->
的子句都将根据的规则进行扩展。因此,在加载代码后对其使用时,带有
-->
的子句已经展开。这样一来,您就看不到
([a],示例1)
这是加载之前的代码,然后是术语扩展,但是
示例([a | a],B):-示例(a,B)
这是加载和术语扩展之后的代码

获得所需代码的唯一方法是在加载过程中关闭术语扩展,但是本应扩展的代码将不会运行,代码也不会运行

您也可以尝试查找加载代码的源代码,但我也认为这不是您想要做的

基于此
我正在编写一个代码生成器,将定句语法转换为其他语法符号。
也许您需要替换dcg\u translate\u rule/2的代码,或者在加载时和术语扩展之前截取代码



至于与
-->(例如,A)相关的错误,请写入(A)。
,这是因为这不是有效的DCG子句

正如您在评论中所写,如果您想将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.

@GuyCoder
列表(示例)
不打印
[a],示例1
。它打印
示例(A,A)。示例([a | a],B):-改为示例(a,B)
。为什么要这样?您正在干扰内置/内置机制。为什么不使用另一个运算符?@false我已经编写了几个DCG语法,所以我想将它们转换为,而不必手动重新编写它们。最好一次性转换该文件。在某些情况下,可以将扩展子句转换回DCG,但我还没有找到方法。