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
- 你谈论字符串:你是什么意思?你能证明哪一个,或者说哪一个应该在这些“字符串”上成功吗
- 您希望使用递归方法。这是什么意思?你想要一个递归的方法,你必须使用一个递归的方法,或者你认为如果你这样做了,你会得到一个递归的方法
如果你需要其他东西,你需要更好地解释它是什么。我觉得这个问题有很多困惑
- 问题被标记为“gnu prolog”,但标准库中没有
read\u line\u to\u codes/2
- 你谈论字符串:你是什么意思?你能证明哪一个,或者说哪一个应该在这些“字符串”上成功吗
- 您希望使用递归方法。这是什么意思?你想要一个递归的方法,你必须使用一个递归的方法,或者你认为如果你这样做了,你会得到一个递归的方法
如果你需要其他东西,你需要更好地解释它是什么。一般来说,要求做这类事情的人会觉得下一步(处理一大串字符串,也许解析它们)会很容易,但通常使用s来重新描述整个解析问题会更容易。@DanielLyons。。。有时候你只需要一个字符串行列表。视情况而定。我确实需要一个字符串列表。我用同样的方法用另外两种语言解决了这个问题,现在我试着用prolog来做。一般来说,要求做这类事情的人都觉得下一步(处理一大串字符串,也许解析它们)会很容易,但通常用s来重新描述整个解析问题更容易。@DanielLyons。。。有时候你只需要一个字符串行列表。视情况而定。我确实需要一个字符串列表。我用同样的方法用另外两种语言解决了这个问题,现在我试着用prolog。