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

标签 reflection module prolog swi-prolog

SWI-Prolog 有例如 library(dcgbasics)用于 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.

关于reflection - 如何在 SWI-Prolog 中列出模块内的子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54402993/

相关文章:

list - 关于建立一个列表直到它满足条件

java - 使用反射在没有实例的情况下调用父类(super class)方法

swift - 将反射对象的属性转换回其原始类型

python - 模块的源更改不生效

java - PlayPlugin onApplicationStart 不起作用

list - 在 Prolog 中反转列表

macos - 如何将结果输出到shell?

C# 自定义属性属性反射

c# - 什么更快 : expression trees or manually emitting IL

JavaScript - 模块模式 - 添加 div 的问题