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
。所以它实际上确实做了一些事情,只是不是你所期望的。
假设我有一个包含以下内容的文件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 whenconsult(externalFile).
is inmain.pl
.
当您将 consult(externalFile).
放在您查阅的文件(如 main.pl
)中单独一行时,您是在告诉 Prolog 您希望断言该术语(在本例中为事实) , consult(externalFile)
由函子 consult
组成并有一个原子参数 externalFile
。所以它实际上确实做了一些事情,只是不是你所期望的。