为什么prolog被我的输入文件搞糊涂了

时间:2014-04-24 22:48:38

标签: prolog

我正在使用

将列表列表写入文件
choice(2, X):- 
  nl, write('\tRead roster from a file:'),nl, write('\tEnter file name: '),read(N),
  open(N,write,Stream), write(Stream, X), nl(Stream),close(Stream), write('\tRoster stored.'),nl,nl,menu(X).

然后我用

读它
choice(1, X):- 
  nl, write('\tStore roster to a file:'),nl, write('\tEnter file name: '),read(N),
  open(N,read,Stream), read(Stream, Y), close(Stream), write('\tRoster stored.'),nl,nl,menu(Y).

这是我选择(1,X)时选择的样本(2,X)的内容。

[[[49,48,48],[100,97,109,105,101,110],100]]

当我尝试阅读时会出现错误

ERROR: r2:1:44: Syntax error: Unexpected end of file

2 个答案:

答案 0 :(得分:3)

您收到此错误,因为read/2只能读取以.终止的完整序言。您的文件内容不会以点结尾,因此文件结尾为"意外"。

我的建议是你应该修改它:

open(N,read,Stream), read(Stream, Y), close(Stream)

进入那个:

open(N,read,Stream), read_line_to_codes(Stream, Codes), close(Stream), atom_codes(Atom, Codes), atom_to_term(Atom, Y, [])

上面的代码读取一行字符数据,将其转换为atom,然后将其转换为与Y统一的prolog术语。

这是我从解释器输入和输出以证明它有效:

?- open('test2.txt',read,Stream), read_line_to_codes(Stream, Codes), close(Stream), atom_codes(Atom, Codes), atom_to_term(Atom, List, []).

List = [[[49, 48, 48], [100, 97, 109, 105, 101, 110], 100]].

档案test2.txt的内容:[[[49,48,48],[100,97,109,105,101,110],100]]

(最后没有点)

答案 1 :(得分:3)

正如@Grzegorz正确地说的那样,为了能够阅读read的术语,它需要以句号结束。

但我不认为解决问题的正确方法是将其作为代码阅读。我认为更好的方法就是为文件写一个句号。

我认为推荐的方法是使用write_term fullstop(true)选项代替write。但这不适用于我的SWI-Prolog版本。

最简单的方法就是使用write(Stream, '.')明确写出句号。