运行文件而不是交互式运行时,无权修改静态过程“ findall / 3”

时间:2019-05-08 21:03:28

标签: prolog

.pl文件中确实有一些“数据库”:

exotic(1, 1).
exotic(2, 1).
exotic(3, 1).
exotic(4, 1).
exotic(5, 0).
exotic(6, 0).

我正在交互式运行(加载文件后从终端运行):

findall(X, exotic(X,1), L).

它可以正常工作,L可以按预期填充[1,2,3,4]。

但是当我将这个 findall 放入文件中并且正在运行文件时,出现了错误:“没有权限修改静态过程'findall / 3'”。

是什么原因造成的,以及如何将其放置在文件中以访问列表L?

1 个答案:

答案 0 :(得分:0)

如果要从源文件进行查询,则标准解决方案是使用initialization/1伪指令。例如:

:- initialization((
    findall(X, exotic(X,1), L),
    write(L), nl
)).

您不能简单地在源文件中写子句,例如:

findall(X, exotic(X,1), L).

这意味着(尝试)重新定义标准的内置谓词,大多数Prolog系统不允许这样做,因此会出现错误。