swi-prolog 不能包含外部文件?

swi-prolog can't include external file?

假设我有一个包含以下内容的文件main.pl

/* I tried these one at a time, not all at once... */
[externalFile].
['externalFile'].
['externalFile.pl'].
['./externalFile.pl']./*this was an answer to a similar SO question*/
consult(externalFile).
/*... etc ...*/

现在让我们使用它...

$ swipl -l externalFile.pl
/* 12 second loading delay */
/* everything works perfect! */
$ swipl -l main.pl
/* 0 second loading delay */
/* let's try anything from externalFile... */
ERROR: toplevel: Undefined procedure: [...]
/* main.pl might as well be empty */
?- consult(externalFile).
/* 0 second loading delay */
true.
/* true? oh my bad! Lets try again... */
ERROR: toplevel: Undefined procedure: [...]
?- [externalFile].
/* 12 second loading delay... seems better... */
true.
/* been lied to before... */
/* and yet every thing works perfect now! */

注意:只有当consult(externalFile).main.pl时,consult(externalFile).才有效。否则,consult(externalFile). 会在终端会话中成功导入文件。

那么我如何编写源代码而不必将我的整个程序复制并粘贴到终端(或者只是让我所有的程序源代码的文件大小超过 15+ 兆字节,值得手动包含!)如果终端是唯一可以使用导入命令的地方?


注意:我还检查了行分隔符编码(dos vs windows)(这是另一个问题的答案)

注意:直接在 main.pl 中定义的独立子句工作正常

consult 等操作在 Prolog 中称为 指令 。 Prolog 指令 被 Prolog 识别的方式不同,具体取决于您是使用交互式环境,还是从 Prolog 源文件执行指令。

在交互式环境中,只需在 ?- 提示符下输入一个指令:

?- consult('myfile').

当您查阅文件时,Prolog 将该文件视为一系列事实和规则断言。但是,如果 Prolog 看到 :- 运算符,它会将该行视为文件中的指令。因此,从文件中,您必须使用该运算符:

:- consult('myfile').

方括号 []consult() 的简写形式。您正在为 Prolog 提供要查阅的文件列表。以上相当于:

?- [myfile].

:- [myfile].

也有不同的形式是可以接受的。 consult 参数必须是一个原子。如果你有一个名为myfile.pl的文件,可以这样查阅:

:- [myfile].
:- ['myfile'].
:- ['myfile.pl'].

同样地:

:- consult(myfile).
:- consult('myfile').
:- consult('myfile.pl').

consult(myfile.pl)[myfile.pl] 将导致错误,因为没有引号,myfile.pl 将不会被视为单个原子。

咨询的列表([])形式将接受多个文件:

:- [myfile, anotherfile].

解决您的评论:

consult(externalFile). only has no effect when consult(externalFile). is in main.pl.

当您将 consult(externalFile). 放在您查阅的文件(如 main.pl)中单独一行时,您是在告诉 Prolog 您希望断言该术语(在本例中为事实) , consult(externalFile) 由函子 consult 组成并有一个原子参数 externalFile。所以它实际上确实做了一些事情,只是不是你所期望的。