我试图使用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(Input_filename,Output_filename)
这个答案也改变了变量名的作风, 蛇的情况下这是习惯用Prolog的。
如果你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.
文章来源: Turning a text file into a list using prolog. Using the split_string predicate