从文件中读取列表

时间:2014-01-31 17:36:25

标签: list file prolog

我在Prolog方面没有多少经验。

add(first, second) :-
    see('telefon_375319.txt'),
    read(L),
    seen,
    M = [[first, second] | L],
    tell('telefon_375319.txt'),
    write(M),
    nl,
    told.

上述代码的目的是:

  1. 从文件中读取列表(列表中的列表)(到L)。
  2. 在列表的开头添加列表[第一个,第二个](可能在结尾或甚至在中间)。
  3. 将其保存到文件中。
  4. 我在文件中得到的结果如下:

    [[x, y], end_of_file].

    结果应为:

    [[x, y], and here should be the rest of the list].

    我不知道为什么,但是Prolog将文本end_of_file读入L而不是存储在文件中的列表。

    怎么了?

2 个答案:

答案 0 :(得分:0)

end_of_file不是文字。它是原子,当文件结束时它被读取。但是在我的SWI Prolog中,我发现必须在文件末尾放置一个空行才能正确读取。搜索相关信息。

答案 1 :(得分:0)

我稍微修改了原来的变量,而不是原子。我还添加了一个句点(.),写在自read预期看到的列表之后:

add(First, Second) :-
    see('telefon_375319.txt'),
    read(L),
    seen,
    M = [[First, Second] | L],
    tell('telefon_375319.txt'),
    write(M), write('.'),
    nl,
    told.

telefon_375319.txt的内容:

[[a,b],[c,d]].

然后运行:

| ?- add(x, y).

yes

telefon_375319.txt的新内容:

[[x,y],[a,b],[c,d]].

执行命令

| ?- add(z, w).

telefon_375319.txt的新内容:

[[z,w],[x,y],[a,b],[c,d]].

除了我上面提到的两个变化之外,我没有看到基于所描述的期望行为的谓词有什么问题。我在Linux上运行GNU Prolog和SWI Prolog,在Windows 7上运行SWI Prolog,它在所有情况下都按预期工作。对于Linux,文本文件以单\n结尾,对于Windows,文本文件以\r\n结束。