无法访问Prolog中的文件,始终读取end_of_file原子

时间:2013-04-18 08:42:30

标签: prolog

我正在使用SWI Prolog学习Prolog,我发现在阅读和写入文件的操作方面存在一些困难。

我有这个简单的程序,它从标准输入(键盘)中读取内容并将其写在文件中:

processFile(File) :- see(File),
                 processFile,
                 seen.

processFile :- read(Query),
               process(Query).

process(end_of_file) :- !.

process(Query) :- Query,
                  write(Query),
              nl,
              processFile.

我正在尝试在Linux下执行它。所以在bash中我进入Prolog源文件和 myFile 文件所在的文件夹,之后我查阅了该程序,执行以下语句:

?- processFile(myFile).
true.

正如你所看到的那样,探测器是真的,但是我无法通过键盘插入任何东西,所以任何东西都可以写入 myFile 文件。

如果我试图追踪发生的情况,我会获得以下信息:

[trace]  ?- processFile(myFile).
   Call: (6) processFile(myFile) ? creep
   Call: (7) see(myFile) ? creep
   Exit: (7) see(myFile) ? creep
   Call: (7) processFile ? creep
   Call: (8) read(_G697) ? creep
   Exit: (8) read(end_of_file) ? creep
   Call: (8) process(end_of_file) ? creep
   Exit: (8) process(end_of_file) ? creep
   Exit: (7) processFile ? creep
   Call: (7) seen ? creep
   Exit: (7) seen ? creep
   Exit: (6) processFile(myFile) ? creep
true.

正如您所看到的,它可以访问 myFile 文件,并正确地询问包含读取声明的 processFile 谓词,但似乎是自动的阅读 end_of_file 原子,无法继续。

为什么呢?我该怎么做才能解决它并写入这个文件?

1 个答案:

答案 0 :(得分:0)

你必须在文件中使用tell / 1来,然后告诉他们恢复到之前的状态。使用see / 1,你从读取,它是空的......

但ISO IO更好......