Как использовать read_line_to_codes & atom_codes для создания массива строк в виде строк моего файла .txt? - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь использовать read_line_to_codes(Stream,Result) и atom_codes(String,Result).Сначала эти два предиката читают строку из файла как массив кодов символов, а затем преобразуют этот массив обратно в строку.Затем я хотел бы ввести все эти строки в массив строк.

Я попробовал рекурсивный подход, но у меня возникли проблемы с тем, как на самом деле создать экземпляр массива для очистки в начале, и каково будет условие завершения process_the_stream/2.

/*The code which doesn't work.. but the idea is obvious.*/

process_the_stream(Stream,end_of_file):-!.
process_the_stream(Stream,ResultArray):-
        read_line_to_codes(Stream,CodeLine),
        atom_codes(LineAsString,CodeLine),
        append_to_end_of_list(LineAsString,ResultArray,TempList),
        process_the_stream(Stream,TempList).

Я ожидаюрекурсивный подход для получения массива строк в виде строк.

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Используется решение portable на основе Logtalk, которое вы можете использовать как есть с большинством компиляторов Prolog, включая GNU Prolog, или адаптировать под свой собственный код:

---- processor.lgt ----
:- object(processor).

    :- public(read_file_to_lines/2).

    :- uses(reader, [line_to_codes/2]).

    read_file_to_lines(File, Lines) :-
        open(File, read, Stream),
        line_to_codes(Stream, Codes),
        read_file_to_lines(Codes, Stream, Lines).

    read_file_to_lines(end_of_file, Stream, []) :-
        !,
        close(Stream).
    read_file_to_lines(Codes, Stream, [Line| Lines]) :-
        atom_codes(Line, Codes),
        line_to_codes(Stream, NextCodes),
        read_file_to_lines(NextCodes, Stream, Lines).

:- end_object.
-----------------------

Пример файла для тестирования:

------ file.txt -------
abc def ghi
jlk mno pqr
-----------------------

Простой тест:

$ gplgt
...

| ?- {library(reader_loader), processor}.
...

| ?- processor::read_file_to_lines('file.txt', Lines).

Lines = ['abc def ghi','jlk mno pqr']

yes
0 голосов
/ 27 марта 2019

Я чувствую большую путаницу в этом вопросе.

  • Вопрос помечен как "gnu-prolog", но read_line_to_codes/2 отсутствует в его стандартной библиотеке.
  • Вы говорите о строках: что вы имеете в виду? Можете ли вы показать, какой из предикатов тестирования типов в GNU-Prolog или, может быть, в SWI-Prolog должен преуспеть на этих «строках»?
  • Вы ожидаете рекурсивного подхода. Что это значит? Вы хотите рекурсивный подход, вы должны использовать рекурсивный подход, или вы думаете, что, если вы это сделаете, вы в конечном итоге получите рекурсивный подход?

Сделать это в SWI-Prolog без рекурсии и получить строк :

read_string(Stream, _, Str), split_string(Str, "\n", "\n", Lines)

Если вам нужно что-то еще, вам нужно лучше объяснить, что это такое.

...