Запись в файл (Пролог) - PullRequest
       1

Запись в файл (Пролог)

6 голосов
/ 28 ноября 2011

Я пытался перебрать список и записать его в файл, почему не работает следующее?

loop_through_list(List) :-
    member(Element, List),
    write(Element),
    write(' '),
    fail.   

write_list_to_file(Filename,List) :-
    tell(Filename),     % open file to be written 
    loop_through_list(List),
    told.               % flush buffer

Ответы [ 3 ]

7 голосов
/ 28 ноября 2011

Во-первых, почему это не получается:
Вы используете провал, чтобы спровоцировать возврат, что может быть хорошей техникой, но не там.Потому что это сделает ваш предикат ложным в конце, когда у участника закончились решения.Затем, когда loop_through_list имеет значение false, сказанное не достигнуто, и запись не выполнена должным образом (когда я проверяю его, файл создается, но ничего не пишется).
Если вы используете:

loop_through_list([]).
loop_through_list([Head|Tail]) :-
    write(Head),
    write(' '),
    loop_through_list(Tail).

вместо этого, это работает.

Но, даже если этот код работает, вы можете использовать open (Filename, write, Stream), write (Stream, Element) и close (Stream) вместо сказать ирассказано по причинам, указанным в ссылке внизу этого ответа.
Например:

loop_through_list(_File, []) :- !.
loop_through_list(File, [Head|Tail]) :-
    write(File, Head),
    write(File, ' '),
    loop_through_list(File, Tail).

write_list_to_file(Filename,List) :-
    open(Filename, write, File),
    loop_through_list(File, List),
    close(File).

или

loop_through_list(File, List) :-
    member(Element, List),
    write(File, Element),
    write(File, ' '),
    fail.

write_list_to_file(Filename,List) :-
    open(Filename, write, File),
    \+ loop_through_list(File, List),
    close(File).

, используя ваш код и трюк joel76.

См. Пролог, как сохранить файл в существующем файле
Это относится к тому же вопросу.

3 голосов
/ 28 ноября 2011

Я не вижу причины использовать этот метод для записи списка в файл.
Программирование в прологе обычно не должно включать циклы;
кроме того, это не структура цикла, это больше похоже навзломать (или даже оскорбить).
(и точно так же, как ваш случай приводит к неожиданным ошибкам и проблемам)

Просто используйте рекурсию и распечатайте элементы списка:

write_list([]).
write_list([H|T]):-
    write(H),
    write('  '),
    write_list(T).

большеэлегантный и может быть более эффективным.

кроме этого, лучше использовать open / 4 и т. д. (ISO IO) вместо Tell / 1 и т. д. (Edinburgh IO);проверить пост ложь

2 голосов
/ 28 ноября 2011

предикат loop_through_list (список), всегда терпит неудачу, поэтому для успеха вам просто нужно написать \ + loop_through_list (список),

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...