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

时间:2017-09-19 08:21:17

标签: prolog swi-prolog

假设我的文件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中定义的独立子句正常工作

1 个答案:

答案 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。所以它实际上做了做某事,而不是你所期待的。