0

我正在使用 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文件,并正确询问包含read语句的processFile谓词,但似乎自动读取end_of_file原子并且无法继续。

为什么?我能做些什么来解决它并写入这个文件?

4

1 回答 1

0

您必须使用 tell/1写入文件,然后告诉恢复到以前的。使用 see/1 你正在阅读它,它是空的......

但是 ISO IO 更好...

于 2013-04-18T09:09:11.507 回答