如何在列表列表中转换整数文件

时间:2013-04-23 22:36:26

标签: prolog swi-prolog

我有一个文件如下(数字用空格分隔,行以点结尾):

4554 3332 3 23 344.     
4 2 3 5 7 86 56.     
7 8 1 4 66.

我想创建一个列表列表,每行一个列表如下:

[[4554,3332,3,23,344],[4,2,3,5,7,86,56],[7,8,1,4,66]]

我该怎么办? 非常感谢你

1 个答案:

答案 0 :(得分:3)

我建议使用明确的子句语法(DCG)和DCG /基础库,如下所示:

:- use_module(library(dcg/basics)).
:- use_module(library(pio)).

number_line([]) --> ".".
number_line([N|Ns]) --> integer(N), whites, number_line(Ns).

file([Line|Lines]) --> number_line(Line), blanks, file(Lines).
file([]) --> [].

然后你可以用一个简单的谓词一次解析整个文件:

parse_integer_file(File, Lists) :-
    phrase_from_file(file(Lists), File).

使用file.txt中的示例数据尝试:

?- parse_integer_file('input.txt', R).
R = [[4554, 3332, 3, 23, 344], [4, 2, 3, 5, 7, 86, 56], [7, 8, 1, 4, 66]] .

这种方法有几个优点:

  • 图书馆DCG规则经过实战测试并正常工作
  • 因此,这种语法已经具有抵抗额外空格和额外空白线的能力
  • 代码比相应的手动输入/输出和分割
  • 更简单,更易于阅读
  • 提供parse_from_file/2的纯I / O工具效率很高