0

如何提取文件中存在的模块名称和可选谓词?

如果我有一个包含对一个或多个模块的调用的file.pl,我如何提取这些模块的名称和模块声明中的谓词名称?

示例:如果我的文件包含对模块的调用

:- use_module(library(lists), [ member/2,
                                append/2 as list_concat
                              ]).
:- use_module(library(option).

我想创建一个predicate extract(file.pl)

输出 List=[[list,member,append],[option]]

谢谢。

4

1 回答 1

1

假设 SWI-Prolog(如标记)。您可以为这个 Prolog 编译器编写类似于我在 Logtalk 适配器文件中所做的事情:

list_of_exports(File, Module, Exports) :-
    absolute_file_name(File, Path, [file_type(prolog), access(read), file_errors(fail)]),
    module_property(Module, file(Path)),    % only succeeds for loaded modules
    module_property(Module, exports(Exports)),
    !.
list_of_exports(File, Module, Exports) :-
    absolute_file_name(File, Path, [file_type(prolog), access(read), file_errors(fail)]),
    open(Path, read, In),
    (   peek_char(In, #) ->                 % deal with #! script; if not present
        skip(In, 10)                        % assume that the module declaration
    ;   true                                % is the first directive on the file
    ),
    setup_call_cleanup(true, read(In, ModuleDecl), close(In)),
    ModuleDecl = (:- module(Module, Exports)),
    (   var(Module) ->
        file_base_name(Path, Base),
        file_name_extension(Module, _, Base)
    ;   true
    ).

请注意,此代码不处理可能作为文件的第一项出现的 encoding/1 指令。该代码也是很久以前在 SWI-Prolog 作者的帮助下编写的。

于 2013-05-14T11:12:40.700 回答