swi prolog can';不包括外部文件?

swi prolog can';不包括外部文件?,prolog,swi-prolog,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 ...*/ 现在让我们使用它

假设我有一个包含以下内容的文件
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兆字节以上的文件大小,相当于手动包含的文件大小!)


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


注:直接在main.pl work fine中定义的独立子句

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

在交互式环境中,只需在
?-
提示符处键入指令:

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

:- consult('myfile').
括号
[]
consult()
的缩写。您正在为Prolog提供一个要查阅的文件列表。上述情况相当于:

?- [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)。
位于
main.pl


当您将
consult(externalFile)
放在您所查阅的文件(如
main.pl
)中的一行上时,您告诉Prolog您希望断言术语(在本例中是事实),
consult(externalFile)
,它由functor
consult
组成,并且有一个原子参数,
externalFile
。因此,它确实做了一些事情,只是没有达到您的预期。

请参阅:您应该查看Prolog文档<代码>[]在此上下文中与
consult()
相同。这些是指令。指令要求
:-
。因此,例如,
:-[externalFile]。
:-consult(externalFile)。
@潜伏者为什么不作为答案来写,似乎足够完整并且非常有用:)?
:- [myfile, anotherfile].