使用prolog将文本文件转换为列表。使用split_string谓词

时间:2019-04-02 00:39:23

标签: prolog swi-prolog

我正在尝试使用split_string / 4谓词将字符串转换为字符串列表。我想用每个换行符分隔字符串。这是我的代码的样子

main(Argv) :-
   [InputFilename|OutputFileName] = Argv,
   read_file_to_string(InputFilename, InputFileString,[]),
   split_string(InputFileString,"\n", "\n", InputFileList),
   write(InputFileList).

但是它没有向控制台写入任何内容。但是,如果我放

write(InputFileString)

它可以很好地打印文件的内容。我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

main(Input_filename,Output_filename) :-
   read_file_to_string(Input_filename, Input_string,[]),
   split_string(Input_string,"\n", "\n", Input_list),
   write(Input_list).

示例输入文件C:/input_data.txt

Line one
Line two
Line three

示例运行

?- main('C:/input_data.txt','C:/output_data.txt').
[Line one,Line two,Line three]
true.

您在|中使用[InputFilename|OutputFileName]是为了分隔列表的开头和结尾。只需使用,传递两个参数的简单更改即可,例如main(Input_filename,Output_filename)

此答案还将变量名的样式更改为snake case,这是Prolog惯用的。

答案 1 :(得分:0)

如果您的Argv是包含两个或多个元素的列表,则它不会[InputFilename|OutputFileName]统一,因为这不是包含两个元素的列表。

请参阅:

$ swipl -q
?- [a,b] = [X|Y].
X = a,
Y = [b].

?- [a,b] = [X|Y], X = a, Y = b.
false.

如果您知道列表中只有2个元素,则可以使用[X, Y]。如果列表中可以包含2个或更多元素,则可以使用[X, Y|_]。在这里:

?- [X,Y] = [a,b].
X = a,
Y = b.

?- [X,Y] = [a,b,c].
false.

?- [X,Y|_] = [a,b].
X = a,
Y = b.

?- [X,Y|_] = [a,b,c].
X = a,
Y = b.

?- [X,Y|_] = [a].
false.