Prolog 如何使用read_line_to_代码&;atom_迭代编码以生成作为my.txt文件字符串的行数组?

Prolog 如何使用read_line_to_代码&;atom_迭代编码以生成作为my.txt文件字符串的行数组?,prolog,gnu-prolog,Prolog,Gnu Prolog,我正在尝试使用读取行到行代码(流、结果)和原子代码(字符串、结果)。这两个谓词首先将文件中的行作为字符代码数组读取,然后将该数组转换回字符串。然后我想将所有这些字符串输入到字符串数组中 我尝试了递归方法,但在如何在开始时将数组实例化为空以及进程\u流/2的终止条件方面遇到了问题 /*The code which doesn't work.. but the idea is obvious.*/ process_the_stream(Stream,end_of_file):-!. process

我正在尝试使用
读取行到行代码(流、结果)
原子代码(字符串、结果)
。这两个谓词首先将文件中的行作为字符代码数组读取,然后将该数组转换回字符串。然后我想将所有这些字符串输入到字符串数组中

我尝试了递归方法,但在如何在开始时将数组实例化为空以及
进程\u流/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).

我希望使用递归方法将行数组作为字符串。

遵循基于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

遵循基于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

在这个问题上我感到很困惑

  • 问题被标记为“gnu prolog”,但标准库中没有
    read\u line\u to\u codes/2
  • 你谈论字符串:你是什么意思?你能证明哪一个,或者说哪一个应该在这些“字符串”上成功吗
  • 您希望使用递归方法。这是什么意思?你想要一个递归的方法,你必须使用一个递归的方法,或者你认为如果你这样做了,你会得到一个递归的方法
要在SWI Prolog中执行此操作而无需递归,并获取字符串:


如果你需要其他东西,你需要更好地解释它是什么。

我觉得这个问题有很多困惑

  • 问题被标记为“gnu prolog”,但标准库中没有
    read\u line\u to\u codes/2
  • 你谈论字符串:你是什么意思?你能证明哪一个,或者说哪一个应该在这些“字符串”上成功吗
  • 您希望使用递归方法。这是什么意思?你想要一个递归的方法,你必须使用一个递归的方法,或者你认为如果你这样做了,你会得到一个递归的方法
要在SWI Prolog中执行此操作而无需递归,并获取字符串:


如果你需要其他东西,你需要更好地解释它是什么。

一般来说,要求做这类事情的人会觉得下一步(处理一大串字符串,也许解析它们)会很容易,但通常使用s来重新描述整个解析问题会更容易。@DanielLyons。。。有时候你只需要一个字符串行列表。视情况而定。我确实需要一个字符串列表。我用同样的方法用另外两种语言解决了这个问题,现在我试着用prolog来做。一般来说,要求做这类事情的人都觉得下一步(处理一大串字符串,也许解析它们)会很容易,但通常用s来重新描述整个解析问题更容易。@DanielLyons。。。有时候你只需要一个字符串行列表。视情况而定。我确实需要一个字符串列表。我用同样的方法用另外两种语言解决了这个问题,现在我试着用prolog。