Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何读取创建列表的文件_List_Prolog - Fatal编程技术网

List 如何读取创建列表的文件

List 如何读取创建列表的文件,list,prolog,List,Prolog,我有一些代码,如下所示: main :- open('input.txt', read, Input), repeat, read_line_to_codes(Input, Line), maplist(my_representation, Line, FinalLine), ( Line \= end_of_file -> writeln(FinalLine), fail ; true ), close(Input). FinalLine

我有一些代码,如下所示:

main :-
    open('input.txt', read, Input),
    repeat,
    read_line_to_codes(Input, Line),
    maplist(my_representation, Line, FinalLine),
    ( Line \= end_of_file -> writeln(FinalLine), fail ; true ),
    close(Input).
FinalLine
是一个整数列表,包括一些下划线(基于输入文件)。由于这个循环,我想知道如何在循环的每次迭代中动态地将
FinalLine
列表添加到另一个列表中。基本上,这将创建一个列表列表

因为我知道输入文件的规格,我知道它循环了16次,所以我想要一个包含16个列表的列表。因此,尽管我不知道如何做到这一点,但我确信最好的方法是创建一个我调用的谓词,而不是我现在正在做的输出(
writeln(FinalLine)
),以动态创建这个列表


希望这是有意义的。非常感谢您的帮助,谢谢

虽然历史上Prolog中的I/O通常以
重复
/
失败
循环的形式出现,但递归通常(几乎总是?)是实现迭代的最佳方式。尤其是当你需要记住从一个迭代到下一个迭代的数据时;失败会导致回溯,这会从以前计算的数据中解除变量的绑定。回溯时,您将丢失使用更不纯净的结构保存的所有数据。递归更简单

递归迫使您将程序分解为多个谓词,但无论如何,这是一个好主意。例如,将打开流与读取流分离可以使您的程序更加可重用和可测试,因为流可能是由文件以外的内容构建的

% dummy
my_representation(Codes, Result) :-
    atom_codes(Result, Codes).

stream_representations(Input, Lines) :-
    read_line_to_codes(Input, Line),
    (   Line == end_of_file
    ->  Lines = []
    ;   my_representation(Line, FinalLine),
        Lines = [FinalLine | FurtherLines],
        stream_representations(Input, FurtherLines) ).

main :-
    open('input.txt', read, Input),
    stream_representations(Input, Lines),
    close(Input),
    writeln(Lines).
测试输入文件:

hello
world
hello, world!
this file ends here
试运行:

?- main.
[hello,world,hello, world!,this file ends here]
true.

二维列表是一个矩阵,在您的头脑中可视化它的最简单方法是一个由行和列组成的表。下面是一段示例代码来阐明这个概念

此代码根据您希望作为
MaxX
的最大列数和您希望作为
MaxY
的最大行数生成矩阵。矩阵中的每个位置都有一个
单元(点(X,Y))
坐标,以便更容易地可视化输出

%If the MaxY has been reached for the Y axis, step back
generate_matrix([],_,_,MaxY,MaxY) :- !.
%If MaxX has been reached, new row
generate_matrix([Row|Tp],X,MaxX,Y,MaxY):-
    generate_row(Row, X, MaxX, Y),
    Y1 is Y+1,
    generate_matrix(Tp,0,MaxX,Y1,MaxY).

%If the MaxX has been reached for the X axis, step back
generate_row([], MaxX,MaxX,_) :- !.
generate_row([cell(point(X,Y))|T], X, MaxX, Y) :-
    XNew is X + 1,
    generate_row(T, XNew, MaxX, Y).
您可以轻松地将
单元格(点(X,Y)
替换为您想要放置的内容。我希望这能为您澄清概念,如果不清楚,请务必要求澄清

Testquery生成10×10矩阵/网格/表格/二维列表:

%generate_matrix(Matrix, 0, MaxX, 0, MaxY)
generate_matrix(Matrix, 0, 10, 0, 10).

你可以添加尺寸来表示更复杂的结构。添加Z轴可以得到一个3D立方体。

这个问题是关于从输入中读取数据并存储在列表中的,你所回答的是关于矩阵、点等的完全不同的东西。我想你可能会用另一个问题把它搞乱了???(p.s:我没有投你反对票)@coder-问题的标题字面上是“动态创建列表”,填写列表的数据来自何处真的很重要吗?问题的标题选择得很糟糕。“列表”部分原因在于OP希望计算文件每行的一个结果列表;但问题真正在于如何计算文件每行的一些结果。请注意,事实上,接受的答案并不是创建列表列表,而是创建原子列表。是的,因为OP描述了一个非常具体的情况,其中需要it’帮助创建列表,你的答案就像回答一个不同的问题,但是使用/创建列表,这一点都没有帮助。当我最初看到你的答案时,我认为它是在回答另一个答案,无论如何,这是我的意见(正如我所说,我没有投反对票,但我认为它没有帮助)@编码器-我不同意,人们会发现这个问题是关于动态创建列表来表示复杂的数据结构。使用什么样的inputstream来填充列表是不相关的,因为动态创建列表是关于列表,而不是创建内容。我甚至会说递归允许Prolog在一次解决一个问题的一部分,直到它得出结论。每个单独的规则都只是一条通向结束条件的路径,之后它会沿着堆栈返回到原始调用方并给出答案。当然,对于一个或多个解决方案,答案可以是“否”,也可以是“是”。