如何获取特定知识库的列表?

时间:2017-02-22 18:01:36

标签: prolog swi-prolog

假设当前正在运行的文件foobar.pl 目录包含以下最小知识库:

foo(bar).
foo(baz).
frobozz.

如果我启动swi-prolog(通过在命令中运行swipl),并立即运行

?- [foobar].
% foobar compiled 0.00 sec, 4 clauses
true.

?- listing.

... foobar的内容在> 100行无关输出的海洋中丢失。

如何将listing的输出限制为foobar

或者,如何将其限制为我明确consult编辑的知识库的内容?

我确实查看了listing/1listing/0的{​​{3}},但我找不到任何有用的信息:

  

清单/ 1   列出Pred指定的谓词。 Pred可以是谓词名称(atom),它列出具有此名称的所有谓词,而不管它们的arity。它也可以是谓词指示符(/或//),可能与模块合格。例如:? - listing(lists:member / 2)..

     

通过使用子句/ 2枚举谓词的子句并使用portray_clause / 1打印每个子句来生成列表。这意味着生成变量名称(A,B,...),布局由portray_clause / 1中的规则定义。

     

清单/ 0   使用listing / 1列出来自调用模块的所有谓词。例如,? - 列表。列出默认用户模块中的子句和? - 列表:列表。列出模块列表中的子句。

当然,我确实尝试了以下无用的想法:

?- foobar:listing.
true.

2 个答案:

答案 0 :(得分:3)

在SWI-Prolog中,您可以使用module / 2 指令限制已加载子句的范围。即您的文件foobar.pl应该成为(例如)

:- module(foobar, [foo/1]).

foo(bar).
foo(baz).
frobozz.

答案 1 :(得分:2)

您可以轻松地将普通Prolog文件的内容加载到模块中。例如:

?- fb:consult(foobar).
true

然后致电:

?- fb:listing.

foo(bar).
foo(baz).

frobozz.
true.

或仅列出特定谓词:

?- fb:listing(foo/1).
foo(bar).
foo(baz).

true.