使用prolog将文本文件转换为列表。使用split_字符串谓词

使用prolog将文本文件转换为列表。使用split_字符串谓词,prolog,swi-prolog,Prolog,Swi Prolog,我试图使用split_string/4谓词将字符串转换为字符串列表。我希望字符串由每个换行符分隔。这就是我的代码的样子 main(Argv) :- [InputFilename|OutputFileName] = Argv, read_file_to_string(InputFilename, InputFileString,[]), split_string(InputFileString,"\n", "\n", InputFileList), write(InputF

我试图使用split_string/4谓词将字符串转换为字符串列表。我希望字符串由每个换行符分隔。这就是我的代码的样子

main(Argv) :-
   [InputFilename|OutputFileName] = Argv,
   read_file_to_string(InputFilename, InputFileString,[]),
   split_string(InputFileString,"\n", "\n", InputFileList),
   write(InputFileList).
但它并没有向控制台写入任何内容。但是如果我把

write(InputFileString)
它可以很好地打印文件的内容。我做错了什么

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(输入文件名,输出文件名)


这个答案也改变了Prolog中常用的变量名样式。

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

见:

如果您知道列表中正好有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.
?- [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.