2014-01-31 4 views
1

У меня нет большого опыта в Прологе.Список Чтения из файла

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. Сохраните его в файл.

В результате я получаю в файле следующее:

[[x, y], end_of_file].

Результат должен быть:

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

Я не знаю, почему, но Prolog читать текст end_of_file в L вместо списка, который хранится в файле.

Что случилось?

+0

Вы должны показать, как выглядит содержимое вашего тестового файла 'telefon_375319.txt', прежде чем запускать тест выше. – lurker

+0

Итак, что случилось с этим? Любое разрешение? – lurker

ответ

0

end_of_file не является текстом. Это атом, и он читается, когда файл заканчивается. Но в моем SWI Prolog я вижу, что пустую строку мне нужно разместить в конце файла, чтобы прочитать ее правильно. Поиск соответствующей информации по этому вопросу.

+0

Поиск не удалось. При чтении файла '[hello].\ n', читается только 'end_of_file'. При чтении '[hello]. \ N \ n',' [hello] 'читается (и' end_of_file' после этого). – Palec

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]]. 

Другие, чем два изменения, которые я сделал, которые я упоминал выше, я не вижу ничего плохого в предиката на основе описанное желаемое поведение. Я запускал это на GNU Prolog и SWI Prolog в Linux и SWI Prolog на Windows 7, и он работал, как ожидалось, во всех случаях. Текстовый файл заканчивается на одном \n в случае Linux и \r\n в случае Windows.

Смежные вопросы