如何在 SWI-Prolog 中列出模块内的子句?

How to list the clauses inside a module in SWI-Prolog?

SWI-Prolog 有例如 library(dcgbasics) for use with DCGs.

虽然使用 use_module/1 很容易引用模块,例如

:- use_module(library(dcg/basics)).

尝试使用 listing/1 并不容易。

?- listing(dcg:_).
true.

?- listing(dcgbasics:_).
true.

?- basics:listing.
true.

获取 library(dcg/basics) 中子句列表的正确方法是什么?


给出答案后跟进。

列出特定条款,例如blanks//0查询是

?- listing(dcg_basics:blanks).
blanks(A, B) :-
    blank(A, C),
    !,
    D=C,
    blanks(D, B).
blanks(A, A).

true.

使用其中之一:

?- dcg_basics:listing.

或者:

?- listing(dcg_basics:_).

use_module/1-2 的第一个参数是文件说明,而不是模块名称。但是列出模块内容需要实际的模块名称,它可能与模块文件 basename 不同(就像这里的情况一样)。但是如何从文件规范中找到模块名称呢?在 SWI-Prolog 的特殊情况下:

?- absolute_file_name(library(dcg/basics), Path, [extensions([pl])]),
   module_property(Module, file(Path)).
Path = '/Users/pmoura/lib/swipl/library/dcg/basics.pl',
Module = dcg_basics.