假设我的文件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).
仅在consult(externalFile).
main.pl
时无效。否则,consult(externalFile).
在终端会话中成功导入文件。
那么如何编写源代码而不必将整个程序复制并粘贴到终端(或者只是让我的所有程序源代码的文件大小都超过15个MEGA字节的手册内容!)终端是唯一可以使用导入命令的地方吗?
注意:我还检查了行分隔符编码(dos vs windows)(这是另一个问题的答案)
注意:直接在main.pl中定义的独立子句正常工作
答案 0 :(得分:3)
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).
只有在没有效果的时候consult(externalFile).
位于main.pl
。
当你将consult(externalFile).
单独放在一行中你所咨询的文件(如main.pl
)时,你告诉Prolog你想断言这个术语(在这种情况下是事实),{ {1}}由仿函数consult(externalFile)
组成,并且有一个原子参数consult
。所以它实际上做了做某事,而不是你所期待的。