我正在尝试"翻译";包含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。还要注意,重写后的子句有两个额外的参数。