在 Prolog 中扩展 DCG
Expanding DCGs in Prolog
我正在编写一个代码生成器,将定子句语法转换为其他语法符号。为此,我需要扩展一个语法规则:
:- 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 语法规则的定义?
这是对您的期望以及您遇到问题的原因的猜测。这让我很烦,因为我知道你很聪明,应该能够将评论中的点点滴滴联系起来。 (发布时评论被删除,但OP确实看到了。)
这是 SWI-Prolog 特有的。
加载 Prolog 代码时,它会自动进行术语扩展,如 expand.pl 中所述。
任何带有-->
的子句在加载后都会根据dcg_translate_rule/2. So when you use 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 子句。
正如您在评论中所写,如果您想将 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.
我正在编写一个代码生成器,将定子句语法转换为其他语法符号。为此,我需要扩展一个语法规则:
:- 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 语法规则的定义?
这是对您的期望以及您遇到问题的原因的猜测。这让我很烦,因为我知道你很聪明,应该能够将评论中的点点滴滴联系起来。 (发布时评论被删除,但OP确实看到了。)
这是 SWI-Prolog 特有的。
加载 Prolog 代码时,它会自动进行术语扩展,如 expand.pl 中所述。
任何带有-->
的子句在加载后都会根据dcg_translate_rule/2. So when you use 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 子句。
正如您在评论中所写,如果您想将 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.