在SWI Prolog中打开vs咨询

在SWI Prolog中打开vs咨询,prolog,Prolog,我对Prolog还不熟悉,请别烦我 每当我必须查阅prolog数据库时,我都使用谓词consult/1: consult(:File) 现在,我注意到还存在谓词open open(+SrcDest, +Mode, --Stream, +Options) 它允许读取数据库。 除了修改数据库的可能性(consult不允许),consult和open之间的区别是什么(可能是每个谓词可以打开的文件扩展名,或者可能是因为consult读取事实和规则,而open可以读取术语) 使用consult/1似乎

我对Prolog还不熟悉,请别烦我

每当我必须查阅prolog数据库时,我都使用谓词consult/1:

consult(:File)
现在,我注意到还存在谓词open

open(+SrcDest, +Mode, --Stream, +Options)
它允许读取数据库。
除了修改数据库的可能性(consult不允许),consult和open之间的区别是什么(可能是每个谓词可以打开的文件扩展名,或者可能是因为consult读取事实和规则,而open可以读取术语)

使用
consult/1
似乎与使用
?-[filename]
非常相似。在程序中使用
consult/1
,可以访问写入文件的所有事实和谓词。例如,如果您有一个像这样的文件
data.pl

fact(a).
fact(b).
fact(c).

hello:-
    writeln('hello').
您可以创建一个文件,
test.pl
,并使用
data.pl
的所有事实和谓词:

run:-
    consult(prova),
    findall(A,fact(A),L),
    hello,
    writeln(L).

?- run.
hello
[a,b,c]
true.
此外,consult似乎只接受具有字典结构的
.pl
文件。另一方面,使用
open/3
,您可以访问每种类型的文件,也可以逐字符读取,但无法访问写入文件的谓词和事实:

run:-
    open('prova.pl',read,Str),
    findall(A,fact(A),L),
    hello,
    writeln(L).

?- run.
ERROR: Undefined procedure: fact/1

显然,使用
open/3
open/4
可以创建、写入文件等。

注意事实和规则(以及指令)是术语。
consult
断言文件的内容
open
没有。但是,为什么事实和规则也被用作谓词?我不确定我是否理解你的问题。这与你在帖子中的要求不同。Prolog中的谓词是一组具有相同名称的事实和规则。@Koinos Prolog不关心您使用的文件扩展名,只要您指定它。
.pl
扩展名是Prolog源文件的常用扩展名,您只需使用
[foo]
即可查阅
foo.pl
。但是如果你有
foo.dat
,你可以咨询
['foo.dat']