将expand_term/2与文件一起用于dcg翻译



我正在尝试"翻译";包含dcg的文件。特别是,我试图使用expand_term/2将所有dcg转换为正常的确定子句,但我希望避免手动翻译所有dcg,所以我会尝试一次翻译文件的所有子句(例如传递整个文件(。有什么办法吗?

例如,假设我们有一个temp.pl文件,其中包含一些dcg:

a(X,Y) --> b(X), c(Y).
d([A | Ax]) --> b(A).
....
....

而不是为每个术语单独使用expand_term/2,如:

?- expand_term((a(X,Y) --> b(X), c(Y)), Clause).
Clause = [(:-non_terminal(user:a/4)),  (a(X, Y, _A, _B):-b(X, _A, _C), c(Y, _C, _B))].

然后将文件中的dcg替换为define子句。

例如,我想传递整个文件(例如传递到一个子句)它包含dcg,并一次翻译所有dcg,然后打印在文件中或作为输出,我不知道。

如果我正确理解你的问题,那么你就错过了一个显而易见的问题,那就是你所寻求的已经在SWI Prolog代码中了。翻译是在加载模块时完成的。如果在DCG谓词上使用listing/1,则代码将作为普通Prolog而不是DCG列出。

请参阅dcg.pl
load.pl
expand.pl
apply_macross.pl


使用DCG 进行挂牌/1的演示

目录:C:/Users/Groot
文件:example.pl(基于此SO答案(

:- module(example,
[
monlangage/2
]).
:- set_prolog_flag(double_quotes, chars).
monlangage --> "ab" | "a", monlangage.

示例运行

Welcome to SWI-Prolog (threaded, 64 bits, version 8.5.3)
...
?- working_directory(_,'C:/Users/Groot').
true.
?- [example].
true.
?- listing(example:_).
monlangage(A, B) :-
(   A=[a, b|B]
;   A=[a|C],
monlangage(C, B)
).
true.

请注意,源代码是带有-->的DCG,而列表不是带有:-的DCG。还要注意,重写后的子句有两个额外的参数。

最新更新