在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,但我还没有找到方法。